問題
Google Apps Scriptを実行中、すべて順調に進んでいるかと思った矢先、赤いエラーメッセージが表示されて処理が止まってしまうことがあります。
Exception: The coordinates or dimensions of the range are invalid.
このエラーは、Googleが「指定されたセルや範囲が見つかりません」と伝えているものです。分かりやすく言うと、グリッド上に存在しないセルや範囲を SpreadsheetApp サービスで参照しようとしたことを意味します。JavaScriptの標準的な配列では、範囲外のインデックスを参照しても静かに undefined が返されますが、Apps Scriptではスクリプトを即座に停止させる致命的な例外がスローされます。
要約:クイック修正
getRange() の引数に渡している数値を確認してください。多くの場合、次の2つのいずれかが原因です。
- 0 または負の数を使用している。 Google スプレッドシートは1からカウント(1始まり)します。最初のセルは常に (1, 1) であり、(0, 0) ではありません。
- 範囲がシートのサイズを超えている。 合計1,000行しかないシートで、1,001行目を取得しようとしている可能性があります。
なぜこのエラーが発生するのか?
1. 「ゼロインデックス」の罠
開発者は慣習的に0から数え始める傾向があります。JavaScriptの配列は data[0] から始まりますが、Google スプレッドシートは1から始まります。ループのインデックス i をそのまま getRange で使用すると、最初の繰り返し処理でスクリプトがクラッシュします。
// ❌ エラー:ループは0から始まりますが、スプレッドシートは1から始まります
for (var i = 0; i < data.length; i++) {
sheet.getRange(i, 1).setValue(data[i]);
}
解決策: 配列のインデックスをシートの座標に変換する際は、常に i + 1 を使用してください。
2. 空データのゴースト
動的にデータを書き込む場合、data.length を使って行数を定義することが多いでしょう。もしデータソースが空の配列を返した場合、範囲の高さが0になってしまうため、getRange(1, 1, 0, 1) は失敗します。開始座標が正しくても、長さが0の次元(高さや幅)は許可されていません。
var values = getExternalData(); // ここで空の配列 [] が返されたと仮定
// ❌ エラー:values.length が 0 になる
sheet.getRange(1, 1, values.length, 1).setValues(values);
3. getLastRow() の混同
次に空いている行を見つけるために getLastRow() + 1 を使うのは標準的な手法です。しかし、シートが新しく完全に空の状態だと、getLastRow() は 0 を返します。getRange(0 + 1, 1) は動作しますが、オフセットの計算などのより複雑なロジックでは、列や次元のパラメータに0が渡されてしまい、エラーを誘発することがよくあります。
4. シートの境界への到達
A列からZ列(26列)までしかないシートで getRange(1, 1, 1, 30) にアクセスしようとすると、スクリプトは失敗します。Apps Scriptはデフォルトでは「弾力性」がなく、要求されたからといって自動的にAC列を作成することはありません。まずスペースを確保する必要があります。
実証済みの解決策
方法 1:Math.max() でサニタイズする
計算結果を盲信してはいけません。Math.max(1, yourVariable) を使用して、Googleに0や負の数が渡されないように保証します。
var targetRow = calculateNextRow();
// セーフティネット:行を少なくとも1以上に強制する
sheet.getRange(Math.max(1, targetRow), 1).activate();
方法 2:動的データのためのガード句
データのサイズが変動する可能性がある場合は、必ず範囲操作を if 文で囲んでください。これにより、「何もない」ものを処理しようとしてスクリプトが停止するのを防げます。
if (data && data.length > 0) {
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
} else {
console.warn("データが空でした。クラッシュを防ぐため、シートへの書き込みをスキップします。");
}
方法 3:「安全な範囲」ヘルパー関数
ユーザーが様々な量のデータをインポートするようなツールを構築している場合は、範囲を取得する前にシートのサイズを自動的に拡張するヘルパー関数を使用します。
function getRangeAndExpand(sheet, row, col, numRows, numCols) {
var maxR = sheet.getMaxRows();
var maxC = sheet.getMaxColumns();
// 行が足りないか確認
if (row + numRows - 1 > maxR) {
sheet.insertRowsAfter(maxR, (row + numRows - 1) - maxR);
}
// 列が足りないか確認
if (col + numCols - 1 > maxC) {
sheet.insertColumnsAfter(maxC, (col + numCols - 1) - maxC);
}
return sheet.getRange(row, col, numRows, numCols);
}
確認用チェックリスト
正確な原因を特定するには、クラッシュする直前にログ出力行を追加してください。Apps Scriptエディタの実行数タブを開いて出力を確認します。
console.log(`Target: Row ${r}, Col ${c} | Dimensions: ${h}x${w}`);
sheet.getRange(r, c, h, w);
数値の中に0、負の数、または sheet.getMaxRows() で示される数値を超えているものがないか探します。もしログに「1,000行のシートに対して1,005行目を要求している」とあれば、それが原因です。

