cybozu developer network

カテゴリー内の他の記事

レコード一括取得の JavaScript コーディング例

Index

はじめに

レコードを一括取得する方法には、大きく3つの選択肢があり、利用ケースに応じて適切な方法を選択する必要があります。
それぞれの方法の特徴や使い分けについては、こちらの記事で紹介しているので、ご参照ください。

この記事では、各方法の JavaScript のコーディング例を紹介します。

共通事項

  • 各方法の getRecords 関数を呼び出すサンプルコードでは、アプリストアの「案件管理」アプリを利用しています。
  • フィールドコードは、フィールド名と同じに設定しています。

方法 1 レコード ID を利用する方法

レコード一括取得 API で、レコード ID(レコード番号)の昇順でソートを行い、ID 順にレコードを取得する方法です。

サンプルコード

レコードを取得する関数

getRecords 関数の呼び出し例

  • 絞り込み条件・ソート条件・取得するフィールドを指定した場合
    ※ レコード ID を利用してレコードを取得する場合は、sortConds に「'$id asc'」を追加してください。
  • 指定しない場合
    ※ アプリ ID を指定しない場合は、表示中のアプリのレコードを取得します。

方法 2 カーソル API を利用する方法

カーソル API を使ってレコードを取得する方法です。

サンプルコード

レコードを取得する関数

getRecords 関数の呼び出し例

  • 絞り込み条件・ソート条件・取得するフィールドを指定した場合
  • 指定しない場合
    ※ アプリ ID を指定しない場合は、表示中のアプリのレコードを取得します。

方法 3 offset を利用する方法

レコード一括取得 API を使い、リクエストパラメータの offset を指定して順次レコードを取得する方法です。

※取得するレコードが10,000件以内である場合や、取得するレコードを10,000件以内に制限出来る場合に使用できます。
offset の制限値を考慮した kintone のレコード一括取得についての基本的な考え方はこちらの記事を参照してください。

サンプルコード

レコードを取得する関数

getRecords 関数の呼び出し例

  • 絞り込み条件・ソート条件・取得するフィールドを指定する場合
  • 指定しない場合
    ※ アプリ ID を指定しない場合は、表示中のアプリのレコードを取得します。

記事に関するフィードバック

記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。

Avatar
赤座 久樹

@kintone/rest-api-client の getAllRecordsを使えば
カーソルを意識しなくてもスムーズにリクエスト投げられるので、今後はこっちが王道だと思います。

https://github.com/kintone/js-sdk/blob/master/packages/rest-api-client/docs/record.md#getAllRecords

7月に向けて、このツールの啓蒙に力入れて頂くのが一番良いのではないでしょうか。
まだあんまり知られてなくて、大変勿体無いです。

赤座 久樹により編集されました
Avatar
Nguyen Hang

いつもお世話になっております。ハンと申します。

方法1を用いて以下の実装をしましたが、エラーは出ました。原因について分かる方がいらっしゃいましたら、教えてください。よろしくお願いします。

■ 実装内容:kintoneの編集画面にボタンを配置し、ボタンを押下されると関数「setResult」が実行され、指定フィールドのデータを更新する。
ソースコードの詳細は以下となります

■ ソースコード:
  function setResult (appId, key, calYear, calMonth, resultSetFieldName) {

    return new kintone.Promise(function (resolve) {

      var obj = kintone.app.record.get();

      var url = kintone.api.url("/k/v1/records", true);

      var param = {

        app: appId,

        query: '部門範囲=' + '"' + key + '"',

        totalCount: true,

      };

      // 対象年月は空白

      if (calYear == undefined || calMonth == undefined) {

        obj.record[resultSetFieldName].value = "";

        kintone.app.record.set(obj);

        alert("対象年月エラー");

        return;

      }

      getAllRecords(param).then(function (data) {

        if (data.records.length === 0) {

          obj.record[resultSetFieldName].value = "";

          kintone.app.record.set(obj);

          alert("レコード取得できない");

          return;

        }

        console.log(data.records.length);

        var calResult = 0;

        for (var i = 0; i < data.records.length; i++) {

          calResult = calResult + Number(calculateBouka (data.records[i], calYear, calMonth));

        }

        obj.record[resultSetFieldName].value = calResult;

        kintone.app.record.set(obj);

      });

    });

}
  function getAllRecords(param) {

    const MAX_READ_LIMIT = 500;

    const url = kintone.api.url("/k/v1/records", true);

    const app = param.app;

    const query= param.query;

    var data = param.data;

    if (!data) {

      data = {

        records: [],

        lastRecordId: 0

      };

    }

    const limit = MAX_READ_LIMIT;

    var conditions = "";

    if (query) {

      conditions = conditions + query;

    }

    conditions = conditions + ' and $id > ' + data.lastRecordId + ' limit ' + limit;

    const body = {

      app: app,

      query: conditions

    };

    return kintone.api(

      url, 'GET', body,

      function(res) {

        data.records = data.records.concat(res.records);

        if (res.records.length === limit) {

          data.lastRecordId = res.records[res.records.length - 1].$id.value;

          return getAllRecords({app: app, query: query, data: data});

        }

        delete data.lastRecordId;

        return data;

      },

      function(error) {

        alert("ERROR");

        return;

      });

}
■ エラー内容:
関数「setResult」の「getAllRecords(param).then(function (data) {」部分にさしていると思いますが原因は分からないです。。。
Avatar
cybozu Development team

ハン 様
お世話になっております。cybozu developer network 事務局です。

恐れ入りますが、こちらのコメント欄は記事内容のフィードバック目的となっているため、
記事から派生した技術的なご質問は、cybozu developer コミュニティをご活用ください。

ご質問を新規投稿する際、「良い質問をするためのガイド」というものが表示されますので、
それに沿って質問を記載いただくと、回答がつきやすくなると存じます。

よろしくお願い致します。

サインインしてコメントを残してください。