これまで複数の記事で、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を活用してみると良さそうです。