レコードのデリートインサート

にメンテナンス済み

API を使ってレコードを更新したい場合、基本的にはPUT APIを使用します。

ただ、仕様や安全性を考慮し、一定条件のレコードを全て削除したうえで、レコードを再生成しなければならない。といったこともあるのではないでしょうか。

今回はそういった場合のコードサンプルを紹介いたします。

サンプルコード

関数の定義

まず、クエリーを指定して複数のレコードを削除する関数を定義します

/**
 * @param { number | string } app 処理対象アプリID
 * @param { string } query 削除対象を絞り込むクエリー
 * @returns { Promise<{}> } DELETE APIの実行結果
 */
const deleteByQuery = async (app, query) => {
  /** APIエンドポイント */
  const url = kintone.api.url('/k/v1/records.json', true);

  /** 削除対象のレコード(IDのみ) */
  const records = await kintone.api(url, 'GET', {
    app,
    query,
    fields: ['$id'],
  });

  // レコードIDの配列を定義します
  const ids = records.map((r) => r.$id.value);

  return kintone.api(url, 'DELETE', { app, ids });
};

上記コードでは、1 度の実行で、DELETE のレコード上限である 100 件までしか処理できません。

上限を意識せず使用したい場合は、以下の記事をご参照ください。

例 1: 日付を指定した更新

/** サンプルデータ */
const CLIENTS = [
  ['株式会社サンプル', '2022-01-01', 'A'],
  ['株式会社テスト', '2022-01-05', 'B'],
  ['ダミー株式会社', '2022-01-10', 'C'],
];

const deleteInsert = async () => {
  /** 処理対象アプリID */
  const app = 15;

  /** 登録するレコード一覧 */
  const records = CLIENTS.map((client) => ({
    顧客名: { vaule: client[0] },
    日付: { value: client[1] },
    確度: { value: client[2] },
  }));

  /** 削除対象を絞り込むクエリー */
  const query = '日付 >= "2021-01-01" and 日付 <= "2021-01-31"';

  // クエリーに当てはまるレコードを一括削除
  await deleteByQuery(app, query);

  // 作成したレコードを一括登録
  await kintone.api(kintone.api.url('/k/v1/records.json', true), 'POST', {
    app,
    records,
  });
};

コードの安全性について

レコードの削除 → 登録を行う場合、気を付けなければいけないのは、レコードの削除後に異常終了してしまうケースです。

削除の完了を待って、登録を行うようなコードを記述していた場合、削除処理だけ完了し、登録が実行されずデータに齟齬が発生します。

これを避けるには、bulkRequest を使用する方法が効果的です。

bulkRequest にも上限が存在しますが、削除、登録のいずれかでエラーが発生した場合、処理を巻き戻し(ロールバック)、実行前の状態に戻すことが可能です。

複数アプリへのレコード一括処理

bulkRequest を使ったサンプルは以下の記事でも紹介しています。

#JavaScript #kintone