【GAS】一次元配列を二次元配列に変換する
Google Apps Script(GAS)で配列を扱う際、保持している一次元配列を二次元配列に変換してスプレッドシートシートに書き込きこみたい、逆にスプレッドシートシートから取得したデータは二次元配列なので一次元配列として処理したいなど、一次元配列と二次元配列を相互に変換したいシーンが出てきます。
この記事ではGASにおいて、一次元配列を二次元配列に変換する方法をご紹介します。
二次元配列から一次元配列に変換する方法は下記の記事で解説しています。
スプレッドシートと二次元配列
まず前提の確認ですが、GASではスプレッドシートシートから取得したデータはそれが一行分、一列分のデータだったとしても二次元配列としてデータが取得されることになります。
let ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let range = ss.getRange('A2:D2');
let values = range.getValues();
console.log(values); //[ [ 'ハンバーグ', 1000, 12, 12000 ] ]
let ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let range = ss.getRange('A2:A7');
let values = range.getValues();
//各セルの値が単一要素となった配列の二次元配列
console.log(values); //[ [ 'ハンバーグ' ], [ 'スープ' ], [ 'カレー' ], [ 'シチュー,' ], [ 'スパゲッティ' ], [ 'オムライス' ] ]
また、スプレッドシートシートに書き込むためのデータは二次元配列でなければならず、一次元配列を書き込もうとするとエラーを返します。
let ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let range = ss.getRange('A2:D2');
//一次元配列でsetValuesを呼び出すと失敗する
let array = ['ハンバーグ', 1000, 12, 12000];
range.setValues(array);//Exception: The parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues.
// //二次元配列でsetValuesを呼び出すと成功する
// let array = [['ハンバーグ', 1000, 12, 12000]];
// range.setValues(array);
スプレッドシートシートの範囲を指定して書き込むsetValue、setValuesの他に、「最終行に一行書き込み」ための専用メソッドであるappendrowが存在します。appendrowメソッドはsetValue、setValuesと同様にスプレッドシートシートにデータを書き込むためのメソッドですが、一次元配列のみを引数として呼び出すので注意が必要です。二次元配列を引数に与えるとエラーになります。
一次元配列から二次元配列への変換方法
いくつかのシーンに分けて記述方法をご紹介します。
元の一次元配列を単一要素とした二次元配列に変換する
let array_1 = ['ハンバーグ', 'スープ', 'カレー', 'シチュー,', 'スパゲッティ','オムライス'];
let array_2 = [array_1];
console.log(array_2); //[ [ 'ハンバーグ', 'スープ', 'カレー', 'シチュー,', 'スパゲッティ', 'オムライス' ] ]
複数の一次元配列を並べて二次元配列に変換する
let array_1 = ['ハンバーグ', 'スープ', 'カレー', 'シチュー,', 'スパゲッティ','オムライス'];
let array_2 = ['きゅうり', 'なす', 'もろへいや', 'とまと', 'おくら', 'きゃべつ'];
let array_3 = [array_1, array_2];
console.log(array_3); //
// [ [ 'ハンバーグ', 'スープ', 'カレー', 'シチュー,', 'スパゲッティ', 'オムライス' ],
// [ 'きゅうり', 'なす', 'もろへいや', 'とまと', 'おくら', 'きゃべつ' ] ]
一要素ずつの二次元配列に変換する
let array_1 = ['ハンバーグ', 'スープ', 'カレー', 'シチュー,', 'スパゲッティ','オムライス'];
let array_2 = [];
array_1.forEach(value => array_2.push([value]));
console.log(array_2); //[ [ 'ハンバーグ' ], [ 'スープ' ], [ 'カレー' ], [ 'シチュー,' ], [ 'スパゲッティ' ], [ 'オムライス' ] ]
要素数を指定して二次元配列に変換する(spliceメソッド)
//要素数2の場合
let array_1 = ['ハンバーグ', 'スープ', 'カレー', 'シチュー,', 'スパゲッティ','オムライス'];
let array_2 = [];
let numOfElements = 2;
for(let i = 0; 0 < array_1.length; i){
array_2.push(array_1.splice(i, numOfElements));
}
console.log(array_2); // [ [ 'ハンバーグ', 'スープ' ], [ 'カレー', 'シチュー,' ], [ 'スパゲッティ', 'オムライス' ] ]
//要素数3の場合
let array_1 = ['ハンバーグ', 'スープ', 'カレー', 'シチュー,', 'スパゲッティ','オムライス'];
let array_2 = [];
let numOfElements = 3;
for(let i = 0; 0 < array_1.length; i){
array_2.push(array_1.splice(i, numOfElements));
}
console.log(array_2); //[ [ 'ハンバーグ', 'スープ', 'カレー' ], [ 'シチュー,', 'スパゲッティ', 'オムライス' ] ]
let array_1 = ['ハンバーグ', 'スープ', 'カレー', 'シチュー,', 'スパゲッティ','オムライス'];
let array_2 = [];
let numOfElements = 4;
for(let i = 0; 0 < array_1.length; i){
array_2.push(array_1.splice(i, numOfElements));
}
console.log(array_2); // [ [ 'ハンバーグ', 'スープ', 'カレー', 'シチュー,' ], [ 'スパゲッティ', 'オムライス' ] ]
まとめ
GASにおける一次元配列から二次元配列に変換する方法をシーン別でご紹介しました。