【プログラミング基礎】for文で同じ処理を繰り返す

プログラミングをこれから学習しようという方、なかなか覚えられない方は必見です。
プログラミングには「順次(処理)」「条件分岐」「繰り返し」という基本的な動きが存在します。
基本的な動きというだけあって、どのプログラミング言語を扱ったとしても必ず登場します。

GASではGoogle Formの回答を取得する際、spreadSheetの複数行に対して同様の処理をする際など繰り返し文を使う場面が多く登場します。
同じような処理を何度も繰り返して実行したい場合、その処理を繰り返したい回数記述すると、下記のような問題が起こります。

処理を繰り返したい回数記述することで起こる問題

  • 動的に繰り返す回数が変化する場合に対応できない
  • 事前に繰り返す回数がわかっていないと記述できない
  • プログラムを記述する段階で繰り返す回数がわからなくなる

プログラミングには「順次(処理)」「条件分岐」「繰り返し」という基本的な動きがあり、同じような処理を何度も繰り返し実行したい時は「繰り返し」の構文を使用します。
この記事を読むことで繰り返し文の種類とそれぞれの使い方、使用する上での注意点がわかります。

同じ処理の繰り返しがあれば、シンプルに書くことができますので、ぜひマスターしてください。

繰り返し構文とは

繰り返し構文はブロック内の処理を繰り返すための構文です。

中括弧({})で囲ったブロック内の処理を「繰り返す条件がtrue」もしくは「規定回数を繰り返す」まで繰り返し、繰り返しが終了したら次の処理に進みます。

「繰り返す条件がずっとtrue」の場合、永遠に繰り返すので注意が必要です(無限ループと言います)。

繰り返し構文の種類

GASで使用できる繰り返し構文はwhile文、for文、for…in文の3種類があります。
同じ繰り返しを表す構文ですが、使用する場面によって使い分けが必要だったり、使用する上での注意点も様々あります。

繰り返し文の使用上のポイント

  • while文は終了条件をどのように設定するかがポイント
  • for文は規定回数をどのように設定するかがポイント
  • for…in文は順不同で要素を取り出す

while

while文は「条件式を用いた繰り返し文」です。[条件式]がtrueの場合にブロック内の処理が実行されます。
ブロック内の処理が実行されるたびに、[条件式]を評価して繰り返すか、ループを抜けるか判定します。[条件式]がfalseになるとループ処理を抜けて次の処理に進みます。

while([条件式]) {
    // 条件式がtrueの場合に実行される処理
}

ブロック内でループを抜ける条件を設定してあげないと、[条件式]が常にtrueとなってしまい、繰り返し処理を抜けることができなくなってしまいます。
繰り返し処理を抜けることができず、永遠と繰り返すことを無限ループと言います。
無限ループに陥ってしまった場合は「キャンセル」をクリックすることでスクリプトの実行を停止できます。

無限ループ

while文を使う際に、いつまでも条件を満たしていて、繰り返しを抜けられなくなってしまいます。
これを無限ループと言います。
while文を使用する場合は無限ループにならないようにプログラミングしましょう。

for

for文は「繰り返し回数をあらかじめ設定して使用する繰り返し文」です。
for文は繰り返した回数をカウントする「カウンタ変数」を利用して繰り返しを制御します。
「繰り返し処理を◯回実行したらループを抜ける」というように、繰り返す回数をあらかじめ決めておき、決められた回数だけ処理を繰り返します。

for (初期化式; 条件式; 増減式) {
    // 条件式がtrueの場合に実行される処理
}
参考

  • 初期化式:カウンタ変数の初期値を決めるための式
  • 条件式:カウンタ変数を用いた条件式で、trueの間はforループが実行される
  • 増減式:毎回の繰り返しでブロックないの処理の最後に実行される式で、一般的にはカウンタ変数の値を増減させる式

for文はあらかじめ繰り返す回数が決まっているので無限ループの心配はないですが、繰り返す回数をどのように設定するかがポイントとなります。

for…in

for…in文は「オブジェクトの全てのプロパティ数分繰り返す文」です。あるオブジェクトのプロパティを変数に取り出して、オブジェクトのプロパティ分繰り返しブロック内の処理を実行しまます。

変数にはプロパティの名称が格納されます。プロパティに格納されている値を取得したい場合はブラケット記法を用いてオブジェクト[変数]とする必要があります。

for (変数 in オブジェクト) {
    // ループ内で実行する処理
}

for…in文でオブジェクト内のプロパティを取り出す際は、プロパティを定義順ではなく順不同で取り出すことに注意が必要となります。

breakでループを中断する

繰り返し文はbreak文を使って途中で中断することができます。

中断したい条件をif文で指定してbreak文を記述しますので、if文もセットで覚えておくと良いでしょう。

for (var i=0; i < 10; i++) {
    Logger.log(“i=%s”, i);
    if (i > 5) {
        break;
    }
}

continueでループをスキップする

continueはループをスキップします。breakはループを中断しますので次の処理に進みますが、continueは次の繰り返しを実行するという違いがあります。
現在のループだけをスキップして繰り返し処理自体は継続したい場合に使用するのがcontinueです。

スキップしたい条件をif文で指定してcontinue文を記述しますので、こちらもbreak文同様、if文とセットで覚えておくと良いでしょう。

for (var i=0; i < 10; i++) {
    if (i == 5) {
        continue;
    }
    Logger.log(“i=%s”, i);
}

GASでよく使う例

Google FormやGoogle SpreadSheetでGASを利用する場合、for文をよく利用します。

  • Google Formでは受け付けた回答を取得して処理する場合
  • Google SpreadSheetでは複数行のデータを処理する場合

上記の使用例を実際に見てみます

Googleフォームの回答をみる

Googleフォームが送信されたタイミングでスクリプトを動作させて、回答情報を取得しています。

回答情報はitemResponsesの配列に格納されていますので、回答情報を取り出す際はfor文を使って、回答情報の数だけループさせて取り出すようにすると良いでしょう。

for (var i = 0; i < itemResponses.length; i++) {
    // 質問と回答のセットを一つ取り出す
    var itemResponse = itemResponses[i];

    // 質問を取り出す
    var question = itemResponse.getItem().getTitle();

    // 回答を取り出す
    var answer = itemResponse.getResponse();

    // ループ内で実行する処理
}

Googleスプレッドシートのセルをみる

Googleスプレッドシートは簡易データベースとして利用することが多く、顧客情報や商品情報などを書き記している場合が多いと思います。

スプレッドシートに記録されている全てのデータにアクセスするためにfor文を使ってループさせます。
その際のループ回数の指定方法は行数となるわけですが、データを追加するたびにGASを修正していたのでは大変です。

なので、getLastRow()というデータがある最終行数を取得するメソッドを使用して、ループさせる回数を決めています。

// データが入力されている行数分繰り返す
for (var row=0; row < sheet.getLastRow() - 1; row++) {
    // ループ内で実行する処理
}

まとめ

「繰り返し」の構文について、解説しました。
同じような処理を何度も繰り返して実行したい時は「繰り返し」の構文を使用して、記述量を減らしていきましょう。

GASだけでなく、様々なプログラミング言語で登場し、記述方法も同じですので、ここで紹介した方法で覚えておいて間違いありません。

GASではGoogle Formの回答を取得する際やspreadSheetの複数行に対して同様の処理をする際に繰り返し文を使うこと多いでしょう。
無限ループに気をつけて、繰り返し回数を動的に設定できるように工夫して使ってみてください。

各繰り返し構文の注意点

  • while文を使用する場合は、無限ループに気をつける
  • for文を使う場合はループ回数の指定を工夫する
  • for…in文はオブジェクトのプロパティに対して使用する
  • breakでループを中断する
  • continueでループをスキップする