Google Apps Script での 'Exception: The coordinates or dimensions of the range are invalid' エラーの修正方法

beginner📗 Google Sheets2026-06-06| Google Apps Script (V8 Engine), Google Sheets

Error Message

Exception: The coordinates or dimensions of the range are invalid.
#apps-script#google-sheets#デバッグ#javascript#getRange

問題

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行目を要求している」とあれば、それが原因です。

参考文献

Related Error Notes