Google Apps Scriptで多次元配列から一次元配列にする

うーん。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列の値しか扱わないのに多次元配列で処理すると余計なコードを書かないといけなくなるからです。

コメント

タイトルとURLをコピーしました