Google Apps Script入門 | 第19回.いろいろな繰り返し処理 | Google Apps Script(GAS)の入門解説です



最終更新日:2016-10-26

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

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

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

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



リファレンスを見ると、反復処理として、

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


この中では、forについては、
第7回.同じ計算を行数分繰り返す
第8回.最終行を取得して繰り返す
こちらで説明しました

上記では割愛したものに、
for each...in
と言うのもありますが、
for...in
for...of
と合わせて、主に配列のループに使われたりしているようですが、
特に、これが無ければならないという理由も見当たりませんので・・・と現時点では私が思っているので、
ここでは解説を省略します。
※VBAのFor Eachとは、大分違いがあるようです。
 VBAのFor Eachは、コレクションからオブジェクトを取り出すときに重宝しますが、
 そういうものは存在していない・・・ようです。

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

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




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入門」の記事

第20回.エラー処理(try・・・catch)
第21回.配列って何なんだ?
第22回.オブジェクト、メソッド、プロパティとは
第23回.行・列を操作する(挿入・削除・非表示・サイズ)
第24回.シートの挿入・削除・名前変更
第25回.スプレッドシート(ブック)の作成・名前変更
第26回.セルのコピー&各種ペースト

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

メモの挿入・削除と改行文字|Google Apps Script入門(12月6日)
リンクの挿入・編集・削除|Google Apps Script入門(12月6日)
セルに数式を入れる|Google Apps Script入門(12月1日)
セルのコピー&各種ペースト|Google Apps Script入門(11月22日)
Twitter Bot 作成|Google Apps Script応用(11月6日)
Excel流の最終行の取得|Google Apps Script応用(11月6日)
方眼紙Excelが楽に入力できるVBA|ExcelマクロVBAサンプル集(11月5日)
「ポケモンを確実に見つける方法」をExcelで数学してみた|エクセル雑感(11月4日)
スプレッドシート(ブック)の作成・名前変更|Google Apps Script入門(11月4日)
シートの挿入・削除・名前変更|Google Apps Script入門(11月3日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
6.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
7.CSVの読み込み方法|ExcelマクロVBAサンプル集
8.変数とデータ型(Dim)|ExcelマクロVBA入門
9.セル・行・列の削除・挿入(Delete,Insert)|ExcelマクロVBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • いろいろな繰り返し処理

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


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



    ↑ PAGE TOP