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

にメンテナンス済み

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 });
};

上記コードでは、レコードの取得(GET)・削除(DELETE)ともに 1 回のリクエストで 100 件までしか処理できません。

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

POST, PUT, DELETEの上限
kintone REST APIには、GET, POST, PUT, DELETEそれぞれに、1度に操作できるレコードの上限が設けられています。今回は上記のレコード上限を気にすることなく、一括でレコードの作成ができる関数をご紹介します。RE

例 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) => ({
    顧客名: { value: client[0] },
    日付: { value: client[1] },
    確度: { value: client[2] },
  }));

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

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

  // 作成したレコードを一括登録(1 回の POST で登録できるのは 100 件まで)
  await kintone.api(kintone.api.url('/k/v1/records.json', true), 'POST', {
    app,
    records,
  });
};

コードの安全性について

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

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

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

bulkRequest は 1 回あたり最大 20 リクエストまで実行できる制限がありますが、削除、登録のいずれかでエラーが発生した場合、処理を巻き戻し(ロールバック)、実行前の状態に戻すことができます。

削除と登録を 1 つの bulkRequest にまとめる例は以下のとおりです(削除・登録ともに 100 件以内の場合)。

await kintone.api(kintone.api.url('/k/v1/bulkRequest.json', true), 'POST', {
  requests: [
    { method: 'DELETE', api: '/k/v1/records.json', payload: { app, ids } },
    { method: 'POST', api: '/k/v1/records.json', payload: { app, records } },
  ],
});

ids は削除対象のレコード ID の配列で、事前に GET で取得しておきます。

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

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

POST, PUT, DELETEの上限
kintone REST APIには、GET, POST, PUT, DELETEそれぞれに、1度に操作できるレコードの上限が設けられています。今回は上記のレコード上限を気にすることなく、一括でレコードの作成ができる関数をご紹介します。RE
#JavaScript #kintone