Help us understand the problem. What is going on with this article?

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

More than 3 years have 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と同じことか。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした