見出し画像

kintone x WinActor API連携について

はい、RPACommunity ライトニングトーク支部主催のかーでぃです。
3月28日に、「kintone縛りのライトニングトーク大会」を開催します。

1月31日に開催されました、kintoneイベに続き、kintone絡みのイベントに登壇させて頂きます!

前回は、kintoneのデータをWinActorで取得するところまで実施しましたので、今回はデータ更新のところをお話しようと思っています。

また、次回WinActorトーク支部のイベントでは、LTの時間だけでは細かいところがお話できませんので、実際のシナリオの組み方等のお話をさせて頂こうと考えております。

ということで、イベントに先行しまして、kintoneのデータ更新シナリオの説明を、こちらでさせてもらおうと思います。

システム要件

このシナリオは、以下の仕様に沿っています。
1.Aシステムから取得したCSVデータはkintoneに取込み
2.Bシステムから取得したデータはローカルに保存
3.それぞれ統一コードで、一致するようになっている。

以下は、Aシステムからは、JANコードだけが取得し、kintoneに取り込んだ状態。グレード、スケール、名前、取説はBシステムのデータを使って更新する(今回、取説は対象外です)。

Bシステムからは、JANコード毎のフォルダが作成され、その中にPDFファイルやCSVファイルが生成されます。
今回は、CSVファイルの中にあるグレードやスケール、名前を取得し、kintone上の該当レコードを更新するシナリオになります。

以下は、取説以外の項目がすべて埋まっている状態で、グレード、スケール、名前をWinActorから更新したものです。
※本来は、PDFファイルを取説にUPしたいのですが、また次回。

ちなみに、BシステムのBとは…

でしたね(笑)

シナリオ全体像

ブロックは大きく以下の4つになります。
①初期設定&kintoneからデータ(JSON)取得
②取得した(JSON)データの分析
③ローカルファイルとのマッチング
④kintoneの更新

それでは、それぞれのブロックを詳しく見ていきましょう。

①初期設定&kintoneからデータ(JSON)取得

strAPITokenは、kintoneに問合せをするためのヘッダ情報設定しています。

{
    "Host":"hogehoge.cybozu.com",
    "Content-Type":"JSON",
    "X-Cybozu-API-Token":"hogehoge"
}

Hostのhogehogeは、サイボウズのURLになります。
👇こちらですね。

Content-Typeは、このままで大丈夫です。
API-Tokenは、以下から生成できますので、まだ生成されていない方は、生成をお願いします。詳しくはこちらをご参照ください。

次のintIxは、カウンタ変数を初期化しています。

このブロック最後は、HTTP(詳細)ライブライを使って、kintone上のデータをまるまる取得するAPIを叩きます。
設定している項目は、以下の3点

1.メソッド&URL
URLの末尾、records.jsonであること、注意してください。後述する更新の際は、record.jsonとなり”s"がある/なしでドハマリします(しました)。
app=?は、私の環境では2でした。
対象アプリのURLを見てください。末尾の数字が、appの番号になります。

https://d1tiiuu9c3eg.cybozu.com/k/2/

2.要求→ヘッダ
ここでは、ヘッダ情報を変数で指定します。
変数は、strAPITokenで先に設定した変数ですね。

3.応答→ボディ
ここでは、kintoneから取得した情報を格納する先を指定します。ファイルに保存することもできますが、ここでは変数strResponseに保存しています。

これで、kintoneからデータを取得し、変数strResponseに格納ができました。次は、この中身を分析していきます。

②取得した(JSON)データの分析

全部で6個の処理がありますので、1つずつ見ていきましょう。

1.strRec ← JSON
使用するライブラリは、02_JSON内にある「JSONオブジェクト 配列指定 値の取得」になります。

取得した件数分、下記のrecords配列が含まれていますので、それを1件づつ取り出して行きます。
保存先は、strRecになります。

https://cybozu.dev/ja/kintone/docs/rest-api/records/get-records/

2.strId ← strRec
これ以降は、各レコードの中から、必要な項目を変数に抜き取る処理になります。
strIdには、レコード番号を取得します。使用するライブラリは、02_JSON内にある「JSONオブジェクト 値の取得」になります。

3.strJanCode ← strRec
以下、同様に必要な項目を取得してきます。

4.strGrage ← strRec

5.strValue ← strRec

6.strFilePath ← 属性.csvのパス
最後、文字列結合を使って、Bシステムから出力された、各JANコード毎にフォルダ内に格納されたCSVファイルのパスを設定します。

次のブロックでは、このパスを使って、値を取得します。

③ローカルファイルとのマッチング

例外処理を入れ、フォルダやファイルが存在しない場合も、次のレコードに行くように処理しています(正しくは、この書き方では次のブロックでエラーになってしまいますが…)。

1.変数値 ← csvファイル
先ほど作成したstrFilePathを使って、CSVファイルを開きます。
使用ライブラリは、03_変数→01_CSVファイル読み込みにある「CSVファイル→変数値」を使います。

CSVファイルの中身は、以下のようになっております。1行目の項目名は、そのまま変数名になるため、行数は1を指定しています(実データとしての行数を指します)。
項目名が変数名になるのですが、新規で作られるわではないので、事前に変数は作成しておく必要があります。

GRAGE,SCALE,NAME,MANUAL
HG,1/144,アッシマー,892.pdf

④kintoneの更新

いよいよ、実際にkintoneにデータを書き戻す処理になります。
ここは、祝日をほぼ1日潰して頑張ったトコロ❣❣

APIリファレンスはこちらを参照してください。

ここ、めちゃくちゃ大事です。冒頭にも書きましたが、record.jsonです。
データを取得する際は、一度にデータを取得したので、records.jsonです。しかし、更新は1件ずつ処理していくことになるので、record.json(sがない)のです。
ここに気づくのに、4時間ぐらいかかりました(笑

何をやってもエラーが出てきてしまったので、気分転換にvbsで更新かけてみよう!と思い、ChatGPTにソースを吐き出させたら一発で更新が出来てしまいました(笑
あとは、VBSのソースとWinActorのシナリオの相違点を見つける作業。そして、私は気が付いたのです、「s」が無いことにwww

sを外したら、一発で動きましたw

ちょっと横道にそれますが、こーやってドツボにハマること、多々あります。すごく単純な見落としなのに、そこに気づかない/気づけない。
そんな時、ちょっと別の手段でやってみようと思うこと、大事です。
私の場合は、VBSでやってみたところ、あっという間に解決しました。

ここは個人的な想いですが…
1つの技術を深く掘り下げるのも大事だと思います。でも、広くいろんなことを知ることで、それが他の助けになることも、今回のようにあるわけです。
ITの世界は、どんどん広がっているので、1つの技術だけではなく、広い視野で見れるといいんじゃないかな、と改めて思いました。

さて、本題に戻ります。

1.strAPITokunPut
データ取得の際に使ったstrAPITokenとは若干内容が異なります。
Host項目が無くなったのと、Content-Typeがapplication/jsonに変わっています。

{
  "Content-Type":"application/json",
  "X-Cybozu-API-Token":"hogehoge"
}

2.strUpdateJSON ← TXTファイル

ここでは、更新するデータのテンプレをテキストファイルから読み取っています。

{
  "app": 2,
  "id": %fld001, 
  "record": {"ganpla_name": {"value": "%fld002"},
             "grade": {"value": "%fld003"},
             "scale": {"value": "%fld004"}
  }
}

appは冒頭で話したappと同じですね。idは、更新するレコード番号になります。以下、record内に更新する項目になります。
%fld00nは、次の項目以降で文字列置換します。

3.%fld00n ← ID、名前、グレード、スケール、jan_code

文字列置換で、テキストファイルから読み取った%fld00nを、各変数で置換して、更新用JSONに置き換えていきます。

4. kintone ← ローカルデータ
ライブラリは、取得と同じHTTP(詳細)ライブラリになります。
今回はデータの更新だけなので、実行後にJSONの解析等は必要ありません。

urlは、"s"の無いrecord.jsonを指定します。
間違っても、私のようにrecords.jsonを指定しないように…🙃
また、メソッドはPUTになるので、こちらも間違えないようにー。

ヘッダも、直前で設定したstrAPITokenPutの方です。
strAPIToken(取得で使ったトークン)と間違えないようにしてくださいね。

更新データは、strUpdateJSONに入っているので、そのまま渡してあげます。

最後のステータスは、特に必要ありません。ここではエラーが起きた時に状態を知るために取得しています。

実行結果

ということで、実際に動かすと、kintoneからJANコードを拾ってきて、JANコードのフォルダ名に入っているCSVファイルを開き、その内容を取得して、kintoneを更新する、というシナリオの完成です。

kintone寄りのお話は、3月28日のkintone縛りのライトニングトーク大会で、WinActorのシナリオについては、まだ日程決まっていませんが、WinActorトーク支部のイベントで開催しようと思いますので、お楽しみにー。


この記事が気に入ったらサポートをしてみませんか?