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);
}セルを1つ読んで1つ書く、を繰り返す形です。
そのたびに、スプレッドシートへ問い合わせが発生します。
まとめて読み書きする
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次元配列を渡します。
行数と列数が合わないと、エラーになります。
練習用データと実行手順
- 「一括処理練習」シートを作り、A1に入力、B1に結果と入力します。
- A2に10、A3は空欄、A4に0、A5に-3を入力します。
- 「拡張機能」→「Apps Script」にコードを保存し、doubleNumbersを実行します。
- B2は20、B3は空欄、B4は0、B5は-6になります。
対象はA2:A101の100行で、B2:B101の既存の値や数式は置き換わります。
この例は数値だけを2倍にし、文字列や日付が混じると書き込み前に止まります。
A列の数式は計算結果を読みますが、B列へ数式自体はコピーしません。
本番の表は複製してから試し、戻すときは複製元からB列を復元してください。
6分の制限
通常のスクリプト実行は1回6分までで、シンプルトリガーやカスタム関数には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上の認可・トリガー発火・同時実行は未検証です。
