<スポンサーリンク>

【GAS入門】2次元配列の結合方法。unshift,push,concatの使い方

この記事は約5分で読めます。
コピーボタン
記事のタイトルとURLをコピー
スポンサーリンク

【GAS入門】2次元配列の結合方法。unshift,push,concatの使い方

<スポンサーリンク>

スプレッドシートで、GASを使っていくうえで、非常に重要になるのが

・二次元配列を使えるかどうか?

です。

というのも、20回掛け算する場合、
・セル毎に計算 → 4.4秒
・配列で計算 → 0.2秒

と、20倍もの差が生じます。
というか、セル毎に計算となると、正直使い物にならないくらい遅いです。。
5個セルを更新しただけで1秒かかります…

しかし、二次元配列は、正直理解しづらく苦戦すると思います。

そこで今回は、二次元配列をより簡単に作成するための
「push」「unshift」「concat」について説明していきます。

push

まずはpushからです。

プッシュのイメージは、下記の通りで、
配列と配列を縦に合体させます。

FOR分と一緒に使うと非常に使い勝手が良いです。

1列目~10列目まで、足し算、掛け算を繰り返していく場合、
下記のようにpushを用いることで、配列に計算結果が追加されていきます。

 for(var i=1;i<=10;i++){  
   足し算=sh1.getRange(i,3).getValue()+sh1.getRange(i,4).getValue()
   掛け算=sh1.getRange(i,3).getValue()*sh1.getRange(i,4).getValue()
   計算結果.push([足し算,掛け算])
 }  

・1行目の[足し算1,掛け算1]に
pushで2行目の[足し算2,掛け算2]を追加。

・[足し算1,掛け算1]
 [足し算2,掛け算2] に
pushで3行目の[足し算3,掛け算3]を追加。・・・・

と10行目まで計算していくイメージです。

上記のプログラムを参考に、
①足し算、引き算を自分が計算したいものに変え、
②iを、行の初め~終わりまでに設定することで、
簡単に行の初めから行の終わりまでの計算を行い、配列に代入することができます。

unshift

次はunshiftです。

unshiftはpushと似ていますが、配列を前方に結合することができます。

計算式によっては、行をさかのぼって計算させたいこともあるかと思いますので、その場合は、このunshiftを用いるとうまくいくと思います。

concat

つぎはconcatです。

CONCATは、pushやunshiftとは違い、配列の要素を結合する数式です。

一見、pushやunshiftと同じように見えるのですが、pushで同じようなことを行うと、下に示す通り、配列そのものを挿入してしまうことになり、3次元配列になってしまいます。

少しわかりにくいので、もう少し説明すると、

・concatの場合
結合結果[0][4]=A7
が出力されますが、

・pushで記述した場合、
結合結果[0][4]=A7,B7,C7,D7
と出力されてしまいます。

pushで記述した場合に、A7を取り出したいときは、
結合結果[0][4][1]=A7
となり、3次元的に指示をしないといけないことになります。

spreadseatに張り付ける際には、二次元配列である必要があるので、これでは成立しませんので、concatで要素を追加する必要があります。

setvaluesについて

push,unshift,concatについて学んできましたが、
ここで一つ問題が生じます。

それは、「列数がバラバラになる可能性があることです。」
setvaluesで二次元配列をセルに転記する場合、

・列数がすべて一致している。
且つ
・行数、列数をきちんと指定してあげる

必要があります。

行数は、【二次元配列.length】で簡単に確認することができるのですが、
列数はそう簡単にいきません。。

先ほど説明したpushで作り上げた配列をsetvaluusでspreadsheetに記載しようとすると、

下記の通り、【データの列と指定の範囲が違う。】エラーが発生してしまいます。

このエラーを防ぐためには、列数をそろえてあげる必要があります。

列右数を合わせたイメージ

push,unshift,concatなどをした後に、spreadsheetに張り付ける場合は、
下に示すようなコードで、二次元配列を変換してあげてから貼り付ける必要があります。

    for(var i=0;i<valArray.length;i++){
    var cn=valArray[i].length
    if(cn>maxc){maxc=cn}
    }

  for(var i=0;i<valArray.length;i++){
      valArray[i].length=maxc
    }
   
   sh1.getRange(指定行, 指定列, valArray.length,maxc).setValues(valArray);

以上のコードで、おこなっていることは非常に単純で、
・二次元配列の1行目から、一番長い列の数(maxc)を見つけ出します。
・列数をすべて一番長い列(maxc)に変換します。
・行数、列数がわかったので、シートの指定位置に貼り付けます。
の3ステップです。

ここまでできて、配列の操作については、完了すると思います。

まとめ

VBAにも言えることなのですが、

・プログラムを早く動かすためには、とにかく「配列」を用いて、
 セルへの値の記載を極力減らすことが重要です。

スプレッドシートのgasについては、特にその傾向が顕著になりますので、
push,unshift,concatを用いて、超高速化していきましょう!

コメント欄

<スポンサーリンク>
タイトルとURLをコピーしました