GASでスプレッドシートをDBとして扱う場合、条件に一致する行を取得する処理をよく書きますよね。
私は以前から、sheet.getDataRange().getValues()で全データ取得 → findやfilterで対象データ取得 という方法で行っています。APIアクセスの回数を少なくするのはGAS高速化の鉄則ですので。
しかし、データ量が多い場合getValues()にかなり時間がかかります。
そのため、高速化の手法はないか、色々と検証してみました。
検証内容
- 20列 × n行の表のA列を検索し、対象行のデータを取得するのにかかる時間を計測
- 検索・取得の方法は下記の5種類
- 全列をgetValuesで取得 → findで対象行データを取得
- A列のみgetValuesで取得 → findIndexで対象行番号を特定 → getValuesで対象行データを取得
- A列をtextFinderで検索して対象行番号を特定 → getValuesで対象行データを取得
- 全列をSheets APIで取得 → findで対象行データを取得
- A列のみSheets APIで取得 → findIndexで対象行番号を特定 → Sheets APIで対象行データを取得
- それぞれ5回実施し、平均所要時間を比較

検証結果


まとめ
まじか~~。今までやってたことを否定された気分。
今回の検証結果は下記のような感じです。
- GASのgetValuesは行数に比例して遅くなるが、列数の影響はあまり無さそう。
- Sheets APIのSpreadsheets.Values.getは列数を絞ればかなり速くなる。
- 全列取得・1列取得のどちらも、GASのgetValuesよりSheets APIのSpreadsheets.Values.getの方が遥かに速い
- GASでもtextFinderでの検索はかなり速いし、行数の影響もほぼ無さそう。

コメント