
GAS switchとifとui
どうも条件分岐をうまく使えていないようなので、おさらいする。
switch構文
/* switch 構文 */
function myFunctionSwitch_00() {
switch (式) {
case 値1:
//式 === 値1 だったときの処理
break;
case 値2:
//式 === 値2 だったときの処理
break;
default:
//式 がすべての値に合致しなかったときの処理
}
}
・case 値1: のように、セミコロンではないので注意。
・switch文では式に該当するcase節の処理以降のすべての処理を実行するため、case節の中の処理だけを実行させたい場合、通常はbreakで処理を断ち切る。
switch処理例01
コード
/* switch 処理例01 */
function myFunctionSwitch_01() {
const rank = '';
switch (rank) {
case '松':
console.log('3,000円')
break;
case '竹':
console.log('2,500円')
break;
case '梅':
console.log('2,000円')
break;
default:
console.log('日替わり 1,000円')
}
}
処理結果
constを空白にすると、
switch処理例02 ~uiを添えて~
処理例01に、uiを加えて、ユーザの回答に応じてswitchしてみる。なお、ここでは、実際的にはユーザが任意回答になるので、入力ズレが生じるが、めんどいのでその点は割愛し、きちんと指定ワードのいづれかを入力するものとする。その点は後ほど解消する。
また、ここでは、「はい」「いいえ」「キャンセル」の3択しかないため、defaultは取らない。
コード(間違い)
/* switch 処理例02 */
function myFunctionSwitch_02() {
const ui = SpreadsheetApp.getUi(); // DocumentApp.getUi();
const response = ui.prompt('どれか入力してね', '「はい」「いいえ」「キャンセル」どれがいいかな~', ui.ButtonSet.YES_NO_CANCEL);
switch (response.getSelectedButton()) {
case ui.Button.YES:
// 「はい」の場合の処理
ui.alert('「はい」と答えましたね');
break;
case ui.Button.NO:
// 「いいえ」の場合の処理
ui.alert('「いいえ」と答えましたね');
break;
case ui.Button.CANCEL:
// 「キャンセル」の場合の処理
ui.alert('「キャンセル」と答えましたね');
break;
}
}
処理結果
素直に「はい」といった場合
変な答えを入力しても、ここでは入力値で何か変わらないので「はい」を選べばその処理になる。
入力欄いらないな、と思って、
const response = ui.prompt('~
これを、
const response = ui.alert('~
このようにalertにすると、
response.getSelectedButton is not a function
として怒られる。なんで????
と、思ったら、
switch (response.getSelectedButton()) {
になっていたので、
switch (response()) {
に直せばオーケーだった。
getSelectedButton の説明はこのへん。
The button that the user clicked の値をゲットできるみたいだけど、今回の場合はいらないのか、な????
しかるに、コードはこうなる。
/* switch 処理例02 */
function myFunctionSwitch_02() {
const ui = SpreadsheetApp.getUi(); // DocumentApp.getUi();
const response = ui.alert('どれか選んでね', '「はい」「いいえ」「キャンセル」どれがいいかな~', ui.ButtonSet.YES_NO_CANCEL);
switch (response) {
case ui.Button.YES:
// 「はい」の場合の処理
ui.alert('「はい」と答えましたね');
break;
case ui.Button.NO:
// 「いいえ」の場合の処理
ui.alert('「いいえ」と答えましたね');
break;
case ui.Button.CANCEL:
// 「キャンセル」の場合の処理
ui.alert('「キャンセル」と答えましたね');
break;
}
}
if構文(if/else if/else)
コード
/* if 構文 */
function myFunctionIf_00() {
if (条件式1) {
// 条件式 1 が true のと場合に実行する処理
} else if (条件式2) {
// 条件式 1 が false で、条件式 2 が true のと場合に実行する処理
} else {
// すべての条件式が false だった場合に実行する処理
}
}
if処理例01
コード
/* if 構文 処理例01 */
function myFunctionIf_01() {
const x=5;
if (x<5) {
console.log('xは5より小さい')
} else if (x<10) {
console.log('xは5以上で10より小さい')
} else {
console.log('xは10より大きい')
}
}
処理結果
xを15にすると
ifでもuiしてみる
リファレンスにまんまコードがあるので、それを参考にしつつ使う。でも、リファレンスもvarのまんまやね。varのままだと、Argument cannot be null: buttons とかエラーでた。constに直したらなおった。
コード
/* if 構文 処理例02 */
function myFunctionIf_02() {
const ui = SpreadsheetApp.getUi();
const response = ui.alert('どれか選んでね', '「はい」「いいえ」「キャンセル」どれがいいかな~', ui.ButtonSet.YES_NO_CANCEL);
// Process the user's response.
if (response == ui.Button.YES) {
ui.alert('「はい」と答えましたね');
} else if (response == ui.Button.NO){
ui.alert('「いいえ」と答えましたね');
} else {
ui.alert('「キャンセル」と答えましたね');
}
}
処理結果
これで、さきほどのswitchと同様の結果が得られた。
メール下書き作成ツールにどう生かす?
先のnoteで途中までコード書いて、条件分岐がうまくいかなくて懊悩していた。
流れを考えると、下図のようなイメージか。
ざっくりと書くと、こういうイメージなんだろうか。
フロー図は https://app.diagrams.net で作りました。
この流れでみると、やっぱりif/else if/else の形がような気がするんだけど、違うかなあ。switchだと、最初の式判定があってそこを基点に枝分かれなような。
ifでuiしてみた処理例02に手を加えて、処理03としてテストしてみたい。
と、おもって早速エラーが出で保存できない。
意味が分からん。なにがいけないんだ。あ、そうか、else だから if に合致しないときの処理がくるから、ここに論理判定があるのがおかしいのか。
さて、そんで、いろいろ書いているうちに処理04にした。
処理04がこちら↓。
/* if 構文 処理例04 */
function myFunctionIf_04() {
const ui = SpreadsheetApp.getUi();
const response = ui.alert('質問1 どれか選んでね', '「はい」「いいえ」どれがいいかな~', ui.ButtonSet.YES_NO);
// Process the user's response.
if (response == ui.Button.YES) {
ui.alert('「はい」と答えましたね');
const response = ui.alert('質問2 どれか選んでね', '「はい」「いいえ」どれがいいかな~', ui.ButtonSet.YES_NO);
if (response == ui.Button.YES) {
ui.alert('質問2「はい」と答えましたね');
} else if (response == ui.Button.NO) {
ui.alert('質問2「いいえ」と答えましたね');
}
} else if (response == ui.Button.NO) {
ui.alert('「いいえ」と答えましたね');
}
}
これで、質問1で答えたが「はい」だった場合は質問2に進むという入れ子構造ができた。これを応用して、メール下書き機能に使えそうである。
問題は、メール下書き機能のときに、質問2に相当する箇所で、メール下書きするフラグが立っているかどうかをどう判定するかだ。フラグ列のデータを一気に取得して、その値をうまいこと見て、それに応じて処理してく感じでどうにかできればと思う。
このあたり、MさんにアドバイスいただきながらZoomであーでもないこーでもない、ここの閉じタグがおかしのでは?else だから判定いらないのでは?と助言をいただき大変感謝しております。ありがとうございます!またamong us で killしましょうね!
いいなと思ったら応援しよう!
