Google Apps Script入門
いろいろな繰り返し処理

Google Apps Script(GAS)の入門解説です
公開日:2016-10-18 最終更新日:2022-11-04

第19回.いろいろな繰り返し処理


プログラミングにおいて、最も重要で最も多く使われるのが、条件分岐と繰り返し処理です。


「条件により処理を変えながら繰り返し処理を行う」、これこそがプログラムによる自動化です。

今回は、この繰り返し処理の記述について、
ここまで説明してこなかった書き方も加えて、繰り返し処理の前提について説明します。


リファレンスにある反復処理

do...while テスト条件が偽と評価されるまで指定された文を実行するループを作成します。
この条件は文が実行されたあとに評価され、その結果少なくとも 1 回は指定された文が実行されます。
for 丸括弧で囲まれ、セミコロンで区切られた 3 つの式と、それに続くループ内で実行される文から構成されるループを作成します。
for...in オブジェクトの列挙可能なプロパティに対し任意の順番で反復処理を行います。
それぞれ個別のプロパティに対し、文を実行できます。
for...of 反復可能オブジェクト(配列、配列様のオブジェクト、イテレータとジェネレータを含む)を反復処理し、それぞれ個別のプロパティの値に対する実行文をともなった反復処理フックを呼び出します。
while テスト条件が真と評価される間、指定した文を実行するループを作成します。
この条件は文が実行される前に評価されます。

この中では、forについては、
第7回.同じ計算を行数分繰り返す
・同じ計算を行数分繰り返すとは ・前回のスクリプト ・完成スクリプト ・スクリプトの解説 ・forの詳細 ・ブロック文 ・同じ計算を行数分繰り返すの最後に
第8回.最終行を取得して繰り返す
・前回の復習 ・完成スクリプト ・スクリプトの解説 ・指定列の最終行 ・最終行を取得して繰り返すの最後に

こちらで説明しました。

上記では割愛したものに、
for each...in
と言うのもあったようで、
for...in
for...of
と合わせて、主に配列のループに使われたりしているようですが、「Legacy generator function」となっているので割愛します。

このページでは、
for
の再確認と、
do...while
while
および、
break
continue
について解説します。


繰り返し処理の例題

以下の表で、
金額 = 単価 × 数量
の計算を行う場合で説明します。

Apps Script 画像


for

for ([initialization]; [condition]; [final-expression]) {
 statement
}


initialization
式または変数宣言で、大抵はカウンタ変数を初期化するために使われます。
この式では、var キーワードを用いて新しい変数を任意で宣言してもかまいません。
これらの変数はループにローカルなものではありません。
つまり、ループの外でも有効な変数となります。

condition
ループの各反復の前に評価される式。
この式が true に評価されるなら、statement が実行されます。
この式が false に評価されるなら、実行は for の構成子に続く最初の式に飛びます。

final-expression
ループの各反復の終わりに評価される式。
これは、condition の次の評価の前に発生します。
カウンタ変数を更新または増加するために使われます。

statement
条件が true に評価される限り実行される文。

function mySample5() {
  var sheet = SpreadsheetApp.getActiveSheet()
  var tannka,suuryou,lastRow
  lastRow = sheet.getLastRow()
  for (var i=2; i<=lastRow; i++) {
    tannka = sheet.getRange(i, 2).getValue()
    suuryou = sheet.getRange(i, 3).getValue()
    sheet.getRange(i, 4).setValue(tannka * suuryou) 
  }
}

第8回.最終行を取得して繰り返す
・前回の復習 ・完成スクリプト ・スクリプトの解説 ・指定列の最終行 ・最終行を取得して繰り返すの最後に
でのスクリプトです。
詳細は、第8回を参照してください。


do...while

do {
 statement
} while (condition);


statement
少なくとも 1 回は実行され、条件が真に評価されるたびに再度実行される文。

condition
ループを通過した後ごとに評価される式。
condition が true に評価されるなら、statement は再度実行されます。
condition が false に評価されるときは、制御が do...while に続く文へ渡ります。

function mySample19_1() {
  var sheet = SpreadsheetApp.getActiveSheet()
  var tannka,suuryou,i
  i=2;
  do {
    tannka = sheet.getRange(i, 2).getValue();
    suuryou = sheet.getRange(i, 3).getValue();
    sheet.getRange(i, 4).setValue(tannka * suuryou);
    i++;
  } while (sheet.getRange(i, 1).getValue() != "");
}

指定された文は少なくとも 1回は実行されます。
つまり、必ず1回はstatementが実行され、その後に条件判定されます。
上記のスクリプトの場合、2行目にデータが無い場合でも実行されてしまいます。

do...while を使用する場面は限定的です。
時に便利な場合もありますが、
forと、次のwhile で、全て代用できるので、無理に覚える必要はないでしょう。


while

while (condition) {
 statement
}


condition
ループを通過する前ごとに評価される式。
この条件が true に評価されるなら、statement が実行されます。
条件が false に評価されるときは、while ループの後の文に実行が続きます。

statement
条件が true に評価される間実行される文。

function mySample19_2() {
  var sheet = SpreadsheetApp.getActiveSheet()
  var tannka,suuryou,i
  i=2;
  while (sheet.getRange(i, 1).getValue() != "") {
    tannka = sheet.getRange(i, 2).getValue();
    suuryou = sheet.getRange(i, 3).getValue();
    sheet.getRange(i, 4).setValue(tannka * suuryou);
    i++;
  }
}

ループに入る前に、条件が判定されます。
最初から条件が満たされなければ、1回もstatementは実行されません。


break

break;

本来は、
break [label];
であり、labelを指定できますが、使う必要が無い、というより、使わない方が良いでしょう。

プログラムがラベル付き文から抜け出すことを可能にします。
ラベル付き文はどんなブロック文でもかまいません。
ループ文である必要もありませんが、ループからの脱出に使われることが多いです。

function mySample19_3() {
  var sheet = SpreadsheetApp.getActiveSheet()
  var tannka,suuryou
  for (var i=2; i<=11; i++) {
    tannka = sheet.getRange(i, 2).getValue();
    suuryou = sheet.getRange(i, 3).getValue();
    if (tannka == "") {
      break;
    }
    sheet.getRange(i, 4).setValue(tannka * suuryou);
  }
}

上記では、単価(B列)に値が入っていなければ、forのループを抜けています
単価が空欄の行に達した時点でループを抜け、それ以降の行は佳さんしません。

ブロック文ブロックがネストされている場合は、
一番内側のプロックからだけ抜けることになります。

for (・・・) {
 for (・・・) {
  break;
  statement1
 }
 statement2
}
この場合のbreakは、
statement1を実行せずに、statement2に移ります。


continue

continue

本来は、
continue [label];
であり、labelを指定できますが、あまり使わない方が良いでしょう。

break 文とは対照的に、continue はループの実行を完全には終了しません。
代わりに、
while ループの中では、条件へ戻ります。
for ループの中では、更新式へジャンプします。
continue 文には、プログラムが現在のループの代わりにループ文の次の反復へジャンプすることを可能にします。
この場合、continue 文は、このラベル付き文(ブロック文)の中にネストされている必要があります。

function mySample19_4() {
  var sheet = SpreadsheetApp.getActiveSheet()
  var tannka,suuryou
  for (var i=2; i<=11; i++) {
    tannka = sheet.getRange(i, 2).getValue();
    suuryou = sheet.getRange(i, 3).getValue();
    if (tannka == "") {
      continue;
    }
    sheet.getRange(i, 4).setValue(tannka * suuryou);
  }
}

上記では、単価(B列)に値が入っていなければ、forに戻りループを続けます。
単価が空欄の行は飛ばして、次の行に進むという事です。
結果として、単価が空欄の行以外は全て計算されます。

ブロック文ブロックがネストされている場合は、
一番内側のプロックのラベル(for)に進みます。

for (・・・) {
 for (・・・) {
  continue;
  statement1
 }
 statement1
}
この場合のbreakは、
statement1を実行せずに、内側(2行目)のforに移ります。


繰り返し処理の最後に

基本的には、forを使えば大抵は記述可能なはずです。
つまり、ループに入る前に、繰り返し回数を取得できることが多いはずだということです。

繰り返し回数がどうしても取得できない時に、whileを使うという事になります。
また、
continueは、ifのブロックにそれ以降を全て入れてしまえば同じことになりますが、
記述が分かり易くなったり見やすくなったりしますので覚えるようにしてください。




同じテーマ「Google Apps Script入門」の記事

第16回.Google Apps Scriptの文法
第17回.JavaScript リファレンス
第18回.組み込み関数を使う
第19回.いろいろな繰り返し処理
第20回.エラー処理(try・・・catch)
第21回.配列って何なんだ?
第22回.オブジェクト、メソッド、プロパティとは
第23回.行・列を操作する(挿入・削除・非表示・サイズ)
第24回.シートの挿入・削除・名前変更
第25回.スプレッドシート(ブック)の作成・名前変更
第26回.セルのコピー&各種ペースト


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ