0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【kintone】JavaScriptカスタマイズ入門③

Posted at

はじめに

今回は、javascriptとkintone REST APIを使用した具体的なデータ取得処理、データ更新処理の実装について説明いたします。kintone REST APIには1回のAPI呼び出しで処理できるレコード件数に制限があり、そのことを考慮して実装を行う必要があります。

レコード一括取得処理

kintone REST APIのレコード取得処理には1回当たりの取得レコード数の制限があります。kintoneアプリには、この取得レコード件数の制限より多くのレコードが格納される場合があり、1回のレコード取得処理では全件取得できない場合があります。この状況への対応方法として、取得するレコードの範囲をスライドさせながらレコード取得処理繰り返すことで、全レコードを取得することができます。レコード抽出条件に加えて「offset」として抽出条件にマッチしたレコードの何件目から取得開始するか、「limit」としてレコード取得件数を指定することで、取得レコードの範囲をスライドさせることができます。
image.png
下記サンプルのレコード一括取得処理では、limitで1回の取得件数を指定しつつ、レコード取得件数ずつoffsetするクエリを使用し、レコード取得結果がlimit件数以下になるまで再帰処理でレコード取得を行い、各取得レコードを結合して戻すことでレコード一括取得処理としています。

    // レコード一括取得処理
    const getRecords = function(app, fields, strQuery, strOption, tmpRecords){
        var limit = 500; // 1回のクエリで抽出する上限件数を指定
        var tmpRecords = tmpRecords || [];
        return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
            app: app,
            fields: fields,
            query: strQuery + strOption + ' limit ' + limit + ' offset ' + tmpRecords.length
        }).then(function(response){
            tmpRecords = tmpRecords.concat(response.records);
            // 取得したレコード件数が1回のクエリで抽出する上限件数となっていた場合、再起呼出しする。
            // そうでない場合は取得レコードを返す。
            return response.records.length === limit ? getRecords(app, fields, strQuery, strOption,   
                   tmpRecords) : tmpRecords;
        });
    };

レコード一括更新処理

REST APIでのレコード更新処理には、更新対象のレコード番号と項目値をセットにした更新用レコード配列を使用しますが、こちらも1回当たりの更新レコード数の上限があります。
下記サンプルのレコード一括取得処理では、レコード一括取得処理のようなクエリでのoffsetやlimitの指定ができないため、更新用レコード配列から、範囲をずらしつつ一定件数のレコードを切り出して処理するように実装しています。

    //レコード一括更新処理
    const putAllRecords = function(offset, app, put_records){
        //offsetは、取得したデータの先頭からいくつスキップするかを表す
        offset = offset || 0;
        //kintone.apiでレコード取得するためのパラメータ
        var params = {
                "app" : app ,
                "records" : []
            };
        var t=0
        //100件ずつのパラメータを作る
        if (put_records.length - offset > 100) {
            for (var s = offset; s < offset+100; s++) {
                t++;
                params["records"][t-1] = put_records[s];
            }
        }else if (put_records.length - offset < 100) {
            for (var s = offset; s < put_records.length; s++) {
                t++;
                params["records"][t-1] = put_records[s];
            }
        }        
        return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', params
        ).then(function(put_resp){
            console.log(put_resp);
            //取得したレコード数が上限に達していれば再帰呼び出し
            if(put_records.length - (offset + 100) > 0){
                return putAll
            }
        });
    }

おわりに

今回は、kintone REST APIを利用した具体的なデータ取得処理、データ更新処理の実装について説明しました。実は、kintone REST APIのレコード処理は非同期処理となっており、レコード一括取得処理、レコード一括更新処理を連続的に呼び出すと、レコード一括取得処理の終了前にレコード一括更新処理が開始され、正常に動作しません。この対策としてkintone.Promiseが用意されています。次回は、レコード更新要否の判定とあわせて、kintone.Promiseを利用したレコード処理の同期について、ご説明いたします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?