LotusScriptでAPI連携してみた
ご無沙汰しております皆様、体調にお変わりないですかコロナの影響でまともに活動が出来ていない筆者です。やっとサッカーやフットサルを再開することができて、この一年で貯まった夢や脂肪を少しずつですが外に出していけるようになっていきました。Notes/Domino V11にバージョンアップしてからその恩恵を受けるアプリの開発がなかったのですがこの度、正式に依頼があり検証を行っておりました。皆様、トヨクモってご存知ですかトヨクモ株式会社「安否確認サービス」「kintone連携サービス」を提供しています。シンプルな機能と簡単な操作で、IT初心者の方にとっても安心して利用できるクラウドサービスを提供してまいります。toyokumo.co.jp安否確認サービス(?)で最近CMもやっているシステムですね。このトヨクモと人事システムの間を取り持つ中継としてNotesでDBを作りたいと思います。1)下調べトヨクモと連携するにはいくつかパターンがあります。・人事データをもらって決められたCSVを作成し、トヨクモにアップロードする・上記作業をRPAで行う・API連携する元々人力で行っていた作業なので、毎月1日に担当者がアップロードをしていました。(年末年始も出勤していたそうです)かかる時間はおおよそ5時間前後で、組織情報・従業員情報・役割設定などをCSVから丹念に作っていたそうです。さすがにこれはやりたくないですねRPAで同じことをやらせようとするとかかる時間はそんなに変わらないし、PCの電源入れっぱなしにしておかなければならない。誤って電源切ってしまったりLANケーブル抜かれたら動くものも動かないのでこれまた困ってしまいます。残された手段はAPIなのですが、担当者含めNotesがAPI連携出来ることを知らず。筆者に相談が来た時点で「Notesで出来ますよ」と回答し、早速モックを作ってあげることにしました。2)トヨクモAPIをググってみたAPI仕様が公開されていました。安否確認サービス2 API仕様anpi.toyokumo.co.jpGET、POST、PUT、DELETEと標準なものだったので、これはいけるな と確信が持てました。ただ1つだけ問題が・・・部署の更新です安否確認サービス2 API仕様anpi.toyokumo.co.jp以下、一部抜粋---処理概要 ¶ 1つのリクエストで部署全体を更新します。 部署が変更されない場合、304を返します。 リクエストにエラーがある場合、400を返します。使用方法 ¶リクエストボディのプロパティdepartmentは、次のようなオブジェクトの配列であり、 その1つ1つが部署を表します。{ "currentCode": "top", "code": "top", "name": "すべて", "parentCode": ""}それぞれのプロパティの意味は次の通りです。 currentCode: 現在存在する部署のコードを指定する。 code: 更新後の部署コードを指定する。 name: 更新後の部署名を指定する。 parentCode: 親部署コードを指定する。リクエストされたdepartmentプロパティ値から部署構造を構築し、 部署全体を構築された部署構造に置き換えます。入力にエラーがある場合、400が返却され、errorsプロパティにエラーの詳細が含まれます。次の方法に従い、リクエストされた各部署の追加・編集・削除が判別されます。 追加: currentCodeが空白のもの。 編集: currentCodeが入力されているもの。 削除: 現在存在する部署のうち、currentCodeに一致する部署が存在しないもの。※ 次の点にご注意ください。 最上位部署は必ず含める必要があります。 未所属ユーザ部署を含めてはいけません。-----リクエストされたdepartmentプロパティ値から部署構造を構築し、 部署全体を構築された部署構造に置き換えます。えっ組織情報を一気に書き換えるってことだから、Topから一番下の階層まで全部PUTするのテキストの限界値決まっているはずなので、リクエスト時も注意しないといけません・・・いけるのか、LotusScript3)モノは試しに書いて実行してみた Dim session As New NotesSession Dim webRequest As NotesHTTPRequest Dim returnVal As Variant Dim jsonBody As String Set webRequest = session.CreateHTTPRequest() Call webRequest.SetHeaderField("Content-Type","application/json") Call webRequest.SetHeaderField("Accept","application/json") Call webRequest.SetHeaderField("Authorization","Token *********") webRequest.Preferstrings = True jsonBody = |{"department": [{"currentCode": "top","code": "top","name": "最上位部署","parentCode": ""},| jsonBody = jsonBody & |{"currentCode": "","code": "11111","name": "〇〇本部","parentCode": "top"},| jsonBody = jsonBody & |{"currentCode": "","code": "21111","name": "aaaaa部","parentCode": "11111"},| jsonBody = jsonBody & |{"currentCode": "","code": "31111","name": "aaaaa部 zzzzz室","parentCode": "21111"},| jsonBody = jsonBody & |{"currentCode": "","code": "41111","name": "hogehoge","parentCode": "31111"},| jsonBody = jsonBody & |{"currentCode": "","code": "31112","name": "aaaaa部 bbbbb室","parentCode": "21111"},| jsonBody = jsonBody & |{"currentCode": "","code": "31113","name": "aaaaa部 ccccc室","parentCode": "21111"}]}| returnVal = webRequest.put("https://api.cloud.anpikakunin.com/v1/department",jsonBody) MsgBox returnVal実行してみたところ、うまくいきましたこれぐらいの部署の量であれば当然と言えば当然ですね。本番運用にあたりLogを作成するので、最後のreturnValの値は文書保存しておくように変更します。4)実際の部署数で試してみた人事データをCSVで取り込み、トヨクモAPIに連携しやすいように加工したのち、一気にPUTします。案の定、素敵なお知らせが表示されました最後のreturnValをフィールドに突っ込むときですかね。本番運用にあたり以下を変更しました。・変数jsonBodyをVariant型に変更・保存するLog文書のreturnValをセットするフィールドをリッチテキストに変更5)再トライ人事データ取り込み→加工→トヨクモAPIでリクエストを実行。Log文書にもJSONが正しく保存されトヨクモ側にも反映されましたHttpRequestってホント便利ですね次回は従業員登録の方法を試してみたいと思います以下、サンプル{ "username": "yamada", "password": "qawer@nasd", "fullname": "山田太郎", "fullnameRuby": "ヤマダ タロウ", "email": "test@example.com", "tel": "05038166666", "priority": 100, "memo": "APIから追加"}ユーザー登録って一人ずつなのか・・・本年も皆様には大変お世話になりました。来年もよろしくお願いいたしますではよいお年をあでゅー