kintone API で 1万件超えのレコードを取得する方法

# 概要
kintoneに登録した1万件を超えるレコードを取得する方法について書きます。

# 環境

* macOS 10.15.7

# オフセット法
kintoneのAPIで1回に取得できるレコードの上限は500件です。
https://developer.cybozu.io/hc/ja/articles/201941754#step12
https://jp.cybozu.help/k/ja/admin/limitation/limit.html#limitation_limit_30

オフセットを利用する場合のレコード取得の上限値は10,000件です。
10,000件を超えたレコードの取得には後に記載するシーク法を使います。

レコード一括取得の JavaScript コーディング例
https://developer.cybozu.io/hc/ja/articles/360031191791

## オフセット法サンプルコード

```get-records.ts
import { confirmDialog, successDialog, errorDialog } from 'goqoo'
import type { IndexEvent } from 'types'
interface Param {
  app: number | null;
  query?: string;
  fields?: string[];
  totalCount?: boolean;
}

const get_records_handler: any = () => {
  return new Promise((resolve, reject) => {
    const param: Param = {
      app: kintone.app.getId(),
      fields: ['レコード番号', '作成日時'],
      totalCount: true
    }
    const offset = 0;
    const records: any[] = [];

    const get_records_helper = (offset: number) => {
      param.query =  `order by $id asc limit 500 offset ${offset}`;
      if (offset >= 10000) {
        resolve(records.flat());
      } else {
        kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', param)
        .then(result => {
          offset += 500;
          records.push(result.records);
          return get_records_helper(offset);
        })
        .catch(error =>{
          console.error(error);
          reject(error);
        });
      }
    };
    return get_records_helper(offset);
  });
}

kintone.events.on('app.record.index.show', async (event: IndexEvent<any>) => {
  await confirmDialog('confirm');
  await get_records_handler()
  .then((result: any) => {
    console.log(result); // eslint-disable-line no-console
    successDialog('success');
  })
  .catch((error: any) => {
    errorDialog(error);
  });
  return event;
});
```

# シーク法
10,000件を超えるレコードを取得する場合は、シーク法（またはカーソルAPI）を利用します。
シーク法によるレコード一括取得の考え方については下記を参照。
https://developer.cybozu.io/hc/ja/articles/360030757312#use_id


## シーク法サンプルコード

```get-records-seek.ts
import { confirmDialog, successDialog, errorDialog } from 'goqoo'
import type { IndexEvent } from 'types'

interface Param {
  app: number | null;
  query?: string;
  fields?: string[];
  totalCount?: boolean;
}

const get_records_handler = () => {
  return new Promise((resolve, reject) => {
    const param: Param = {
      app: kintone.app.getId(),
      fields: ['$id', 'レコード番号', '作成日時'],
      totalCount: true
    }
    const LIMIT = 500;
    const lastRecordId = 0;
    const records: any[] = [];
  
    const get_records_helper = (lastRecordId: number, limit: number) => {
      // $idの昇順にソートした最後のレコード番号より大きいレコード番号のレコードを取得
      param.query =  `$id > ${lastRecordId} order by $id asc limit ${LIMIT}`;
      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', param)
      .then(result => {
        lastRecordId = result.records[result.records.length - 1].$id.value;
        if (result.records.length === LIMIT) {
          records.push(result.records);
          return get_records_helper(lastRecordId, limit);
        } else {
          resolve(records.flat());
        }
      })
      .catch(error =>{
        console.error(error);
        reject(error);
      });
    };
    return get_records_helper(lastRecordId, LIMIT);
  });
}
kintone.events.on('app.record.index.show', async (event: IndexEvent<any>) => {
  await confirmDialog('confirm');
  await get_records_handler()
  .then((result: any) => {
    console.log(result); // eslint-disable-line no-console
  }).catch((error: any) => {
    errorDialog(error);
  });
  await successDialog('success');
  return event;
});
```


# 参考


## kintone API 

レコードの一括取得API
https://developer.cybozu.io/hc/ja/articles/202331474#step2

kintone REST API リクエスト
https://developer.cybozu.io/hc/ja/articles/202166310#step1

kintone REST APIの共通仕様
https://developer.cybozu.io/hc/ja/articles/201941754

URL取得
https://developer.cybozu.io/hc/ja/articles/202166310#step2

イベントハンドラー登録 API
https://developer.cybozu.io/hc/ja/articles/201941954#step2


## その他

offset の制限値を考慮した kintone のレコード一括取得について
https://developer.cybozu.io/hc/ja/articles/360030757312

レコード一括取得の JavaScript コーディング例
https://developer.cybozu.io/hc/ja/articles/360030757312

開発フレームワーク「Goqoo on kintone」を正式リリースしました！
https://qiita.com/the_red/items/3222d8bf71c32d769060