概要
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
オフセット法サンプルコード
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
シーク法サンプルコード
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