Edited at

【GAS】エラー「ArrayをObject[][]に変換できません。」に遭遇したら・・・

More than 1 year has passed since last update.

 GASでたまに遭遇するエラーですが直面して悩んでいる人向けに投稿しておきます。

 1次元配列を定義し、シート上の特定の範囲に一気にsetValues()しようとしたり、シートから特定の範囲のデータをスクリプト上にgetValues()で引っ張ってきて、いろいろと加工してまたシート上の特定の範囲にsetValues()させようとする場合にうっかりやってしまいがちなミスです。

 たとえば以下は失敗例で標題のようなエラーが表示されるはずです。


コード.gs


var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();

function test() {
var fruits = ["オレンジ","ぶどう","バナナ"];
sh.getRange(1,1,fruits.length,1).setValues(fruits);
}


 これは最初から2次元配列として定義するか、1次元配列を2次元配列化してからsetValuse()して解決します。


コード.gs


// 最初から2次元配列として定義する
function test() {
var fruits = [["オレンジ"],["ぶどう"],["バナナ"]];
sh.getRange(1,1,fruits.length,1).setValues(fruits);
}

// 2次元配列化してからsetValuse()に渡す
function test() {
var fruits = ["オレンジ","ぶどう","バナナ"];
var ary = [];
for (var i=0; i<fruits.length; i++) {
ary.push([fruits[i]]);
}
sh.getRange(1,1,ary.length,1).setValues(ary);
}


 2次元配列化する場合、[fruits[i]]のところ、単にfruits[i]とやってしまいがちなので注意が必要となります。空の配列に配列をpushしないと2次元配列になりませんので。[]で包んで配列としてpushします。シートの見た目は1列、1行でも2次元配列じゃないとうまく渡せないところが最初のうちはうっかりハマってしまいがちかなと思います。

 ちなみに上記は縦に展開することを前提にしていますが、横に展開したい場合は以下の通り。


コード.gs


// 最初から2次元配列として定義する
function test() {
var fruits = [["オレンジ","ぶどう","バナナ"]];
sh.getRange(1,1,1,fruits[0].length).setValues(fruits);
}

// 2次元配列化してからsetValuse()に渡す
function test() {
var fruits = ["オレンジ","ぶどう","バナナ"];
var ary = [[]];
for (var i=0; i<fruits.length; i++) {
ary[0].push(fruits[i]);
}
sh.getRange(1,1,1,ary[0].length).setValues(ary);
}


 横に展開というのはこうゆうことです。あまり使う機会はありませんが、タイトル行をまとめて渡したい場合などに使うかと思います。

スクリーンショット 2016-09-24 14.39.21.png

 要するに、A1は[0][0]、A2は[1][0]、A3は[2][0]、B1は[[0][1]、C1は[0][2]といった具合に、[行][列]というふうに考えておけばよいだけかなと思っています。R1C1と同じことか。