在 kintone 的開發中,最常遇到的限制之一,就是「如何一次抓到大量記錄」。
由於「取得複數記錄的 API」(GET /k/v1/records.json)單次可取得的記錄數最高上限為 500 筆,若要一次取得更多的記錄,就必須運用其他方法來達成。
本文整理 3 種官方推薦的常見策略,並說明原理、適用場景與限制。開發者可評估其使用情境,選擇更有效率、風險更低的方式來大量取得記錄。最後也會介紹更簡潔的做法──使用 kintoneRestAPIClient 的批次取得功能。
大量取得記錄的方式主要有三種:
適用於:
適用於:
適用於:
若用流程圖來看,大致如下:
是否需要特殊排序?
├─ 否 → 使用「方法1:Record ID」
└─ 是 → 是否超過 10,000 筆?
├─ 是 → 「方法2:Cursor API」
└─ 否 → 「方法3:offset」
利用「取得複數記錄的 API」(GET /k/v1/records.json),以 order by $id asc 對記錄排序,並以「前一次最後取得的 recordId」作為下一次查詢條件。
例如:
query = "order by $id asc limit 500"
下一輪 query = " $id > 最後取得的ID order by $id asc limit 500"
其核心在於:
$id 作為游標$id asc 排序這個方式在資料庫領域稱為 Seek Method,比 offset 方式快很多,是通用的高效查詢策略。
例如:資料備份、外部系統同步、排程抓資料等。
若透過程式邏輯(例如 Node.js 取得後在記憶體中 sort),那麼這個方式依然適合。
$id > X 完全不受影響。「Cursor(游標)」 是資料庫中用來記錄「目前取得位置」的指標。
kintone 的 Cursor API 也是依此概念設計。
/k/v1/records/cursorcursorId
cursorId 取得記錄,透過 next 參數可判斷是否需要進行下一輪資料取得。cursorId 刪除指定 cursor。以 cursor 取的記錄的流程如下:
next 參數判斷是否繼續遞迴請求)
Cursor 不會受 offset 限制,也不需靠 $id 排序。
💡 當 domain 中存在的 cursor 數量已達 10 個,又嘗試呼叫 Create Cursor API 時,就會發生「429 Too Many Requests」的錯誤。
「取得複數記錄的 API」(GET /k/v1/records.json),調整 offset 與 limit 逐段取得資料:
offset 0 → 500
offset 500 → 500
offset 1000 → 500
...
offset 方式實作上最簡單,可以直接帶入篩選排序條件,也不需要處理 $id 或 cursor。
然而 offset 本身:
因此僅適合記錄數限定在一定範圍內的資料抓取。
💡 關於 offset 限制值
2020 年 7 月 12 日定期維護後,取得複數記錄 API 的 offset 上限統一設為 10,000。
超過此限制時:
- kintone 系統管理者、cybozu.com 共通管理者、該應用程式管理者
會在列表頁面上看到警告訊息(每 30 天最多顯示一次)。- 若程式在這期間持續超過 offset 限制,依然會在 30 天後再次顯示。
詳細內容可參考官方公告。
kintone 官方提供:
可以自動幫你處理:
你幾乎不需要考慮 offset 上限與分頁邏輯。
record.getAllRecords如果你是用 JavaScript/TypeScript 進行開發,建議優先考慮使用官方 SDK @kintone/rest-api-client 來取得大量記錄。
其中的 record.getAllRecords() 方法,會在內部自動幫你處理「超過 REST API 單次上限」的分批請求。
簡單來說,它會根據你指定的條件決定最合適的請求方式:
orderBy 時,優先採取 $id 法。withCursor: false 時,採用 cursor 法。const client = new KintoneRestAPIClient()
const records = await client.record.getAllRecords({
app: 123,
condition: '狀態 in ("完成")',
orderBy: '更新時間 desc',
withCursor: true // 預設為 true,會在需要時自動使用 Cursor API
});
狀態 in ("結束", "處理中"))order by、limit、offset(排序請用 orderBy 參數)'更新時間 desc')。true):在 kintone 中,「一次抓很多筆記錄」看似只是加個迴圈、多呼叫幾次 API 就能解決,但實務上會受到:
等多種因素影響。
如果忽略這些限制,輕則效能變慢,重則觸發系統警告,甚至導致整個批次流程不穩定。
可以簡單記住以下選擇指引:
而在實務開發中,若你是用 JavaScript/TypeScript,更推薦的做法,是直接交給 @kintone/rest-api-client 的 record.getAllRecords() 來處理。
只要先選對取得方式,後續的整合與維運都會輕鬆很多。