大量データでもスムーズに動く工夫

月末の集計作業など、数百件のデータを効率的に処理するための設計

ページング大量データパフォーマンス同時実行制御効率化
読了時間: 8分

このトピックについて

月末の集計作業など、数百件のデータを扱う場面でも快適に動作する仕組みを実装しました。請求書サービスのAPI制限を意識しながら、効率的にデータを処理する設計です。

API制限との付き合い方

多くのクラウドサービスには、API呼び出しの制限があります。請求書サービスも例外ではなく、「1回の取得で100件まで」という制限があります。

自動ページング

「500件ください」とGASから指示するだけで、アプリ側で自動的に5回のやり取りを処理します。

自動ページングの流れ(500件の場合)
GASからリクエスト

「500件取得してください」

ページ1

offset=0, limit=100 → 100件取得

2秒待機

レート制限対策

ページ2〜5

同様に100件ずつ取得(各間に2秒待機)

結果をまとめて返却

合計500件をGASに返却

なぜ2秒待機するのか

API呼び出しの間に適度な待ち時間を挟むことで、サービス側に負荷をかけすぎない設計にしています。「アクセスが多すぎます」というエラーを未然に防ぎます。

必要な分だけ取得(2段階取得)

大量の伝票があっても、最初は「一覧だけ」を高速に取得し、詳細が必要なものだけ追加取得する方式を採用しています。

2段階取得の構成
ステップ1: 一覧取得

skip_details: true で明細をスキップ。ID・番号・取引先・日付のみ取得

高速(数秒)
フィルタリング

取引先名や日付で絞り込み。1000件→50件に削減

必要分だけ
ステップ2: 詳細取得

絞り込んだ50件のみ明細を取得

効果の比較

同時実行制御

複数のAPI呼び出しを効率的に行うため、同時実行数を制御する仕組みを導入しました。

同時実行プールの動作
タスク投入

10件の詳細取得リクエストをキューに追加

同時実行

最大2件を並列で処理

完了したら次へ

1件完了するたびに次のタスクを開始

全件完了

10件すべての結果をまとめて返却

なぜ2件同時なのか

並列数を増やしすぎると、サービス側のレート制限に引っかかるリスクが高まります。2件同時は、速度と安定性のバランスが取れた設定です。

最大件数の制限

ユーザーが「10000件取得」と指定しても、アプリ側で最大500件に制限しています。

大量データが必要な場合

500件を超えるデータが必要な場合は、期間を分割して取得することをお勧めします。

ページング終了の判定

データ取得を繰り返すとき、「もう取得するデータがない」ことを正しく判定する必要があります。

ページング終了の判定
データ取得

100件リクエスト

結果を確認

取得件数をチェック

100件取得
まだデータがある可能性 → 次のページへ
100件未満
最後のページ → 終了

この設計で実現できること

運営側にとって

  • 安定した大量処理: API制限を意識した設計
  • 効率的なリソース利用: 必要な分だけ取得
  • タイムアウトの回避: 適切な件数制限

現場担当者にとって

  • ストレスのない操作: 大量データでも待ち時間が短い
  • 一度の操作で完結: ページングを意識する必要なし
  • 確実な結果取得: 途中で止まることがない