この記事では、GAS(Google Apps Script)でForループを抜けるbreakや、whileループの使い方を学びます。ループに制御を加えて1つずつ出力して行きます。
GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介
まず、前回の復習をします。
下のスプレッドシートの右端D列が空欄になっている所のねこちゃんの名前(A列)
を出力して、D列の空欄を「済」にするコードを買いました。
function myFunction() {
const ss = SpreadsheetApp.getActiveSheet();
let lastRow = ss.getLastRow();//最終行を取得
//ループで入力の列に何も入っていない猫ちゃんたちの名前を出力
for (let i = 2; i <= lastRow; i++) {
if (!ss.getRange(i, 4).getValue()) {
console.log(ss.getRange(i, 1).getValue());
//出力し終わったら「済」にする
ss.getRange(i, 4).setValue('済');
};
}
}
A列(猫ちゃんの名前)を出力したログです。
スプレッドシートに戻ると、このように「済」になっています。
さて、今回の内容に入る前に、ねこあつめ画像で癒されます。
今回は、この様なスプレッドシートを用意します。
「なまえ」が「サビガー」のみ、入力が「済」になっていて、それ以外は空欄です。
今までは一番右の列で、「済」が入っていない空欄の「ねこともだち」のお名前を一度に一斉に出力していましたが、1つ1つの出力が出来る様にループに制御をかけて行きます。
まずは制御をしないで実行した場合のコードと実行結果です。
function myFunction() {
const ss = SpreadsheetApp.getActiveSheet();
let lastRow = ss.getLastRow();//最終行を取得
//ループで入力の列に何も入っていない猫ちゃんたちの名前を出力
for (let i = 2; i <= lastRow; i++) {
if (!ss.getRange(i, 4).getValue()) {
console.log(ss.getRange(i, 1).getValue());
ss.getRange(i, 4).setValue('済');
};
}
}
スプレッドシートの切り替えると、この様に一度に「済」が入っています。
これを、一度ではなく一つ一つ出力出来るように、コードを改良します。
一旦スプレッドシートを実行前に戻します。
先ほどのコードの末尾に「break」を追加して、IF文の所でD列が空白になっている猫ちゃんの名前(A列)を1つ出力した直後にループを抜けます。
function myFunction() {
const ss = SpreadsheetApp.getActiveSheet();
let lastRow = ss.getLastRow();//最終行を取得
for (let i = 2; i <= lastRow; i++) {
if (!ss.getRange(i, 4).getValue()) {
console.log(ss.getRange(i, 1).getValue());
ss.getRange(i, 4).setValue('済');
//ここにbreakを追記して、ループを抜ける
break;
};
}
}
実行結果です。
「ヘキサにゃん」が出力され、1件処理できました。
これを続けると、
2件目の「みっけ」が「済」になりました。
また、breakを使わず、whileループを使う方法もあります。
D列にデータが入っている間は次の行に進み、空白になったらループを抜けてA列の「なまえ」を出力します。
この表の1行目はタイトルなので、2行目から4行目までは「済」が入っています。
2行目は「済」というデータが入っているから次へ→3行目→4行目と行を進めます。
5行目になるとD列が空白になるので、ループを抜けて出力します。
行を表す変数をiとした場合のトレースを行います。
i=2で2行目を見る
D列に「済」が入っているから、iに1を加えてi=3になる
i=3で3行目を見る
D列に「済」が入っているから、iに1を加えてi=4になる
i=4で4行目を見る
D列に「済」が入っているから、iに1を加えてi=5になる
i=5で5行目を見る
D列が空欄なので、whileループを抜けて出力処理を行う。
トレースのコードも追記して、ログ出力及びスプレッドシートの入力を「済」にしました。
実行して、ここまでのトレースのログを見てみます。
では、最後に実行後のスプレッドシートとコードを掲載します。
function myFunction() {
const ss = SpreadsheetApp.getActiveSheet();
let lastRow = ss.getLastRow();//最終行を取得
//whileループでは、ループに入る前に必ず初期値を設定する。
let i=2;
//whileループで、D列目に「済」などの文字が入っていたらiをインクリメントする
while (ss.getRange(i, 4).getValue()) {
console.log(`現在のiの値は【${i}】です。`);
i++; //iをインクリメントして次の行へ
console.log(`D列にデータが入っているので、iの値を+1をして【${i}】になりました`);
console.log('-----------------------------------');
}
//D列が空欄なので、A列「なまえ」のログ出力とD列を「済」にする
console.log('<<ループを抜けた>>>');
console.log(`iの値は【${i}】です。D列が空白なので【ループを抜けて】出力処理を行います。`);
console.log(ss.getRange(i, 1).getValue());
ss.getRange(i, 4).setValue('済');
//最終的なiの値
console.log(`最終的なiの値:【${i}】`)
}
Whileの注意点は
・初期値を書き忘れないこと(7行目のi=2)
・無限ループに気をつけること(12行めのi++)
これは、iが加算される行(12行目のi++)があるから処理が進んで空白があったらループを抜けます。
しかし、iが加算されなかったら再び同じ行を見ることになって、ループを抜けられなくなって無限ループになります。
なので、
「初期値を設定」
「ループの変数を加算」
この2つは非常に大事です。
ご精読、ありがとうございました。
参考記事:【初心者向けGAS】条件に応じてループを制御する2つの方法~break文とwhile文~
■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。