レコードの一括取得がうまくできません

Handontableを使ってKintoneをExcelライクに入力しよう2(https://developer.cybozu.io/hc/ja/articles/207331836
)をカスタマイズして、レコードを500件以上取得できるようにしようと思っています。

今はカーソルAPIを使うべきだと分かっていますが、ちょっとよく分からず旧来の方法で取得しようとしています。

色々参考にして頑張ってみたのですが、ページネーションがうまくいかず、次の20件のレコードを参照するたびに白い空白が増えたかと思えば、いきなりデータが出ます(しかし、ページネーションは効かず)。
コンソールにエラーが発生しないため、どう解決すればいいか分かりません。。

 

ちなみにJavascriptは初心者でPromiseもなんとか分かる程度でサンプルを参考に書いただけなので、理解はできておらず勉強中です。。

何卒よろしくお願いいたします。

 

 

 

 

(function() {

  "use strict";

  var hot; // handsontable用変数

  // kintoneのレコード更新・追加時は、Record_numberなどアップデートできないフィールドがあるので、除外するためのメソッド

  var setParams = function(record) {

    var result = {};

    for (var prop in record) {

      if (['Record_number', 'Created_datetime', 'Updated_datetime', 'Created_by', 'Updated_by'].indexOf(prop) === -1) {

        result[prop] = record[prop];

      }

    }

    return result;

  };

  // kintoneのレコード取得用メソッド

  var getRecords = function(callback, errorCallback) {

    kintoneUtility.rest.getAllRecordsByQuery({ 

      app: kintone.app.getId(),

      isGuest: false     

    }).then(function (resp){

        callback(resp);

    }).catch(function(resp){

        errorCallback(resp);

    });

      

  }

  // kintoneのレコード更新、追加用メソッド

  var saveRecords = function(records, changedDatas, callback, errorCallback) { 

    var requests = [];

    var updateRecords = [];

    var insertRecords = [];

    var changedRows = [];

    var i;

    // 変更されたセルの配列から、変更があった行だけ抜き出す

    for(i = 0; i < changedDatas.length; i++) {

      changedRows.push(changedDatas[i][0]);

    }

    // 変更があった行番号の重複を排除

    changedRows = changedRows.filter(function (x, i, self) {

      return self.indexOf(x) === i;

    });

    // 変更があった行から、レコード追加か変更かを判断し、クエリをつくる

    for(i = 0; i < changedRows.length; i++) {

      if (records[changedRows[i]]["Record_number"].value === null) {

        insertRecords.push(

          setParams(records[changedRows[i]])

        );

      } else {

        updateRecords.push({

          id: records[changedRows[i]]["Record_number"].value,

          record: setParams(records[changedRows[i]])

        });

      }

    }

    // 更新用bulkRequest

    requests.push({

      method: "PUT",

      api: "/k/v1/records.json",

      payload: {

        app: kintone.app.getId(),

        records: updateRecords

      }

    });

    // 追加用bulkRequest

    requests.push({

      method: "POST",

      api: "/k/v1/records.json",

      payload: {

        app: kintone.app.getId(),

        records: insertRecords

      }

    });

    // bulkrequestで一括で追加、更新。

    // 失敗した場合はロールバックされる。

    kintone.api('/k/v1/bulkRequest', 'POST', {requests: requests},

      function(resp) {

        console.dir(requests);

        console.dir(resp);

        callback(resp);

      },

      function(resp) {

        errorCallback(resp);

      }

    );

  };

  // kintoneのレコード削除用メソッド

  var deleteRecords = function(records, index, amount, callback, errorCallback) {

    var i;

    var ids = [];

    for(i = index; i < index+amount; i++) {

      ids.push(records[i]["Record_number"].value);

    }

    kintone.api('/k/v1/records', 'DELETE', {app: kintone.app.getId(), ids: ids},

      function(resp) {

        callback(resp);

      },

      function(resp) {

        errorCallback(resp);

      }

    );

  };

  // 一覧ビュー表示用のイベントハンドラ

  kintone.events.on(['app.record.index.show'], function(event) {

    if (event.viewId !== 1111111) return;

    var container = document.getElementById('sheet');

    // handsontable初期化

    hot = new Handsontable(container, {

      // この時点ではdataは入力せず、あとから読み込ませるようにする。(データ更新時も再読み込みさせたいため)

      data: [],

      // 表示したいカラム

      colHeaders: ["Record No.", "Date", "Site", "Customer", "Group","Category", "Tar/Res", "Sales"],

   

      // 必要に応じてreadOnlyの指定ができます。

      columns: [

        {data: "Record_number.value", readOnly: true},

        {data: "Date.value", readOnly: true},

        {data: "Site.value", readOnly: true},

        {data: "Customer.value", readOnly: true},

        {data: "Group.value", readOnly: true},

        {data: "Category.value", readOnly: true},

        {data: "Target.value", readOnly: true},

        {data: "Sales.value"},

      ],

      // スプレットシート上のレコードを削除したときに呼び出されるイベント

      // 引数indexは削除する行

      // 引数amountは削除する行数

      beforeRemoveRow: function(index, amount) {

        var self = this;

        // kintoneのレコードを削除する

        deleteRecords(this.getSourceData(), index, amount, 

          function(resp){

            console.dir(resp);

            getRecords(function(resp){

              // 削除後、データを再読み込み

              self.loadData(resp.records);

            });

          },

          function(resp){

            console.dir(resp);

          }

        );

      },

      

      // スプレットシート上のレコードが編集されたときに呼び出されるイベント

      afterChange: function (change, source) {

        var self = this;

        console.log(source);

        // データ読み込み時はイベントを終了

        if (source === 'loadData') {

          return;

        }

        // kintoneのレコードを更新、追加する

        saveRecords(this.getSourceData(), change, 

          function(resp){

            console.dir(resp);

            getRecords(function(resp){

              // 更新後、データを再読み込み

              self.loadData(resp.records);

            },

            function(resp){

              // レコード取得失敗時に呼び出される

              console.dir(resp);

            });

          }, 

          function(resp){

            // 更新・追加時に呼び出される

            console.dir(resp);

          }

        );

      }

    });

    // レコードを取得してhandsontableに反映

      getRecords(function(resp){

        hot.loadData(resp.records);

    });

  });

})();

ページネーションはkintoneの標準のものを使用されているのでしょうか?

その場合、呈示しているコードだと2か所問題点がありそうです。

以下を試してみるとどうなりますでしょうか。

 

1.データを取得する処理が、無条件に全件取得になっている。

getAllRecordsByQueryだと、無条件に全件取得になってしまいます。

ページネーションを使用する場合、何件目~何件目で取得する必要があるかと思います。

    // kintoneのレコード取得用メソッド
    var getRecords = function (callback, errorCallback) {
        kintoneUtility.rest.getRecords({ // ←何件目~何件目を指定して取得する場合はこちら
            app: kintone.app.getId(),
            query: kintone.app.getQuery(), // ページング情報から、何件目~何件目の条件をセット
            isGuest: false
        }).then(function (resp) {

 

2.ページングするたびに、app.record.index.showイベントは呼ばれます。

毎回handsontableの初期化が走っているかと思われます。

2ページ目以降は、データのロードのみでよさそうです。

    // 一覧ビュー表示用のイベントハンドラ
    kintone.events.on(['app.record.index.show'], function (event) {
        if (event.viewId !== 5724250) return;
        var container = document.getElementById('sheet');

        // 2ページ目以降ならデータのロードのみ、1ページ目なら初期化
        if (hot) {
            hot.loadData(event.records); // 該当ページのデータは、event.recordsに入っているのでそれを使う
        } else {
            // handsontable初期化
            hot = new Handsontable(container, {
         // 該当ページのデータは、event.recordsに入っているのでそれを使う
         data: event.records,
// 表示したいカラム

// ~中略~
});
}
// // レコードを取得してhandsontableに反映 ← 上でevent.recordsからセットしてるのでこの処理は不要
// getRecords(function (resp) {
// hot.loadData(resp.records);
// });

 

できました~~~~!!!!

すごく長いこと悩んでいて、本当に助かりました!!!

 

ページネーションを使用するには全件取得はだめなんですね。。

全然気づかずに、違う方向を調べておりました。

 

涙が出そうなくらいうれしいです。ありがとうございます!!!!!!!