LoginSignup
23
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-21

 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と同じことか。

23
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
26