2026年7月23日木曜日

GAS高速化の基本|getValues/setValues活用

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の内容をセットで理解すると効果的です。

次回は、セルの見た目を制御する「書式操作」に進みます。

GAS学習シリーズ
◀ 前の記事:GASでシート管理 次の記事:GASで見た目制御 ▶

GAS 高速化 getValues setValues 解説イメージ

0 件のコメント:

コメントを投稿