【GAS】二次元配列の結合(縦の結合 / 横の結合 / 要素同士の結合)

GASconcat,二次元配列,結合

この記事では二次元配列の結合方法をご紹介します。

一次元配列の結合については下記の記事で解説しています。

結合方法3選

二次元配列 array1、array2を結合し、新たな二次元配列array3を作成します。今回ご紹介する結合方法は下記の3手法です。

①2つの二次元配列を縦に結合する(concatメソッド)
②2つの二次元配列を横に結合する(ループ処理をしながらconcatメソッド)
③2つの二次元配列の要素同士を結合する(ループ処理をしながら文字列結合)

2つの二次元配列を縦に結合する

Array1.concat(Array2)

複数の配列を縦に結合するにはconcatメソッドを使います。

  let array1= [ [ 'a1', 'b1', 'c1' ],
                [ 'a2', 'b2', 'c2' ],
                [ 'a3', 'b3', 'c3' ],
                [ 'a4', 'b4', 'c4' ],
                [ 'a5', 'b5', 'c5' ] ];

  let array2= [ [ 'A1', 'B1', 'C1', 'D1' ],
                [ 'A2', 'B2', 'C2', 'D2' ],
                [ 'A3', 'B3', 'C3', 'D3' ] ];
  let array3 = array1.concat(array2);
  console.log(array3);

// [ [ 'a1', 'b1', 'c1' ],
  // [ 'a2', 'b2', 'c2' ],
  // [ 'a3', 'b3', 'c3' ],
  // [ 'a4', 'b4', 'c4' ],
  // [ 'a5', 'b5', 'c5' ],
  // [ 'A1', 'B1', 'C1', 'D1' ],
  // [ 'A2', 'B2', 'C2', 'D2' ],
  // [ 'A3', 'B3', 'C3', 'D3' ] ]

リストで並べることで3つ以上の配列を一度に結合することも可能です。

Array1.concat(Array2 [, Array3])

  let array2_2= [ [ 'A4', 'B4', 'C4', 'D4', 'E1' ],
                [ 'A5', 'B5', 'C5', 'D5', 'E2' ],
                [ 'A6', 'B6', 'C3', 'D6', 'E3' ] ];

  let array3 = array1.concat(array2, array2_2);
  console.log(array3);

// [ [ 'a1', 'b1', 'c1' ],
//   [ 'a2', 'b2', 'c2' ],
//   [ 'a3', 'b3', 'c3' ],
//   [ 'a4', 'b4', 'c4' ],
//   [ 'a5', 'b5', 'c5' ],
//   [ 'A1', 'B1', 'C1', 'D1' ],
//   [ 'A2', 'B2', 'C2', 'D2' ],
//   [ 'A3', 'B3', 'C3', 'D3' ],
//   [ 'A4', 'B4', 'C4', 'D4', 'E1' ],
//   [ 'A5', 'B5', 'C5', 'D5', 'E2' ],
//   [ 'A6', 'B6', 'C3', 'D6', 'E3' ] ]
スプレッドシートに書き込む場合は、結合後の二次元配列の要素となっている一次元配列の長さを合わせる

配列を結合してからスプレッドシートに書き込む場合は注意が必要です。
スプレッドシートに書き込むためのsetValuesメソッドは各行の列数(二次元配列の要素である各一次元配列の長さ)が一致していないとエラーになるためです。結合元となっている二次元配列の要素の長さが異なる場合は、結合後の配列では統一させておく必要があります。

range.setValues(array3);

Exception: The number of columns in the data does not match the number of columns in the range. The data has 4 but the range has 3.

例えば下記のように、要素がないセルには空要素を入れることで解決できます。

//結合後二次元配列の最大列数の取得
//結合後二次元配列の要素数分ループして、最大列数を変数colに格納
  let col = 0;
  array3.forEach(function(array){
    if(col<array.length){
      col = array.length
    }
  })

  // console.log(col); 4

//最大列数に満たない要素は、空の要素を足りない分だけ配列に格納
  array3.forEach(function(array){

    for(let i=0; i < col - array.length; i++){
      array[array.length + i] = [];
      console.log(array)
    }
  })
  
  console.log(array3);

// [ [ 'a1', 'b1', 'c1', [] ],
  // [ 'a2', 'b2', 'c2', [] ],
  // [ 'a3', 'b3', 'c3', [] ],
  // [ 'a4', 'b4', 'c4', [] ],
  // [ 'a5', 'b5', 'c5', [] ],
  // [ 'A1', 'B1', 'C1', 'D1' ],
  // [ 'A2', 'B2', 'C2', 'D2' ],
  // [ 'A3', 'B3', 'C3', 'D3' ] ]
range.setValues(array3);

縦結合については以上です。

2つの二次元配列を横に結合する

一発で横結合できるメソッド等はないため、元の二次元配列を1要素ずつ読み込んで処理する必要があります。反復処理方法はいくつかあるため、下記のパターン別のサンプルコードを参考に使いやすいメソッドや関数を使ってみてください。

パターンA

下記は for inを用いて配列のインデックス番号を引数とし、元となる二次元配列内の一次元配列同士を結合する反復処理を行っています。

  let array3 = new Array();

  for(i in array1){

    if(array2[i]){
     array3[i] = array1[i].concat(array2[i]);
    }else{
     array3[i] = array1[i];
    };
  };

  console.log(array3);

// [ [ 'a1', 'b1', 'c1', 'A1', 'B1', 'C1', 'D1' ],
  // [ 'a2', 'b2', 'c2', 'A2', 'B2', 'C2', 'D2' ],
  // [ 'a3', 'b3', 'c3', 'A3', 'B3', 'C3', 'D3' ],
  // [ 'a4', 'b4', 'c4' ],
  // [ 'a5', 'b5', 'c5' ] ]

パターンB

  let array3 = new Array();

  for(i in array2){

    if(array1[i]){
      array3[i] = array1[i].concat(array2[i]);
    }else{
      array3[i] = array2[i];
    };
  };

  console.log(array3);

// [ [ 'a1', 'b1', 'c1', 'A1', 'B1', 'C1', 'D1' ],
  // [ 'a2', 'b2', 'c2', 'A2', 'B2', 'C2', 'D2' ],
  // [ 'a3', 'b3', 'c3', 'A3', 'B3', 'C3', 'D3' ],
  // [ 'a4', 'b4', 'c4', 'A4', 'B4', 'C4', 'D4' ],
  // [ 'a5', 'b5', 'c5', 'A5', 'B5', 'C5', 'D5' ],
  // [ 'A6', 'B6', 'C3', 'D6' ] ]

パターンC

  let array3 = new Array();

  array1.forEach(function(array1_element, i){

    if(array2[i]){
      array3[i] = array1_element.concat(array2[i]);
    }
 
  });

  console.log(array3);

  // [ [ 'a1', 'b1', 'c1', 'A1', 'B1', 'C1', 'D1' ],
  //   [ 'a2', 'b2', 'c2', 'A2', 'B2', 'C2', 'D2' ],
  //   [ 'a3', 'b3', 'c3', 'A3', 'B3', 'C3', 'D3' ] ]

2つの二次元配列の要素同士を結合する

  let array1= [ [ 'a1', 'b1', 'c1' ],
                [ 'a2', 'b2', 'c2' ],
                [ 'a3', 'b3', 'c3' ],
                [ 'a4', 'b4', 'c4' ],];

  let array2= [ [ 'A1', 'B1', 'C1',],
                [ 'A2', 'B2', 'C2',],
                [ 'A3', 'B3', 'C3',],
                [ 'A4', 'B4', 'C4',] ];
  let array3 = new Array();

  for(i in array1){

    array3[i] = new Array();

    for(j in array1[i]){
      array3[i][j] = array1[i][j] + array2[i][j];
    };

  };

  console.log(array3);

// [ [ 'a1A1', 'b1B1', 'c1C1' ],
  // [ 'a2A2', 'b2B2', 'c2C2' ],
  // [ 'a3A3', 'b3B3', 'c3C3' ],
  // [ 'a4A4', 'b4B4', 'c4C4' ] ]

文字列要素同士であれば「+演算子」で結合できます。

まとめ

いくつかパターンに分けて二次元配列同士の結合方法をご紹介しました。

この記事を書いた人

てつお
広告代理店出身、事業会社でWebマーケティングや開発の仕事をしている26歳です。プロフィール詳細はこちら
■Google広告認定資格|Google アナリティクス個人認定資格(GAIQ)|TOEIC920点