break文とcontinue文でループ処理を中断する
Googleスプレッドシートの操作を中心にGAS(GoogleAppsScript)の基本コードを紹介しています。初心者の方が順番に読んでくだけでGASの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!
今回は、”break文とcontinue文でループ処理を中断したり飛ばしたりする処理”について紹介します!
“break文”での処理の中断・終了
これまでに、”for文””while文”を使った繰り返し処理について紹介させて頂きました。
いずれも指定した条件の間、同じような処理を繰り返すことができました。
しかし、プログラムを作っていると繰り返し処理の途中で、もうそれ以降繰り返したくない時が発生します。
例えば、スプレッドシートで言うと以下のような時です。
A1セルから、A10 セルに「果物の名前」が入っているとして、
A1セルから文字列の内容を順番にチェックしていって、”りんご”が初めて出てきた行番号を取得したいとします。
この場合、for文を使ってA1セルから順番にチェックをしていく処理になると思いますが、一番最初に見つかったものが分かればそれ以降は繰り返す必要は有りませんよね。
例では、A10セルまでですが、終わりがA100000セルとかだったりすると、始めの方で”りんご”が見つかったとすると、後の処理は無駄ですね。
プログラムの処理スピードにも影響してきます。
“break文”
break文を使うことでループ処理の途中での中断をすることが出来ます。
これを使って。先程の”りんご”を見つけて行番号を表示する実際のプログラムが次です。
function test(){
// スプレッドシートを取得する
var sheet = SpreadsheetApp.getActiveSheet()
// A1セルからA10セルまで順番にチェック
for(var i=1; i<=10; i++){
// チェックするセルの値が”りんご”だったら、メッセージボックスで表示
var checkRng = sheet.getRange(i, 1)
// 格納されたものをメッセージで表示
Browser.msgBox("「" + checkRng.getValue() + "」が格納されました。")
if(checkRng.getValue()==="りんご"){
Browser.msgBox("りんごは " + checkRng.getRow() + "行目です。")
break; // ループ処理の終了
}
}
Browser.msgBox("処理終了")
}
for文で、A1セルから順番に、「変数:checkRng」に格納されていきます。格納後に、メッセージボックスで格納されたセルの値を表示します。そしてcheckRngの値が”りんご”かどうかを、if文でチェックして、if文がtrueのときは、メッセージボックスで「りんごは○行目です」と”りんご”のある行数を表示し、処理を終了します。
「break文」はコードの17行目で出てきますね。
りんごが見つかった段階で、メッセージボックスにメッセージを表示して、その後「break;」を通るのでループの処理が終了します。
それでは、動画で動きを確認します。
りんごが見つかったあとのループ処理が行われず、処理終了のメッセージが出ましたね。
比較して分かりやすいように、”break文”なしの場合、どのような動きになるかも動画で確認しましょう。※17行目の”break文”をコメントアウトします。
function test(){
// スプレッドシートを取得する
var sheet = SpreadsheetApp.getActiveSheet()
// A1セルからA10セルまで順番にチェック
for(var i=1; i<=10; i++){
// チェックするセルの値が”りんご”だったら、メッセージボックスで表示
var checkRng = sheet.getRange(i, 1)
// 格納されたものをメッセージで表示
Browser.msgBox("「" + checkRng.getValue() + "」が格納されました。")
if(checkRng.getValue()==="りんご"){
Browser.msgBox("りんごは " + checkRng.getRow() + "行目です。")
//break; // ループ処理の終了 →break;をコメントアウト
}
}
Browser.msgBox("処理終了")
}
“break文”をコメントアウトすると、”りんご”が見つかったあとも、ループ処理が続けられていることが分かります。
“continue文”での処理のスキップ
“break文”はループ処理を終了する動作でしたが、”continue文”は、その少し違って、その回の処理だけ飛ばす動作になります。
これも具体的な例で説明します。
先程のりんごが見つかったら、行数をメッセージで表示するプログラムを改造します。
今回は、”break”を”continue”に修正するのと、その後に、
Browser.msgBox(checkRng.getValue() + ” と りんごは違います!” )
を追加しています。これは格納した値とりんごが違った場合にだけ表示されます。
function test(){
// スプレッドシートを取得する
var sheet = SpreadsheetApp.getActiveSheet()
// A1セルからA10セルまで順番にチェック
for(var i=1; i<=10; i++){
// チェックするセルの値が”りんご”だったら、メッセージボックスで表示
var checkRng = sheet.getRange(i, 1)
// 格納されたものをメッセージで表示
Browser.msgBox("「" + checkRng.getValue() + "」が格納されました。")
if(checkRng.getValue()==="りんご"){
Browser.msgBox("りんごは " + checkRng.getRow() + "行目です。")
continue; // 以降の処理を飛ばす
}
// continueによって飛ばされる処理
Browser.msgBox(checkRng.getValue() + " と りんごは違います!" )
}
Browser.msgBox("処理終了")
}
for文の中で、”continue”が発動すると、それ以降の処理を飛ばして、次のループ処理(次のカウンタ変数になる)に進みます。
今回は、りんごが見つかったところの処理にcontinueを入れていますので、りんごが見つかった場合だけ、
Browser.msgBox(checkRng.getValue() + ” と りんごは違います!” )
のプログラムは飛ばされることになります。
それでは動画で確認します。
りんごの時だけ、
Browser.msgBox(checkRng.getValue() + ” と りんごは違います!” )
このプログラムが飛ばされているのが分かりました。
“break”と”continue”の処理の流れの違いを図にまとめました。
このように、”break”の場合は、処理の終了。”continue”の場合は、処理を飛ばす。とおぼえておいてください。
まとめ
break文とcontinue文のご紹介をしました。
コメント