みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けGoogle Apps ScriptのシリーズとしてBotの作り方についてお伝えしています。
前回の記事はこちらです。
GASを使ってスプレッドシートのセルに値を入力する方法をお伝えしました。
今回は、GASで条件に応じてループを制御する2つの方法としてbreak文を使う方法と、while文を使う方法についてお伝えしますね。
前回までのおさらい
まず、題材となっているスプレッドシートはこちらです。
名言が一覧されていまして、この名言を一つずつ通知していきたいのです。
前回までで作成したスクリプトがこちらです。
function myFunction() { const sheet = SpreadsheetApp.getActiveSheet(); const lastRow = sheet.getLastRow(); for(let i = 2; i <= lastRow; i++) { if(!sheet.getRange(i, 4).getValue()){ console.log(sheet.getRange(i, 1).getValue()); sheet.getRange(i, 4).setValue(true); } } }
シートの2行目から順にBotで通知(今はログ出力ですが)していき、通知したところは目印として、D列に「true」を入力するというものです。
ただ、このスクリプトを実行してみるとわかりますが、以下のようにTRUEが入っていない名言が全部ログ出力されちゃいます。
Botなので、一回の実行で通知する名言は一つで良いんですね。
その方法を今回は考えていきます。
break文でforループを抜ける
スクリプトではD列が「true」でない行を見つけたら、その行の名言をログ出力して、「true」と入力するようになっています。
ですから、そのタイミングでforループ文を抜けることができれば良いわけです。
そんなときに、break文を使えばループを抜けることができます。
書き方はシンプルにこうです。
このbreak文が含まれているforループを即時に抜けることができます。
今回のように、if文の中で特定の条件にマッチしたときに抜ける、という使い方がスタンダードです。
Botで通知をしたらループを抜けるスクリプト
このbreak文を使って、反復を抜けるようにすると、スクリプトは以下のようになります。
function myFunction() { const sheet = SpreadsheetApp.getActiveSheet(); const lastRow = sheet.getLastRow(); for(let i = 2; i <= lastRow; i++) { if(!sheet.getRange(i, 4).getValue()){ console.log(sheet.getRange(i, 1).getValue()); sheet.getRange(i, 4).setValue(true); break; } } }
実行すると、以下のようにTRUEではない最初の行の名言だけがログ出力されて、スクリプトの実行は終了します。
while文で条件が成立している間繰り返す
今回の目標を実現する別の方法があります。
それはwhile文を使う方法です。
while文はfor文と同様に処理を反復したいときに使うものですが、条件式が成立している間だけ繰り返すという機能を持つものです。
書き方は以下の通りです。
//繰り返したい処理
}
つまり、この条件式がtrueである限りずっと繰り返しをするのです。
while文を使ったスクリプト
今回の例でいうと、以下のようなスクリプトを組むことができます。
function myFunction() { const sheet = SpreadsheetApp.getActiveSheet(); const lastRow = sheet.getLastRow(); let i = 2; while(sheet.getRange(i, 4).getValue()) { i++; } console.log(sheet.getRange(i, 1).getValue()); sheet.getRange(i, 4).setValue(true); }
カウント用変数iを初期値2で用意して、D列に何らかの値が格納されている間は単純にプラス1をします。
文字列は空文字でなければtrueを返しますからね。
i行目がD列に何も入力されてなければ、ループを終了します。
ループを抜けたとき、i行目は初めてD列が空文字だった行になります。
ですから、その行について、名言をBotしてtrueを書き込めばOKというわけです。
実行すると、先ほどのbreak文の例と同様の結果が得られますので、確認をしてみてください。
while文を使う際の注意点
今回、whileループ内の処理にi++を入れていなかったとすると、while文の条件式が一生falseになることがありませんので、ループを終了することができません。
その場合、永久に実行される無限ループとなってしまいます。(GASの場合は、ルールで6分を超えると強制停止になりますが。)
ですので、while文を使うときは、ループがちゃんと終了される時が来るように設計する必要がありますので、その点注意をしてくださいね。
まとめ
以上、Google Apps Scriptで条件によってループを制御する2つの方法をお伝えしました。
今回の例でいうと
- if文が成立したときにbreak文でループを抜ける
- while文で条件式が成立している間繰り返す
のどちらでもOKですが、どちらも重要なので両方使いこなせるようにしておくと良いです。
次回はセル範囲を行数、列数も使って取得する方法についてお伝えします。
どうぞお楽しみに!
連載目次:超初心者向けGASでBotを作りながら基礎を学ぶ
Google Apps Script(GAS)をはじめるためのメリットは山程ありますが、何を作ったらいいの?と悩んでしまうこともありますよね。そんな時に、おすすめしたいのが「Bot」の作成です。このシリーズでは、超初心者向けにGASでBotを作る方法を題材としながら、GASプログラミングの一通りの流れと書き方について学んでいきます。- 【初心者向けGAS】本当の最初の一歩!スクリプトエディタでプロジェクトを開く
- 【初心者向けGAS】はじめてのスクリプトを作成し、保存し、実行する
- 【初心者向けGAS】プログラミングに必須の変数&定数の使い方とデータ型について
- 【初心者向けGAS】ログを表示するconsole.logの使い方とテンプレート文字列
- 【初心者向けGAS】スクリプト実行時の「承認」でびっくりしないために
- 【初心者向けGAS】Spreadsheetサービスの「オブジェクト」の基礎の基礎を知ろう
- 【初心者向けGAS】スプレッドシートのシートを取得する2つの方法
- 【初心者向けGAS】スプレッドシートのセル・セル範囲とその値を取得する方法
- 【初心者向けGAS】for文を使ったスプレッドシートの繰り返しの超基本
- 【初心者向けGAS】条件分岐をするif文の使い方の超基本
- 【初心者向けGAS】スプレッドシートのセルに値を入力する基礎の基礎
- 【初心者向けGAS】条件に応じてループを制御する2つの方法~break文とwhile文~
- 【初心者向けGAS】スプレッドシートのセル範囲を行数・列数を使って取得する
- 【初心者向けGAS】スプレッドシートのセル範囲をクリアするいくつかの方法
- 【初心者向けGAS】Google Apps ScriptでWeb APIを活用するための基礎知識
- 【初心者向けGAS】面倒なことはライブラリに任せよう!その概要と追加の方法
- 【初心者向けGAS】Chatworkのマイチャットにメッセージを送る最も簡単な例
- 【初心者向けGAS】Google Apps Scriptで別の関数を呼び出すfunctionの書き方
- 【初心者向けGAS】時限式のイベントトリガーを設置して決まった時刻にBotを送信する方法
- 【初心者向けGAS】プロパティストアの概要とスクリプトプロパティの編集方法
- 【初心者向けGAS】スクリプトプロパティを操作してそのデータを取り出す方法
- 【初心者向けGAS】スプレッドシートのセル範囲の値を二次元配列として取得して取り扱う方法
- 【初心者向けGAS】Chatworkのメッセージ記法でBot送信するメッセージを装飾する方法
- 【初心者向けGAS】Google Apps Scriptのドキュメンテーションコメントの書き方