Kintone API 500件以上のレコード一括取得と100件以上の一括更新(ライブラリ使用なし)

kintone

Kintone REST APIによるレコード操作には制限がありますが、ときどきこれを超える必要が出てきます。

◻️一括取得(GET) → 500件まで
◻️一括登録(POST) → 100件まで
◻️一括更新(PUT) → 100件まで
◻️一括削除(DELETE) → 100件まで


制限を超えてレコードを取得し、そのレコードを一括で更新できるように書いてみました。

一括取得についてはcybouzu developer networkを参考にしソースをそのまま使わせていただきました。参考サイトはこちらです。ソート条件を必要とするかしないか取得するレコードが1万件を超える可能性があるかないかによってレコードを一括取得する方法が異なり、3つの選択肢があるのでよく読んで用途に応じて選択する必要があります。また、

レコード一括取得APIのパラメータ offset の上限値 1 万件の設定を、2020 年 7 月頃に実施する予定です。
それに伴い、レコード一括取得時にその結果が 1 万を超える可能性がある場合には、運用・適用中のプログラムのご確認ならびに修正対応の検討をお願いいたします。

とありますので早めの検討が必要です。

取得後の一括更新については100件ずつ再帰処理を使って実現しました。もし参考にされる場合はご自身の環境で確認してください。

(function() {
"use strict";
// レコード一覧画面
kintone.events.on(['app.record.index.show'], function (event) {

    if (document.getElementById('my_index_button') !== null) {
        return;
    }

    var myIndexButton = document.createElement('button');
    myIndexButton.id = 'my_index_button';
    myIndexButton.innerHTML = '更新';

    // ボタンクリック時の処理
    myIndexButton.onclick = function() {

         var putRecords = {
                      "app" : kintone.app.getId(),
                      "records" : []
                    };


        //更新したいレコードを取得
        var params = {
          app: kintone.app.getId(),
          filterCond: '',     //ここにクエリ
          fields: ['$id', 'RecordNo']     //ここに取得したいフィールド
        };


        getRecords(params).then(function(resp) {
            var resp_record = resp.records;
            for (var i = 0; i < resp_record.length; i++ ) {

                putRecords["records"][i] = {
                    "id": resp_record[i]['$id'].value,
                    "record" : {
                                '(フィールドコード)': {'value': 'フィールド値'},
                                }

                };

            }

            return fetchAllRecords(0,putRecords);


        }).then(function(resp2) {

            // 処理成功
            alert('更新しました\nリロードします');
            location.reload(); // 成功したら画面を更新

        }).catch(function(error) {

            // エラー表示をする
            alert('Error Occurred\n' + error.message);
            return error;

        });



    }

    kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);

    return event;

});

   /*
 * @param {Object} params
 *   - app {String}: アプリID(省略時は表示中アプリ)
 *   - filterCond {String}: 絞り込み条件
 *   - sortConds {Array}: ソート条件の配列
 *   - fields {Array}: 取得対象フィールドの配列
 * @return {Object} response
 *   - records {Array}: 取得レコードの配列
 */
var getRecords = function(_params) {
var MAX_READ_LIMIT = 500;

var params = _params || {};
var app = params.app || kintone.app.getId();
var filterCond = params.filterCond;
var sortConds = params.sortConds || ['$id asc'];
var fields = params.fields;
var data = params.data;

 if (!data) {
    data = {
      records: [],
      lastRecordId: 0
    };
}

var conditions = [];
var limit = MAX_READ_LIMIT;
if (filterCond) {
    conditions.push(filterCond);
}

conditions.push('$id > ' + data.lastRecordId);

var sortCondsAndLimit =
    ' order by ' + sortConds.join(', ') + ' limit ' + limit;
var query = conditions.join(' and ') + sortCondsAndLimit;
var body = {
    app: app,
    query: query
};

if (fields && fields.length > 0) {
    // $id で並び替えを行うため、取得フィールドに「$id」フィールドが含まれていなければ追加します
    if (fields.indexOf('$id') <= -1) {
      fields.push('$id')
    }
    body.fields = fields;
}

return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body).then(function(r) {
    data.records = data.records.concat(r.records);
    if (r.records.length === limit) {
      // 取得レコードの件数が limit と同じ場合は、未取得のレコードが残っている場合があるので、getRecords を再帰呼び出して、残りのレコードを取得します
      data.lastRecordId = r.records[r.records.length - 1].$id.value;
      return getRecords({ app:app, filterCond:filterCond, sortConds: sortConds, fields:fields, data:data });
    }
    delete data.lastRecordId;
    return data;
  });
};

//100件以上の更新
function fetchAllRecords(offset, put_records){

    //offsetは、取得したデータの先頭からいくつスキップするかを表す
    offset = offset || 0;

    //kintone.apiでレコード取得するためのパラメータ
    var params = {
          "app" : kintone.app.getId(),
          "records" : []
        };
    var t=0

    //100件ずつのパラメータを作る(パラメータが100件以上ある場合PUTリクエストが停止するまたは弾かれるため)
    if (put_records.records.length - offset > 100) {
        for (var s = offset; s < offset+100; s++) {
            t++;
            params["records"][t-1] = put_records["records"][s];

        }
    }else if (put_records.records.length - offset < 100) {
        for (var s = offset; s < put_records.records.length; s++) {
            t++;
            params["records"][t-1] = put_records["records"][s];

        }

    }

    return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', params).then(function(put_resp){

        //allRecords.concat(put_resp);

        //取得したレコード数が上限に達していれば再帰呼び出し
        if(put_resp.records.length === 100){
            return fetchAllRecords(offset + put_resp.records.length, put_records);
        }else{
            return event;
        }

    });

}
})();

コメント

タイトルとURLをコピーしました