メディア掲載: レバテックフリーランス様のサイトで当ブログが紹介されました

GAS: スプレッドシートからの対象行データ取得を高速化する検証

GASでスプレッドシートをDBとして扱う場合、条件に一致する行を取得する処理をよく書きますよね。

私は以前から、sheet.getDataRange().getValues()で全データ取得 → findfilterで対象データ取得 という方法で行っています。APIアクセスの回数を少なくするのはGAS高速化の鉄則ですので。

しかし、データ量が多い場合getValues()にかなり時間がかかります。
そのため、高速化の手法はないか、色々と検証してみました。

検証内容

  • 20列 × n行の表のA列を検索し、対象行のデータを取得するのにかかる時間を計測
  • 検索・取得の方法は下記の5種類
    1. 全列をgetValuesで取得 → findで対象行データを取得
    2. A列のみgetValuesで取得 → findIndexで対象行番号を特定 → getValuesで対象行データを取得
    3. A列をtextFinderで検索して対象行番号を特定 → getValuesで対象行データを取得
    4. 全列をSheets APIで取得 → findで対象行データを取得
    5. A列のみSheets APIで取得 → findIndexで対象行番号を特定 → Sheets APIで対象行データを取得
  • それぞれ5回実施し、平均所要時間を比較
検証に使った表。A列を検索 + ヒットした1行を取得するまでの時間を計測。

検証結果

1万行までの検証結果
10万行までの検証結果

まとめ

まじか~~。今までやってたことを否定された気分。
今回の検証結果は下記のような感じです。

  • GASのgetValuesは行数に比例して遅くなるが、列数の影響はあまり無さそう。
  • Sheets APIのSpreadsheets.Values.getは列数を絞ればかなり速くなる。
  • 全列取得・1列取得のどちらも、GASのgetValuesよりSheets APIのSpreadsheets.Values.getの方が遥かに速い
  • GASでもtextFinderでの検索はかなり速いし、行数の影響もほぼ無さそう。

コメント

タイトルとURLをコピーしました