こんにちは!
Yuki (@yukibnb) です。
Google Apps Script (GAS) で二次元配列に対してfor文などでループをする際に、どのような順序で二次元配列内の要素が処理されるかを画像や動画を用いて視覚的に紹介します。
「getValuesで二次元配列を作成した。〇列のデータを全て◇したいけど、どのようにループすればいいかわからない」というような方の参考になると思います。
おさらい
ループの前にまずスプレッドシートの値をgetValuesで取得する方法と、取得した二次元配列の要素を指定する方法をおさらいします。
おさらいが不要の方は次の項目まで飛ばしてください。
getValuesで二次元配列を作成する
今回は上記スプレッドシートをサンプルとして使用します。
A1~D5までの表の値を二次元配列productListに格納しましょう。
//アクティブなスプレッドシート -> アクティブなシートを取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getActiveSheet(); //A1~D5を二次元配列で取得 var productList = sh.getRange(1,1,5,4).getValues();
A1~D5の範囲はgetRange(1,1,5,4)
で指定しました。
そしてgetValuesを使い、getRangeで指定した範囲(A1~D5)の値をproductListに二次元配列として格納しました。
productListは現在以下のような二次元配列になっています。スプレッドシートの表と同じような見た目ですね。
getRangeやgetValuesのより詳しい解説については以下記事をご覧ください。
www.yukibnb.com
二次元配列の値を指定(取得)する
二次元配列productListに格納されたデータを指定する方法は上記2種類あります。
ひとつめの「二次元配列内の一次元配列を丸々指定したい場合」というのは、["A03","peach","200","China"]
のような[ ]を丸々指定することです。
[ ]内に行のインデックス番号を入力すると[ ]を丸々指定できます。
ふたつめの「二次元配列内の一次元配列の要素を指定したい場合」というのは、"orange"
のような値を指定することです。
[行][列]のイデックス番号を入力すると値を指定できます。
二次元配列のより詳しい解説については以下記事をご覧ください。
www.yukibnb.com
ループの処理順序を徹底解説
おまたせしました!ここからは二次元配列のループの処理順序を見ていきましょう。
for文でループを書く時の変数はiやjが一般的ですが、この記事では理解しやすいようにrとcを使用します。
- r ⇒ row (行) のr
- c ⇒ column (列) のc
二次元配列内の一次元配列をループしたい場合
for(var r = 0; r < productList.length; r++) { /* 処理 */ //ログ Logger.log(productList[r]); } }
二次元配列内の一次元配列をループしたい場合、[ ]が一つだけなのでシンプルです。
特定の列の値のみ処理したい場合
for(var r = 0; r < productList.length; r++) { /* 処理 */ Logger.log(productList[r][2]); }
例えばPrice(JPY)の列の値のみを処理したい場合、上記のようになります。
Price(JPY)の列はインデックス番号2で固定なので列はループする必要はありません。
行のインデックス番号のみループします。
特定の行の値のみ処理したい場合
for(var c = 0; c < productList[0].length; c++) { /* 処理 */ Logger.log(productList[1][c]); }
例えばA01の行の値のみを処理したい場合、上記のようになります。
A01の行はインデックス番号1で固定なので行はループする必要はありません。
列のインデックス番号のみループします。
すべての値をZ字の順番で処理したい場合
//[r](行)のループの中に[c](列)のループを入れる for(var r = 0; r < productList.length; r++) { for(var c = 0; c < productList[r].length; c++) { /* 処理 */ Logger.log(productList[r][c]); } }
すべての値を処理したい場合、ループをふたつ使う必要があります。
Z字の順番で処理するには行のループの中に列のループを入れます。
※for文の中にさらにfor文を入れることを「for文をネストする」や「for文を入れ子にする」と言います。
- 外側のループ: 行
- 内側のループ: 列
この場合、内側のループ(列)が終わると外側のループ(行)が進みます。
すべての値をN字の順番で処理したい場合
//[c](列)のループの中に[r](行)のループを入れる for(var c = 0; c < productList[0].length; c++) { for(var r = 0; r < productList.length; r++) { /* 処理 */ Logger.log(productList[r][c]); } }
N字の順番で処理するには列のループの中に行のループを入れます。
- 外側のループ: 列
- 内側のループ: 行
この場合、内側のループ(行)が終わると外側のループ(列)が進みます。
まとめ
今回はGoogle Apps Script (GAS) で二次元配列をループする際の処理順序を視覚的に紹介しました。
二次元配列のループは頭でわかっていてもこんがらがることがあるので、そういう時に本記事が参考になればうれしいです。