0
1

【kintone】ルックアップフィールドの自動更新(100件以上)

Posted at

はじめに

kintoneのアプリA(APP_A)の値(field_A)をアプリB(APP_B)のルックアップフィールド(field_lookupA)で参照している場合、

  1. APP_Aの値を更新する
  2. 1の更新結果をAPP_Bに反映するために、APP_Bのレコードを手動で開き、ルックアップフィールドの[取得]をクリックしなくてはいけない

さらに...

  • APP_Bで更新対象になるレコードは100件以上ある(ので手動はめんどくさすぎる)
  • 業務上、APP_Bで更新対象になるレコードは、別のフィールド(field_UpdateStatus)でフィルタリングが必要(一覧機能でフィルタリングはできるけど、どうせなら自動化したい)

やりたいこと

下記の自動化

  1. APP_Aの値を更新する
  2. 更新されたAPP_Aの値をルックアップしている & field_UpdateStatusAPPが指定の値であるAPP_Bのレコードを検索
  3. 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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1