レコードのデリートインサート
にメンテナンス済み
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