Yuki's bnb blog

こんにちは!Yukiといいます。本業のかたわら大阪で2016年夏から民泊運営のお手伝いをしています。民泊業務に関する様々なことを自動化・効率化したいと思い日々活動しています。 お気軽にコメント・お問い合わせください :) TOEICスコア 985

【初心者向けGAS】二次元配列のループの処理順序を徹底解説

f:id:yukibnb:20200127125222p:plain

こんにちは!
Yuki (@yukibnb) です。

Google Apps Script (GAS) で二次元配列に対してfor文などでループをする際に、どのような順序で二次元配列内の要素が処理されるかを画像や動画を用いて視覚的に紹介します。

「getValuesで二次元配列を作成した。〇列のデータを全て◇したいけど、どのようにループすればいいかわからない」というような方の参考になると思います。

 

おさらい

ループの前にまずスプレッドシートの値をgetValuesで取得する方法と、取得した二次元配列の要素を指定する方法をおさらいします。

おさらいが不要の方は次の項目まで飛ばしてください。

getValuesで二次元配列を作成する

f:id:yukibnb:20200127130153p:plain
 
今回は上記スプレッドシートをサンプルとして使用します。

A1~D5までの表の値を二次元配列productListに格納しましょう。

//アクティブなスプレッドシート -> アクティブなシートを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
  
//A1~D5を二次元配列で取得
var productList = sh.getRange(1,1,5,4).getValues();

 
f:id:yukibnb:20200127131111p:plain

 
A1~D5の範囲はgetRange(1,1,5,4)で指定しました。

そしてgetValuesを使い、getRangeで指定した範囲(A1~D5)の値をproductListに二次元配列として格納しました。

productListは現在以下のような二次元配列になっています。スプレッドシートの表と同じような見た目ですね。
f:id:yukibnb:20200127131730p:plain

getRangeやgetValuesのより詳しい解説については以下記事をご覧ください。
www.yukibnb.com

 

二次元配列の値を指定(取得)する

f:id:yukibnb:20200127143426p:plain

二次元配列productListに格納されたデータを指定する方法は上記2種類あります。

 
ひとつめの「二次元配列内の一次元配列を丸々指定したい場合」というのは、["A03","peach","200","China"]のような[ ]を丸々指定することです。

[ ]内に行のインデックス番号を入力すると[ ]を丸々指定できます。
f:id:yukibnb:20200127133551p:plain

 
ふたつめの「二次元配列内の一次元配列の要素を指定したい場合」というのは、"orange"のような値を指定することです。

[行][列]のイデックス番号を入力すると値を指定できます。
f:id:yukibnb:20200127133715p:plain

二次元配列のより詳しい解説については以下記事をご覧ください。
www.yukibnb.com

 

ループの処理順序を徹底解説

おまたせしました!ここからは二次元配列のループの処理順序を見ていきましょう。

for文でループを書く時の変数はiやjが一般的ですが、この記事では理解しやすいようにrとcを使用します。

  • r ⇒ row (行) のr
  • c ⇒ column (列) のc

 

二次元配列内の一次元配列をループしたい場合

f:id:yukibnb:20200127095756g:plain

for(var r = 0; r < productList.length; r++) {
  
/* 処理 */

//ログ
Logger.log(productList[r]);
}
  }

 
二次元配列内の一次元配列をループしたい場合、[ ]が一つだけなのでシンプルです。

 

特定の列の値のみ処理したい場合

f:id:yukibnb:20200126214152g:plain

for(var r = 0; r < productList.length; r++) {
          
/* 処理 */
      
Logger.log(productList[r][2]);
}

例えばPrice(JPY)の列の値のみを処理したい場合、上記のようになります。

Price(JPY)の列はインデックス番号2で固定なので列はループする必要はありません。

行のインデックス番号のみループします。

 

特定の行の値のみ処理したい場合

f:id:yukibnb:20200126214255g:plain

for(var c = 0; c < productList[0].length; c++) {
          
/* 処理 */
      
Logger.log(productList[1][c]);
}

例えばA01の行の値のみを処理したい場合、上記のようになります。

A01の行はインデックス番号1で固定なので行はループする必要はありません。

列のインデックス番号のみループします。

 

すべての値をZ字の順番で処理したい場合

f:id:yukibnb:20200127105046g:plain

//[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字の順番で処理したい場合

f:id:yukibnb:20200127102811g:plain

//[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) で二次元配列をループする際の処理順序を視覚的に紹介しました。

二次元配列のループは頭でわかっていてもこんがらがることがあるので、そういう時に本記事が参考になればうれしいです。