これまで複数の記事で、Monacaアプリにてkintoneのデータを操作するデモアプリを解説してきました。
今回は少し趣向を変えて、サーバーサイドや手元の環境からkintoneのデータを操作してみます。サーバー側からデータをメンテナンスできるようになれば、自社システムやデータベースとの連携もできるようになるでしょう。
利用する言語
今回はNode.jsを利用します。適当なフォルダを作成し、Node.jsプロジェクトとして初期化します。
$ mkdir kintone-nodejs-demo
$ cd kintone-nodejs-demo
$ npm init -y
利用するライブラリ
kintone公式のNode.js向けライブラリ kintone-nodejs-sdk
を利用します。
$ npm i kintone-nodejs-sdk
コードを書く
ここからは index.js を作成し、そこにコードを書いていきます。まず kintone-nodejs-sdk
を読み込みます。
const kintone = require("kintone-nodejs-sdk");
認証情報を記述する
今回はサーバーサイドからバッチ処理で複数データを更新する想定です。そこでkintoneのドメイン、認証情報を記述します。この認証は管理者ユーザーなどが良いでしょう。
const kintoneDomain = "your-domain.cybozu.com";
const username = "YOUR_USER_NAME";
const password = "YOUR_PASSWORD";
そして認証情報をセットします。
const kintoneAuth = (new kintone.Auth()).setPasswordAuth(username, password);
const kintoneConnection = new kintone.Connection(kintoneDomain, kintoneAuth);
利用するアプリを定義する
kintoneアプリのIDを決めておきます。
const appID = 999;
kintone Recordオブジェクトの定義
kintoneのデータを操作するkintone Recordオブジェクトを定義します。
const kintoneRecord = new kintone.Record(kintoneConnection);
データの検索・取得
kintoneを検索してデータを取得します。今回のクエリーストリングは自分のkintoneアプリに合わせて変更してください。書き方はQuery string - Kintone Developer Programにて説明されています。
const { records } = await kintoneRecord.getRecords(appID, "出庫メーター = 51000");
内容は以下のようになります。
[
{
"運行履歴テーブル": { type: "SUBTABLE", value: [Array] },
"レコード番号": { type: "RECORD_NUMBER", value: "13" },
"運行終了": { type: "TIME", value: "18:00" },
"更新者": { type: "MODIFIER", value: [Object] },
"運転年月日": { type: "DATE", value: "2022-03-10" },
"ステータス": { type: "STATUS", value: "未提出" },
"休憩仮眠履歴テーブル": { type: "SUBTABLE", value: [] },
"立替金詳細テーブル": { type: "SUBTABLE", value: [] },
"点検事項": { type: "CHECK_BOX", value: [Array] },
"オイル補充量": { type: "NUMBER", value: "" },
"入庫メーター": { type: "NUMBER", value: "50500" },
"高速券使用枚数": { type: "NUMBER", value: "" },
"運行時間数": { type: "CALC", value: "09:00" },
"車輌番号": { type: "SINGLE_LINE_TEXT", value: "100" },
"作業者": { type: "STATUS_ASSIGNEE", value: [] },
"作成者": { type: "CREATOR", value: [Object] },
"運行開始": { type: "TIME", value: "09:00" },
"$revision": { type: "__REVISION__", value: "7" },
"更新日時": { type: "UPDATED_TIME", value: "2023-01-25T01:44:00Z" },
"出庫メーター": { type: "NUMBER", value: "51000" },
"ガソリン補充量": { type: "NUMBER", value: "" },
"運転者氏名": { type: "USER_SELECT", value: [Array] },
"立替え金合計": { type: "CALC", value: "" },
"差引走行距離": { type: "CALC", value: "-500" },
"作成日時": { type: "CREATED_TIME", value: "2022-05-23T08:59:00Z" },
"$id": { type: "__ID__", value: "13" }
},
: // 中略
{
"運行履歴テーブル": { type: "SUBTABLE", value: [] },
"レコード番号": { type: "RECORD_NUMBER", value: "2" },
"運行終了": { type: "TIME", value: "18:00" },
"更新者": { type: "MODIFIER", value: [Object] },
"運転年月日": { type: "DATE", value: "2022-03-10" },
"ステータス": { type: "STATUS", value: "未提出" },
"休憩仮眠履歴テーブル": { type: "SUBTABLE", value: [] },
"立替金詳細テーブル": { type: "SUBTABLE", value: [] },
"点検事項": { type: "CHECK_BOX", value: [Array] },
"オイル補充量": { type: "NUMBER", value: "" },
"入庫メーター": { type: "NUMBER", value: "50500" },
"高速券使用枚数": { type: "NUMBER", value: "" },
"運行時間数": { type: "CALC", value: "09:00" },
"車輌番号": { type: "SINGLE_LINE_TEXT", value: "" },
"作業者": { type: "STATUS_ASSIGNEE", value: [] },
"作成者": { type: "CREATOR", value: [Object] },
"運行開始": { type: "TIME", value: "09:00" },
"$revision": { type: "__REVISION__", value: "7" },
"更新日時": { type: "UPDATED_TIME", value: "2023-01-25T01:44:00Z" },
"出庫メーター": { type: "NUMBER", value: "51000" },
"ガソリン補充量": { type: "NUMBER", value: "" },
"運転者氏名": { type: "USER_SELECT", value: [Array] },
"立替え金合計": { type: "CALC", value: "" },
"差引走行距離": { type: "CALC", value: "-500" },
"作成日時": { type: "CREATED_TIME", value: "2022-04-15T06:50:00Z" },
"$id": { type: "__ID__", value: "2" }
}
]
更新情報の作成
取得した情報(ID、リビジョン)を使って更新情報を作成します。今回は取得した出庫メーターの値を +1000 しています。レコードの値は文字列なので、parseIntして数字にしています。この仕様はRecord - kintone Node.js SDKを参照してください。
const updateRecords = records.map((record) => {
return {
id: record.$id.value,
revision: record.$revision.value,
record: {
"出庫メーター": {
value: parseInt(record.出庫メーター.value) + 1000,
},
},
};
});
更新する
作成した updateRecords
を使って更新処理を実行します。
const response = await kintoneRecord.updateRecords(appID, updateRecords);
レスポンスは以下のようになります。revisionが1つ上がっているはずです。
{
records: [
{ id: "13", revision: "8" },
{ id: "12", revision: "8" },
{ id: "11", revision: "8" },
{ id: "10", revision: "8" },
{ id: "9", revision: "8" },
{ id: "8", revision: "8" },
{ id: "7", revision: "8" },
{ id: "6", revision: "8" },
{ id: "5", revision: "8" },
{ id: "4", revision: "8" },
{ id: "3", revision: "8" },
{ id: "2", revision: "8" }
]
}
全体のコード
今回のコードです。実装時の参考にしてください。
const kintone = require("kintone-nodejs-sdk");
const username = "YOUR_USER_NAME";
const password = "YOUR_PASSWORD";
const kintoneDomain = "your-domain.cybozu.com";
const kintoneAuth = (new kintone.Auth()).setPasswordAuth(username, password);
const kintoneConnection = new kintone.Connection(kintoneDomain, kintoneAuth);
const appID = 99;
(async () => {
const kintoneRecord = new kintone.Record(kintoneConnection);
try {
const { records } = await kintoneRecord.getRecords(appID, "出庫メーター = 51000");
const updateRecords = records.map((record) => {
return {
id: record.$id.value,
revision: record.$revision.value,
record: {
"出庫メーター": {
value: parseInt(record.出庫メーター.value) + 1000,
},
},
};
});
const response = await kintoneRecord.updateRecords(appID, updateRecords);
} catch (error) {
console.log(error);
}
})();
まとめ
まとめてアップデートや削除などができるのは便利です。システム連携する際に利用できるでしょう。
kintoneアプリを自動化したり、システム連携する際にはNode.js SDKを活用してみると良さそうです。