6
3

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 API で 1万件超えのレコードを取得する方法

Posted at

概要

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

6
3
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
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?