JavaScript
kintone

kintoneでレコード取得数の上限を突破する

動機

kintoneのカスタマイズまたはプラグインで、kintone.apiを用いてレコードを取得する際、そのレコード数に上限があります。それを突破することを考えてみよう。

アイデア

ポイントは2つ:

  • kintone.apiのコールバック関数を省略するとkintone.Promiseを返してくれる
  • thenの戻り値は(kintone.)Promiseになる

実装

クエリを指定して取得するレコードを絞ったりできますが、ここでは取得数の上限を突破するための最低限のコードを書きます。

fetchAllRecords.js
function fetchAllRecords(offset, records){

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

    //kintone.apiでレコード取得するためのパラメータ
    let params = {
        'app': appId, //ここは何か取得先のアプリID
        'offset': offset
    };

    //ここがポイント
    return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then(function(records){

        allRecords.concat(records);

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

    });

}

もう少し説明を

上のコードは、javascriptのPromiseの基本的な使い方を理解していると簡単に理解できます。
Promiseは非同期処理を監視してくれるオブジェクトであり、thenはPromiseのメソッドです。Promiseが非同期処理完了の合図を出した後に、thenの中の処理を実行することが出来ます。

example1.js
let promise = new Promise(function(resolve, reject){
    //何かしらの非同期処理
    setTimeout(function(){
        resolve('A'); //ここのPromiseが監視している非同期処理が完了したことを知らせる関数
    }, 1000);
})
//resolveで渡された引数を受け取ることが出来る
.then(function(message){
    console.log(message); //文字'A'が出力される
});

先ほどのfetchAllRecordsでは、再帰呼び出しをすることで、thenの中でさらに非同期処理を実行しているのです。

そして最後は取得したすべてのレコードをreturnしているのですが、最初に「アイデア」の部分で述べたように、thenの戻り値はPromiseになるので、上の関数のあとにさらにthenをつなげることで、取得した全レコードを利用した処理を実行することが出来る。つまり以下のようにできたりします。

example2.js
fetchAllRecords().then(function(allRecords){
    //allRecords変数には、取得した全レコードが渡されている
    console.log(allRecords);
});

まとめ

Promiseの実戦的な応用例として、kintone.apiでのレコード取得数の上限を突破する関数を紹介しました。ただ、Promiseについての説明がここではしっかりできていないので、また初心者向けにまとめようと思います。