GASが遅くなる本当の原因は「書き方」
GASで処理を書いていて、
「動くけど遅い」「行数が増えたらタイムアウトした」
といった経験はよくあります。
多くの場合、原因はアルゴリズムではなく、
GAS特有の実行モデルを意識していない書き方にあります。
この記事では、GAS高速化の基本として、
getValues / setValues を軸にした考え方を整理します。
GAS012で学んだRange一括操作を、
「なぜ速いのか」という視点で理解するのが目的です。
目次
GASの処理が遅くなる仕組み
GASはローカルで動くJavaScriptとは異なり、
Googleのサーバー上で実行されます。
特にスプレッドシート操作では、
次のような通信が毎回発生します。
- GAS → スプレッドシートへのリクエスト
- シート側での処理
- 結果のレスポンス
この通信コストが、
GASにおける最大のボトルネックです。
通信回数がパフォーマンスを決める
次の2つの処理を比べてみます。
例①:1セルずつ処理する
for (let i = 1; i <= 1000; i++) {
const cell = sheet.getRange(i, 1);
const value = cell.getValue();
}
このコードでは、
getRange + getValue が1000回実行されます。
例②:Range一括で処理する
const values = sheet.getRange(1, 1, 1000, 1).getValues();
こちらは、通信がたった1回です。
この差が、そのまま処理時間の差になります。
getValues / setValuesが高速な理由
getValues / setValues が高速な理由は、
通信と処理を分離できる点にあります。
- 取得:まとめて1回
- 加工:JavaScript上で高速処理
- 反映:まとめて1回
この構造を意識するだけで、
GASの書き方は大きく変わります。
よくある遅い書き方
次は、初心者がやりがちな遅い書き方の例です。
for (let i = 1; i <= 1000; i++) {
const cell = sheet.getRange(i, 1);
if (cell.getValue() === '') {
cell.setValue('完了');
}
}
このコードは、
getRange / getValue / setValue が何度も呼ばれるため、
非常に遅くなります。
高速化の基本パターン
高速化の基本は、次の形です。
const range = sheet.getRange(1, 1, 1000, 1);
const values = range.getValues();
for (let i = 0; i < values.length; i++) {
if (values[i][0] === '') {
values[i][0] = '完了';
}
}
range.setValues(values);
この形をテンプレートとして覚えるだけで、
多くの処理が高速化できます。
実務で効く追加の高速化ポイント
- 不要な Logger.log を削除する
- ループ内で getRange しない
- 処理対象行数を最小限にする
- 更新がない場合は setValues しない
高速化は「特別なテクニック」ではなく、
通信回数を減らす意識の積み重ねです。
まとめ
この記事では、GAS高速化の基本として、
getValues / setValues を中心に考え方を整理しました。
GASの高速化は、
GAS012・GAS014の内容をセットで理解すると効果的です。
次回は、セルの見た目を制御する「書式操作」に進みます。
0 件のコメント:
コメントを投稿