はじめに
kintoneのアプリA(APP_A)の値(field_A)をアプリB(APP_B)のルックアップフィールド(field_lookupA)で参照している場合、
- APP_Aの値を更新する
- 1の更新結果をAPP_Bに反映するために、APP_Bのレコードを手動で開き、ルックアップフィールドの[取得]をクリックしなくてはいけない
さらに...
- APP_Bで更新対象になるレコードは100件以上ある(ので手動はめんどくさすぎる)
- 業務上、APP_Bで更新対象になるレコードは、別のフィールド(field_UpdateStatus)でフィルタリングが必要(一覧機能でフィルタリングはできるけど、どうせなら自動化したい)
やりたいこと
下記の自動化
- APP_Aの値を更新する
- 更新されたAPP_Aの値をルックアップしている & field_UpdateStatusAPPが指定の値であるAPP_Bのレコードを検索
- 2で見つけたレコードのルックアップを更新
やったこと
APP_Aに下記のjsカスタマイズを追加。
update_lookup_field.js
(() => {
'use strict';
const APP_B_ID = 000; //*ルックアップするアプリのIDを記載
// 保存成功後イベント
kintone.events.on(['app.record.edit.submit.success', 'app.record.index.edit.submit.success'], async (event) => {
let offset = 0;
const limit = 500;
const updateStatus = ['00_NotStarted', '01_InProgress'];
//*フィルタリングしたいフィールドコードを定数で設定し、指定の値を代入する
const query = '(filed_lookupA = "' + event.record.txt_currency.value + '") and (drop_ValuationSaleStatus in ("' + updateStatus.join('","') + '"))';
let allRecords = [];
try {
// ページネーションを使用しレコードを取得
while (true) {
const resp = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', {
app: APP_B_ID,
query: query + ` limit ${limit} offset ${offset}`, // クエリに limit と offset を追加
fields: ['$id'] // 必要なフィールドのみを取得してパフォーマンスを向上
});
allRecords = allRecords.concat(resp.records);
console.log(`取得したレコード数: ${resp.records.length}, 合計: ${allRecords.length}`);
if (resp.records.length < limit) {
// 取得したレコード数が limit より少ない場合、すべてのレコードを取得したと判断
break;
}
offset += limit;
}
console.log(`最終的な取得レコード数: ${allRecords.length}`);
// レコードの更新データの準備
const dbAppRecords = allRecords.map((record) => ({
id: record.$id.value,
record: {
field_lookupA: {
value: event.record.field_A.value
}
}
}));
// APP_Bのレコードを一括更新(100件ずつ)
const updatePromises = [];
for (let i = 0; i < dbAppRecords.length; i += 100) {
const batch = dbAppRecords.slice(i, i + 100);
updatePromises.push(
kintone.api(kintone.api.url('/k/v1/records.json', true), 'PUT', {
app: APP_B_ID,
records: batch
})
);
}
// すべての更新処理が完了するまで待機
await Promise.all(updatePromises);
const message = `ルックアップの更新が完了しました。更新されたレコード数: ${dbAppRecords.length}件`;
console.log(message);
} catch (error) {
const errorMessage = `ルックアップの更新でエラーが発生しました: ${error.message}`;
console.error(errorMessage);
}
});
})();
参考サイト
https://cybozu.dev/ja/kintone/tips/development/customize/validation-and-assistance/update-record-lookup-using-rest-api/
https://cybozu.dev/ja/id/7b342fa8f1aa22a1bb9cca4a/#use-offset