GASで1次元配列を2次元配列に変換する方法~setValuesでスプレに書き込み

Google Apps Script(GAS)ではスプレッドシートからデータ読み込み・書き込みで2次元配列を使うケースが多いです。

ただ、GASスクリプトでセルに書き込みたいのが1次元配列の場合があります。

そこで、GASで1次元配列を2次元配列に変換する方法を解説します。

GASでスプレッドシート読み書きは2次元配列で

Google Apps Script(GAS)で最も連携するアプリケーションは、表計算のスプレッドシートです。

GASのスクリプトでスプレッドシートのセルから値を読み込んだり、処理結果をセルに書き込んだりします。

ただ、setValueやgetValueでセルの書き込み・読み込みを1個ずつ行うと、処理負荷が大きいです。

そのため、setValues/getValuesで複数セルをまとめて取得・書込することを推奨されています。

スプレッドシートのセルに一括でデータを書き込むにはsetValuesの引数で2次元配列を指定する必要です。

1次元配列はエラーするため、2次元配列に変換

1次元配列のまま、GASのsetValuesメソッドでスプレッドシートに書き込もうとすると、実行エラーとなってしまいます。

1次元配列のデータをスプレッドシートに記録したい場合は、1セルずつ書き込むか、2次元配列に変換する必要があります。

ただ、前者の1セルずつ書き込む場合、何度もGASでスプレッドシートのAPIを使って書き込むため、処理負荷が大きいです。

function writeArrayToSheet() {
  //1次元配列を定義
  let array1D = ["りんご","みかん","いちご","ぶどう"];
  //1次元配列のままスプレッドシートに書き込むには1個ずつsetValue実行
  for(let i=0;i<array1D.length;i++){
    SpreadsheetApp.getActiveSheet().getRange(1+i,1).setValue(array1D[i]);
  }
}

数十個のデータであれば問題ありませんが、数が大きくなった場合には、処理時間も増えて、実行制限時間の6分をオーバーする恐れがあります。

そのため、GASのスクリプトで1次元配列を2次元配列に変換し、スプレッドシートに一括で書き込むやり方がオススメです。

GASで1次元配列を2次元配列に変換する方法

実際にGoogle Apps Script(GAS)で1次元配列を2次元配列に変換する方法を解説します。

GASでの1次元→2次元配列への変換方法は以下の2通りがあります。

  • 1行のコードで簡単に1次元配列を2次元配列に変換
  • 1次元配列の要素を2次元配列の行方向に格納

それぞれの変換手順を説明していきます。

①最も簡単な1次元配列→2次元配列の変換手順

最も簡単に1次元配列を2次元配列に変えるには、1次元配列を配列の括弧[]で囲う形です。

 let array1D = ["りんご","みかん","いちご","ぶどう"];
 let array2D = [array1D];

たった1行で2次元配列の変数array2Dに変換できます。

実行ログ結果を確認すると、1次元配列だったものが、2次元配列として出力されています。

さらに、array2D[0][2]という形式で値が取得できていることが確認できます。

1次元配列から2次元配列に変換できたことで、スプレッドシートでsetValuesメソッドで書き込みが可能です。

setValuesのメソッドの引数に1次元配列を指定するとエラーしていましたが、2次元配列化したことでGASスクリプトが正常に実行されました。

スプレッドシートを確認すると、配列のデータがセルに書き込みできています。

この方法はGASのコード1行で2次元配列に変換できるのがメリットですが、スプレッドシートに書き込むと列方向にデータが出力されます。

今回のGASサンプルコードでは、2次元配列に以下のようにデータが格納されます。

  • array2D[0][0]="りんご"
  • array2D[0][1]="みかん"
  • array2D[0][2]="いちご"
  • array2D[0][3]="ぶどう"

ただ、スプレッドシートの行方向にデータを出力する場合に適していません。

②1次元配列の要素を2次元配列の行方向に格納する方法

そこで2つ目の1次元配列→2次元配列の変換方法も紹介します。

この変換方法は、forループを使い、1次元配列の要素を2次元配列の行方向に格納していきます。

function convertArray() {
  let array1D = ["りんご","みかん","いちご","ぶどう"];
  let array2D = [];
  for(i=0;i<array1D.length;i++){
    array2D[i]=[array1D[i]];
  }
  SpreadsheetApp.getActiveSheet().getRange(1,1,array2D.length, array2D[0].length).setValues(array2D);
}

forループで配列の要素の数だけ処理を繰り返し、1次元配列の要素を2次元配列として格納していきます。

1つ目の方法と比べ、GASのコード記述量は増えますが、スプレッドシートの行方向に出力することができます。

スプレッドシートの行方向に1次元配列のデータを書き込むことができました。

1次元配列から2次元配列にどのような形式で変換したいかという要件に応じて、2種類の方法を使い分けましょう。

2次元配列を1次元配列に変換するには?

Google Apps Script(GAS)で1次元配列を2次元配列に変換する方法を紹介してきましたが、逆に2次元配列を1次元配列に変換したい場合もあります。

その場合、GASに用意された配列オブジェクトで利用可能なflatメソッドを使うことで実現可能です。

GASで2次元配列を1次元配列に変換する方法を以下の記事で解説しています。

元々2次元配列だったものを1次元配列に変換したい場合は、flatメソッドを活用しましょう。

まとめ・終わりに

今回、Google Apps Script(GAS)で1次元配列を2次元配列に変換する方法を紹介しました。

GASスクリプトではスプレッドシートとの連携して利用しますが、スプレッドシートに一括で値を書き込む場合、2次元配列を引数に指定する必要があります。

そのため、1次元配列の変数をスプレッドシートのセルにsetValuesメソッドで書き込みたい場合は、2次元配列に変換しなければいけません。

最もシンプルなのは、1次元配列の変数を配列の括弧[]で囲う方法ですが、この場合、列方向に1次元配列が格納され、スプレッドシートも横方向にデータが書き込まれます。

もし、行方向に1次元配列の要素を格納したい場合は、forループで逐次処理して2次元配列に変換します。

setValuesメソッドでスプレッドシートのセルに、1次元配列のデータを一括で書き込みたい場合に、1次元配列を2次元配列に変換しましょう。