うーん。Google Apps ScriptのgetRange()メソッドって多次元配列を返すのか厄介だな…。
正確に言えばgetRange()メソッドはGoogle Sheetsの特定の範囲(セルまたはセルの集合)を表すRange
オブジェクトを返します。そしてこのRangeオブジェクトに対してよく使うのがgetValues()メソッドです。getValues()メソッドでセルの値を取得できるのですが、これの返り値が多次元配列(二次元配列)になっていってこのデータを処理したいときに一次元配列にしたいことがあります。
getValues()メソッドの返り値を確認
以下に簡単なデータを用意しました。
こちらのA1からA3までの値を取得してみます。
function myFunction() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
let values = sheet.getRange("A1:A3").getValues()
console.log(values) //[ [ 'hoge' ], [ 'fuga' ], [ 'sample' ] ]
}
Rangeオブジェクトに対してgetValues()を使うと多次元配列が返ってきているのがわかると思います。
map()を使って一次元配列にする。
function myFunction() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
const values = sheet.getRange("A1:A3").getValues()
const mapArray = values.map((value, index, array) => {
return value[0];
});
console.log(mapArray) //[ 'hoge', 'fuga', 'sample' ]
}
map()
メソッドは、JavaScriptの配列オブジェクトのメソッドで、配列内の各要素に対して指定された関数を適用し、その結果から新しい配列を生成します。上記のコードの場合value[0]を返すようにしているのでこれで一次元配列にできます。ただしこの方法ではA以外の列の値も取得する場合、map()でvalue[0]を返すようにしているのでA列の値しか取得できないことになります。
map()の例を紹介しましたがGoogle Apps Scriptで多次元配列から一次元配列にしたい場合は基本的にはflat()を使います。
flat()を使って多次元配列から一次元配列にする
Google Apps Scriptで多次元配列から一次元配列に変換する場合は flat() を使うのが最も簡単な方法です。
function myFunction() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
const values = sheet.getRange("A1:A3").getValues().flat()
console.log(values); //[ 'hoge', 'fuga', 'sample' ]
}
ちなみにB列の値も取得して flat() を使ったらどのような値が返ってくるのかを見ておきましょう。データは以下のようなデータを使用します
function myFunction() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
const values = sheet.getRange("A1:B3").getValues().flat()
console.log(values); //[ 'hoge', 'hogehoge', 'fuga', 'fugafuga', 'sample', 'samplesample' ]
}
複数列の値を取得した場合もflat()を使えばすべてが一次元配列になっているのがわかります。
まとめ
Google Apps Scriptで多次元配列から一次元配列にしたい場合は flat() を使いましょう。
どのようなときに一次元配列にするかですが、私の場合は1列のデータしか扱わない場合に一次元配列にすることが多いです。1列の値しか扱わないのに多次元配列で処理すると余計なコードを書かないといけなくなるからです。
コメント