Google Apps Script入門
第19回.いろいろな繰り返し処理

Google Apps Script(GAS)の入門解説です
最終更新日:2016-10-26

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

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


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

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


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

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


この中では、forについては、
第7回.同じ計算を行数分繰り返す

1回だけの処理なら、マクロ(スクリプト)を使わなくても手作業で十分です、同じ処理を繰り返し実行できるところに、マクロ(スクリプト)の最大の良さがあります。前回に続いて、以下の表で、金額=単価×数量 を計算します。前回は、2行目だけを計算しました。
第8回.最終行を取得して繰り返す
データは常に増減します、決まった行数しか処理できないのではこまります、実際に入っているデータの最終行をいかに取得するかを解説します。前回に続いて、以下の表で、金額=単価×数量 の計算を、データ行数が増減しても対応できるようにスクリプトを書き直します。
こちらで説明しました

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

このページでは、
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入門」の記事

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


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

CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)
IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)
Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)
Shift_JISのテキストファイルをUTF-8に一括変換|VBAサンプル集(5月31日)
「VBAによる解析シリーズその2 カッコ」をやってみた|エクセル(5月21日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄
10.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説



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

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


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




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