Amazonで商品を見るセール会場へ

GAS│getValuesとsetValuesで一括処理する|遅い・6分制限を避ける書き方

GASでスプレッドシートを処理すると、行数が増えたときに遅くなり、6分の制限に当たることがあります。

公式のベストプラクティスにある、まとめて読み書きする書き方を紹介します。

  • セルを1つずつ読み書きせず、範囲をまとめて配列で読み込む
  • 処理は配列の上で行い、最後に1回で書き出す
  • 読み込みと書き込みを、交互に行わない
  • 公式のセル背景色を設定する例では、個別の書き込みが約70秒、一括の書き込みが約1秒とされている

公式資料に基づく説明と掲載コードのローカル検証を掲載しています。

上限や仕様は、Googleの都合で変わることがあります。

公式の比較例は、この記事のコードの計測値や速度の保証ではありません。現在の仕様は公式ページで確認してください。

目次

遅くなる書き方

var sheet = SpreadsheetApp.getActiveSheet();
for (var i = 1; i <= 100; i++) {
  var v = sheet.getRange(i, 1).getValue();
  sheet.getRange(i, 2).setValue(v * 2);
}

これは遅い処理の比較用の断片です。アクティブシートのB1:B100を上書きするため、業務シートで実行しないでください。関数の外にあるコードなので、同じプロジェクトに保存するとdoubleNumbersを選んで実行した場合にも動くおそれがあります。以下の練習ではこの断片を貼り付けず、名前を指定した練習シートの2〜101行を対象にするdoubleNumbersだけを使います。

サービスのメソッドを何度も呼び出す形です。内部キャッシュがあるため呼び出し回数と実際の通信回数は必ずしも同じではありませんが、読み書きの交互実行を減らすことが公式に推奨されています。

スポンサーリンク

まとめて読み書きする

function doubleNumbers() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('一括処理練習');
  if (!sheet) throw new Error('「一括処理練習」シートを作成してください。');
  const values = sheet.getRange('A2:A101').getValues();
  const output = values.map(function (row, index) {
    const value = row[0];
    if (value === '') return [''];
    if (typeof value !== 'number' || !Number.isFinite(value) || !Number.isFinite(value * 2)) {
      throw new Error('A' + (index + 2) + 'に数値以外、または計算できない値があります。');
    }
    return [value * 2];
  });
  sheet.getRange('B2:B101').setValues(output);
}

getValues() は、範囲を2次元配列で返します。

setValues()には、書き込み先の行数・列数と一致する2次元配列を渡します。

行数と列数が合わないと、エラーになります。

練習用データと実行手順

  1. 「一括処理練習」シートを作り、A1に入力、B1に結果と入力します。
  2. A2に10、A3は空欄、A4に0、A5に-3を入力します。
  3. 「拡張機能」→「Apps Script」を開き、「まとめて読み書きする」のdoubleNumbers関数だけを保存して実行します。「遅くなる書き方」の比較用断片は同じプロジェクトへ貼り付けません。
  4. B2は20、B3は空欄、B4は0、B5は-6になります。

対象はA2:A101の100行で、B2:B101の既存の値や数式は置き換わります。

この例は数値だけを2倍にし、文字列や日付が混じると書き込み前に止まります。

A列の数式は計算結果を読みますが、B列へ数式自体はコピーしません。

本番の表は複製してから試し、戻すときは複製元からB列を復元してください。

6分の制限

2026年10月28日に確認した公式の割り当て表では、Script runtimeは個人・Google Workspaceとも1回6分、カスタム関数は30秒です。シンプルトリガーにも30秒の制限があります。ベストプラクティスのページには一部Workspaceで30分という記述もありますが、ここでは専用の割り当て表を基準にし、30分動くことを前提にしません。

公式は、処理を分割して、インストール型トリガーとプロパティサービスで、続きから再開する方法を案内しています。

カスタム関数は、30秒までです。

データが1,000万セルに近づくときは、Cloud SQLやBigQueryの利用が案内されています。

実際の処理時間は、環境やデータで変わります。

この記事では、計測していません。

スポンサーリンク

まとめ

  • 読み込みは1回、処理は配列の上、書き出しも1回
  • 読み書きを交互にしない
  • 6分を超えるなら、分割して再開する

参考:Google Apps Script「Best Practices」「Quotas for Google Services」(2026年9月30日確認)。

確認した範囲と公式資料

2026年10月2日に公式資料と掲載コードを照合しました。

コードの分岐はGoogleのサービスを代替したローカルテストで確認し、実サービスでの実行とは区別しています。

GAS上の認可・トリガー発火・同時実行は未検証です。

一括処理の公式指針 / Rangeの公式リファレンス

関連する手順:GASのLockServiceで同時実行を防ぐ|3種類のロックと書き方

よくある質問:GASで一括処理するときのチェックリスト

GASでスプレッドシートを処理すると、遅くなるのは、なぜですか?

セル単位の読み書きを繰り返すと、サービス呼び出しが増えて遅くなることがあります。内部キャッシュもあるため、実際の原因と所要時間は入力データで確認します。通常の実行では6分の制限に達する場合もあります。

速くするには、どう書けばよいですか?

セルを1つずつ読み書きせず、範囲をまとめて配列で読み込みます。処理は配列の上で行い、最後に1回で書き出します。読み込みと書き込みを、交互に行わないようにします。

getValuesとsetValuesは、どう使いますか?

getValues()は、範囲を2次元配列で返します。setValues()には、書き込み先の行数・列数と一致する2次元配列を渡します。行数と列数が合わないと、エラーになります。

どのくらい速くなりますか?

公式のセル背景色を設定する例で、個別の書き込みが約70秒、一括の書き込みが約1秒とされていると説明しています。公式の比較例は、この記事のコードの計測値や速度の保証ではありません。現在の仕様は公式ページで確認してください。

実行時間の制限は、いくつですか?

通常のスクリプト実行は1回6分までで、シンプルトリガーやカスタム関数には30秒など別の制限があると説明しています。

練習用のコードを、本番の表で試してよいですか?

本番の表は、複製してから試してください。記事の例では、B2:B101の既存の値や数式は置き換わります。戻すときは、複製元からB列を復元します。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

スプレッドシート・GASのおすすめ書籍

作業環境の作り方

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次