【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を用いて、超高速化していきましょう!
コメント欄