Ribbit.work

上限を気にせずPOST, PUT, DELETEする【Kintone】

KintoneJavaScript

last modified date2021-11-11

publish date2021-8-4

kintone REST APIには、GET, POST, PUT, DELETEそれぞれに、1度に操作できるレコードの上限が設けられています。

2021年8月現在は、以下の通りです。

GET 500レコード/回
POST 100レコード/回
PUT 100レコード/回
DELETE 100レコード/回
一括処理(bulkRequest) 20リクエスト/回

REST APIを使用するたびにkintone.api...と入力したり、エラー処理を作るのは手がかかるため、汎用的な関数やクラスを定義している方も少なくないと思いますが、そういった時に起きてしまいがちなのが、この上限に到達してしまう問題です。

レコードのGETについては、cybozu developer networkに素敵なコードが掲載されていましたが、POST、PUT、DELETEについては乗っていませんでした。 参考:全てのレコードの取得

今回は上記のレコード上限を気にすることなく、一括でレコードの作成ができる関数をご紹介します。

今回紹介するのはPOSTのパターンだけですが、APIのメソッドを変更することで、PUT・DELETEにも対応可能です。

ソースコード

1つのリクエストを繰り返し、簡単に記述する

こちらが基本のコードです。実行したいレコード数が上限を上回っている場合、先頭から上限分ずつAPIを実行し、最後に端数を実行する仕組みです。

/** REST APIのエンドポイント */
const END_POINT = '/k/v1/';

/** POSTで1度に扱えるレコード上限 */
const LIMIT_POST = 100;

const postRecords = async (app, _records) => {
  const records = [..._records];

  // レコードがなくなるまで、上限数ずつ実行
  while (records.length) {
    await kintone.api(kintone.api.url(`${END_POINT}records`, true), "POST", {
      app: app,
      records: records.slice(0, LIMIT_POST),
    });
    records.splice(0, LIMIT_POST);
  }
}

bulkRequestを使用した場合

前述したPOST APIのみ使用したパターンでは、エラーが発生した場合に100件単位でしかロールバックできません。

ロールバックできる件数を最大化したい場合は、以下のbulkRequestを活用したコードを使用します。

/** REST APIのエンドポイント */
const END_POINT = "/k/v1/";

/** POSTで1度に扱えるレコード上限 */
const LIMIT_POST = 100;

/** 同時に処理できるリクエスト上限 */
const LIMIT_BULK_REQUEST = 20;

const bulkRequest = async (_requests) => {
  const requests = [..._requests];

  const responses = [];

  while (requests.length) {
    responses.push(
      await kintone.api(
        kintone.api.url(`${END_POINT}bulkRequest`, true),
        "POST",
        {
          requests: requests.slice(0, LIMIT_BULK_REQUEST),
        }
      )
    );
    requests.splice(0, LIMIT_BULK_REQUEST);
  }

  return responses;
};

const postRecords = async (app, _records) => {
  const records = [..._records];

  const payloads = [];

  while (records.length) {
    payloads.push({
      app,
      records: records.slice(0, LIMIT_POST),
    });
    records.splice(0, LIMIT_POST);
  }

  const requestBase = {
    method: "POST",
    api: `${END_POINT}records.json`,
  };

  const requests = payloads.map((payload) => ({
    ...requestBase,
    payload,
  }));

  return bulkRequest(requests);
};

bulkRequestの実行結果はオブジェクト型で、resultsの中に通常のAPIの実行結果が配列で格納されています。

bulkRequestを使用していることを意識させないようにするには、返り値を均しておく必要があります。

return responses.map(({ results }) => results).flat();

PUT・DELETEの場合

サンプルではPOSTのパターンを紹介しましたが、メソッドを変更するだけでPUT・DELETEにも対応可能です。

注意すべき点は、POST・PUT・DELETEでサンプルコードの引数に当たる_recordsの内容が変化するということです。

POSTの場合はkintoneレコードデータの配列でしたが、PUTの場合は以下のように、レコード番号とkintoneレコードを格納したオブジェクトの配列となります。

また、DELETEの場合はレコード番号の配列となります。

// PUT
_records = [
   {'id': 1, record: kintoneRecord1},
   {'id': 2, record: kintoneRecord2}
   //...
];

// DELETE
_records = [
   1, 2, 3, 4, 5, //...
];

注意すべきこと

もし処理の途中で失敗したとしても、データがロールバックしません。

例えば、データを5,000件一括で登録する処理を実行し、3,000件目でエラーが出たとします。

bulkRequestを活用した方法では、

POSTリクエストの上限レコード数 × bulkRequestの上限リクエスト数

である2,000件以内であれば、失敗してもロールバックしますが、2,000件目以降でエラーが発生した場合、最初に実行した2,000件は削除されません。

これは現段階ではAPI上で解決することはできないため、よりセキュアな実行を目指すためには、あらかじめデータの整合性をチェックするしかありません。

この記事をシェア

この記事を読んだ方におすすめの記事

kuromoji.jsで形態素解析
2021-12-4

kuromoji.jsで形態素解析

TypeScriptJavaScript
レコードのサブテーブルを並び替えて登録する【Kintone JavaScriptカスタマイズ】
2021-12-4

レコードのサブテーブルを並び替えて登録する【Kintone JavaScriptカスタマイズ】

JavaScriptKintone
レコード一覧表示時(app.record.index.show)のサンプルコード集【Kintone】
2021-11-29

レコード一覧表示時(app.record.index.show)のサンプルコード集【Kintone】

JavaScriptKintone
スライダーを使って数値を設定できるKintoneプラグイン【無料公開】
2021-11-26

スライダーを使って数値を設定できるKintoneプラグイン【無料公開】

KintoneJavaScriptTypeScript

最新の記事

kuromoji.jsで形態素解析
2021-12-4

kuromoji.jsで形態素解析

TypeScriptJavaScript
レコードのサブテーブルを並び替えて登録する【Kintone JavaScriptカスタマイズ】
2021-12-4

レコードのサブテーブルを並び替えて登録する【Kintone JavaScriptカスタマイズ】

JavaScriptKintone
レコード一覧表示時(app.record.index.show)のサンプルコード集【Kintone】
2021-11-29

レコード一覧表示時(app.record.index.show)のサンプルコード集【Kintone】

JavaScriptKintone
スライダーを使って数値を設定できるKintoneプラグイン【無料公開】
2021-11-26

スライダーを使って数値を設定できるKintoneプラグイン【無料公開】

KintoneJavaScriptTypeScript