Apps Scriptの「SpreadsheetApp.Range.setValuesのメソッドシグネチャと一致しません」エラーを修正する

beginner📗 Google Sheets2026-05-13| Google Apps Script(V8ランタイム)、Google Sheets — 全プラットフォーム(ブラウザベースのIDE)

Error Message

Exception: The parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues.
#google-apps-script#setvalues#arrays#javascript

TL;DR

setValues()2次元配列(配列の配列)を要求します。[1, 2, 3] のようなフラットな1次元配列を渡すとこのエラーが発生します。修正方法は括弧をもう一組追加するだけです。1行の場合は [[1, 2, 3]]、1列の場合は [[1], [2], [3]] にします。

// ❌ 間違い — 1次元配列
range.setValues([1, 2, 3]);

// ✅ 正しい — 2次元配列(1行)
range.setValues([[1, 2, 3]]);

// ✅ 正しい — 2次元配列(1列)
range.setValues([[1], [2], [3]]);

根本原因

Apps Script の実行ログには、完全なエラーが次のように表示されます:

Exception: The parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues.

スプレッドシートはグリッド構造です。行と列で構成されています。setValues() はその構造に直接マッピングされるため、常に2次元配列を期待します:

  • 外側の配列 = 行。
  • 各内側の配列 = その行のセル。

[10, 20, 30] を渡すと、Apps Script は number[](1次元)と認識します。必要なのは number[][] です。シグネチャが一致しないため、メソッドは1バイトも書き込む前に例外をスローします。

括弧内の型はデータによって変わります。(number[])(string[])(String[]) などが表示される場合があります。いずれにせよ、修正方法は常に同じです。もう一つ配列でラップしてください。

よくあるシナリオと修正方法

シナリオ1:1行分の値を書き込む

名前、年齢、役職の3つの値を1行目に書き込みたい場合を考えます。

// ❌ 壊れている
function writeRow() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = ["Alice", 30, "Engineer"];
  sheet.getRange(1, 1, 1, 3).setValues(values); // TypeError!
}

// ✅ 修正済み
function writeRow() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = [["Alice", 30, "Engineer"]];
  sheet.getRange(1, 1, 1, 3).setValues(values);
}

getRange(1, 1, 1, 3) は1行×3列を意味します。2次元配列はこれに一致する必要があります。つまり、ちょうど3要素を含む内側の配列が1つ必要です。

シナリオ2:1列分の値を書き込む

列方向への書き込みは逆の形になります。各値が独自の内側の配列を持ちます。

// ❌ 壊れている
function writeColumn() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = [100, 200, 300];
  sheet.getRange(1, 1, 3, 1).setValues(values); // TypeError!
}

// ✅ 修正済み — 各値が独自の行配列に収まる
function writeColumn() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = [[100], [200], [300]];
  sheet.getRange(1, 1, 3, 1).setValues(values);
}

シナリオ3:ループで配列を動的に構築する

ループで構築した配列は、このバグが最も潜みやすい場所です。データをイテレートして値をプッシュする際、各プッシュが裸の値ではなく行である必要があることを忘れてしまいがちです。

// ❌ 壊れている — フラットな数値をプッシュしている
function processData() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var output = [];
  var data = [10, 20, 30, 40];

  data.forEach(function(val) {
    output.push(val * 2); // 数値をプッシュしており、配列ではない
  });

  sheet.getRange(1, 1, output.length, 1).setValues(output); // TypeError!
}

// ✅ 修正済み — 各イテレーションでミニ配列をプッシュする
function processData() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var output = [];
  var data = [10, 20, 30, 40];

  data.forEach(function(val) {
    output.push([val * 2]); // 各行が独自の配列になる
  });

  sheet.getRange(1, 1, output.length, 1).setValues(output);
}

シナリオ4:getValues() の出力を誤ってフラット化してしまう

getValues() は常に2次元配列を返します。問題が起きるのは、.flat() を呼び出したり、プリミティブを返す .map() をチェーンしたり、単一行の結果をスライスしたりした場合です。これらのいずれかが外側の配列を暗黙的に取り除いてしまう可能性があります。

// ❌ 壊れている — .flat() が2次元構造を破壊する
function copyRow() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var sourceValues = sheet.getRange("A1:C1").getValues().flat();
  // sourceValues は ["x", "y", "z"] になっている — 1次元!
  sheet.getRange("A2:C2").setValues(sourceValues); // TypeError!
}

// ✅ 修正済み — getValues() の結果をそのまま使う
function copyRow() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var sourceValues = sheet.getRange("A1:C1").getValues();
  // sourceValues は [["x", "y", "z"]] のまま — まだ2次元
  sheet.getRange("A2:C2").setValues(sourceValues);
}

シナリオ5:単一セルへの書き込み

単一セルへの書き込みには、よりシンプルな選択肢があります。setValue()('s'なし)はプレーンな値を受け取ります。setValues() を使う場合は、二重括弧が必要です。

// オプションA — 1セルの場合はこちらが簡潔
sheet.getRange("A1").setValue(42);

// オプションB — setValues() でも2次元配列が必要
sheet.getRange("A1").setValues([[42]]);

デバッグチェックリスト

配列の形状が不明な場合は、呼び出しの前にログ出力して確認しましょう:

var values = buildMyArray(); // ロジックに応じた処理
Logger.log(JSON.stringify(values));
Logger.log("Is array: " + Array.isArray(values));
Logger.log("Is 2D: " + Array.isArray(values[0]));

var numRows = values.length;
var numCols = values[0].length;
Logger.log("Dimensions: " + numRows + " rows x " + numCols + " cols");

// その後、範囲がその次元と一致することを確認する
sheet.getRange(startRow, startCol, numRows, numCols).setValues(values);

範囲の次元は正確に一致する必要があります。3×2 の配列には3行2列の範囲が必要です。サイズの不一致は別のエラーをスローしますが、まず2次元構造を正しく整えることで、この特定のエラーは解消されます。

修正の確認

  • スクリプトエディタを開きます:スプレッドシート内で 拡張機能 → Apps Script
  • ▶ ボタンまたは Ctrl+R で関数を実行します。
  • 実行ログ(表示 → ログ)を確認します。例外がなければ呼び出しは成功しています。
  • スプレッドシートに戻り、対象セルに正しい値が入力されていることを確認します。

クイックリファレンス

  • 1行・複数列:[[val1, val2, val3]]
  • 複数行・1列:[[val1], [val2], [val3]]
  • 複数行・複数列:[[a1, b1], [a2, b2], [a3, b3]]
  • setValues で単一セル:[[val]]
  • 単一セルのショートカット:setValue(val) — 括弧不要

Related Error Notes