Kintoneアプリへのデータ格納をNode-REDで簡単に操作する

以前、参加したイベントでNode-REDからKintoneアプリのデータを操作するというノードを見つけたので、その使い方のメモをしておきます。

拡張ノードnode-red-contrib-kintone

今回、Node-REDからKintoneアプリを操作する拡張ノードはnode-red-contrib-kintoneとなります。このノードの使用方法に関しては作者の方の情報が参考になります。

blog.chick-p.work

この拡張ノードはKintoneREST APIのうち以下のものをサポートしています。 今回はこの内のreadcreateupdateを試します。

オペレーション 操作 URL
read 複数のレコードを取得する(GET) /k/v1/records.json
create 複数のレコードを登録する(POST) /k/v1/records.json
update 複数のレコードを更新する(PUT) /k/v1/records.json

同じURLのアクセスですがHTTPのメソッドが異なるものになります。

REST APIの詳細に関しては以下を参照してください。

cybozu.dev

テスト用のKintoneアプリを準備する。

まずはNode-REDのテストというプリを作成して機能を試してみます。以下のようなアプリを追加します。

フォームには以下のデータを準備します。

  • レコード番号(自動入力) ➡ フィールドコード:レコード番号
  • 更新日時(自動入力) ➡ フィールドコード:更新日時
  • 文字列(1行) ➡ フィールドコード:文字列__1行_

データとして1件以下のように入力を行っておきます。

これでテストの準備は完了です。

拡張ノードのインストール

続いては拡張ノードのインストールを行います。

フローエディタの右上の【三(ハンバーガーボタン)】をクリックしプルダウンメニューを開きます。メニューから【パレットの管理】をクリックします。

【ユーザー設定】の【パレット】が表示されるので、【ノード追加】タブをクリックします。

検索ボックスにkintoneと入力すると、追加候補にnode-red-contrib-kintoneが表示されるので、【ノードを追加】ボタンをクリックします。

インストール確認のダイアログが表示されるので、【追加】ボタンをクリックします。

以下のような表示が行われれば拡張ノードのインストールは完了です。

フローエディタのパレットの機能カテゴリにkinetoneというノードが追加されています。

kintoneノードの設定

まず、テスト用のフローを作成します。以下のノードを配置し接続します。

  • injectノード
  • kintoneノード
  • debugノード

kintoneノードはフローエディタ上に配置するとGETという名称に変わります。

Kintoneノードをダブルクリックして、プロパティ画面を開きます。プロパティの【設定】の【🖋️(kintone-config設定)】のボタンをクリックします。

設定が必須なのは以下の3つです。

これらの情報はログイン時の画面に表示される情報となります。

入力が終わったら【更新】ボタンをクリックします。

プロパティ画面に戻ってくるので、残る設定である【アプリID】と【クエリ】を設定します。 設定時に使用しているURLにも記載はありますが、確実なのはkintone設定時の画面上部にある【⚙】をクリックし

【アプリ管理】を選択します。ここでアプリ一覧がリストで表示されるのでその中から接続するアプリのID部分を確認します。

Node-REDに戻りプロパティ画面の【アプリID】に入力します。あとはクエリになりますが、レコード番号が1のデータのみが格納されているのでクエリには以下の様に記述します。

レコード番号 = 1

あとは、フローをデプロイして実行すると、デバックエリアに取得されたオブジェクトが表示されます。接続は成功し、データも取得できています。ちなみにクエリに何も書いていなかった場合にはmsg.payloadの値をクエリとしてしようする動作のようです。

続いて、データを2件に増やしてテストを行っていきます。

今度は最新の1件を取得するようにしてみます。クエリに以下のように入力を行います。このクエリの意味はorder by 更新日時 desc更新日時フィールドを降順に並べ替えして、最新のレコードが最初に来るようにし、さらにlimit 1を指定することで最初の1件に制限して返しています。

order by 更新日時 desc limit 1

実行すると最新の1件を取得しています。

もちろん、クエリにlimit 1を指定しなければ、格納されているデータがすべて配列の形で取得できます。

データの追加

データの追加は以下のようにフローを作成します。kintoneノードのクエリは空白にすると接続された前段のノードの出力であるmsg.payloadの値をクエリとしてしようするので、このようにfunctionノードを使用しています。下記のようにフローを作成し

functionノードのコード部に以下のように記述をします。

// 新しいレコードのデータを作成
var newRecord = [
    {
        "文字列__1行_" : { "value" : "Node-REDからの書込"},
    }
];

// Kintoneノードにデータを送信
msg.payload = newRecord;
return msg;

kintoneノードのクエリは空にしておきます。

フローのデプロイ、実行を行うと追加したIDが表示されます。

kintoneのレコードも正常にデータが追記されています。追記されたときのレコード番号は新規の発番がされています。

複数のデータの追加

先ほどは単一データの追加でしたが、これを拡張して複数のデータを追加するにはコードを以下のようにします。格納データが配列形式になってるので、要素を増やすだけで複数データを追加できます。

// 新しいレコードのデータを作成
var newRecord = [
    {
        "文字列__1行_" : { "value" : "Node-REDからの書込1"},
    },
    {
        "文字列__1行_" : { "value" : "Node-REDからの書込2"},
    }
];
// Kintoneノードにデータを送信
msg.payload = newRecord;
return msg;

フローを実行するとデータの追加は2件分行われています。

デバックにも追加されたデータのIDが新規発番されていることがわかります。

データ更新

データの更新もほぼ同様です。違いは更新データに変更するデータのIDを含めている点とkintoneノードのメソッドをPUTに変更している点です。

// 新しいレコードのデータを作成
var updateRecord = [
    {
      "id": 3,
      "record": {
        "文字列__1行_": { "value": "Node-REDからの更新1" }
      }
    },
]

// Kintoneノードにデータを送信
msg.payload = updateRecord;
return msg;

kintoneノードのメソッドをPUTにしています。

該当のデータが変更されています。変更されるとデータのrevisionの値がインクリメントされます。

複数のデータの更新

複数データの更新も問題なく行えます。ただ、記載が結構たいへんなので、小分けにして処理を行ったりサブフローなどを使用すると可読性はよくなる気がします。

// 新しいレコードのデータを作成
var updateRecord = [
    {
      "id": 4,
      "record": {
        "文字列__1行_": { "value": "Node-REDからの更新1" }
      }
    },
    {
      "id": 5,
      "record": {
        "文字列__1行_": { "value": "Node-REDからの更新2" }
      }
    },
]
// Kintoneノードにデータを送信
msg.payload = updateRecord;
return msg;

kintoneノードのメソッドはPUTににしておきます。

複数の変更があっても、データ毎にrevisionがあり、変更されていきます。

おわりに

今回は拡張ノードnode-red-contrib-kintoneを使用してNode-REDからKintoneアプリへデータの操作(取得追記変更)を行ってみました。最初は少しとっつきにくいという操作方法でしたが、慣れていくると簡単にデータの変更を行える状態になってきますね。

だた、あくまでもKintoneREST APIの一部のみが操作できる形なので、それ以外の操作が必要になったときにはhttp requestノードを使用してAPIを直接操作する必要があります。

/* -----codeの行番号----- */