見出し画像

GAS switchとifとui

どうも条件分岐をうまく使えていないようなので、おさらいする。

switch構文

/* switch 構文 */
function myFunctionSwitch_00() {
 switch (式) {
   case1:
     //式 === 値1 だったときの処理 
     break;
   case2:
     //式 === 値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円')
 }
}

処理結果

画像1

constを空白にすると、

画像8

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;

 }

}

処理結果
素直に「はい」といった場合

画像2

画像3

変な答えを入力しても、ここでは入力値で何か変わらないので「はい」を選べばその処理になる。

画像4


入力欄いらないな、と思って、

const response = ui.prompt('~

これを、

const response = ui.alert('~

このようにalertにすると、

画像5

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より大きい')
 }
}

処理結果

画像6

xを15にすると

画像7

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と同様の結果が得られた。

画像10

画像9


メール下書き作成ツールにどう生かす?

先のnoteで途中までコード書いて、条件分岐がうまくいかなくて懊悩していた。

流れを考えると、下図のようなイメージか。


画像11

ざっくりと書くと、こういうイメージなんだろうか。
フロー図は https://app.diagrams.net で作りました。

この流れでみると、やっぱりif/else if/else の形がような気がするんだけど、違うかなあ。switchだと、最初の式判定があってそこを基点に枝分かれなような。


ifでuiしてみた処理例02に手を加えて、処理03としてテストしてみたい。
と、おもって早速エラーが出で保存できない。

画像12

意味が分からん。なにがいけないんだ。あ、そうか、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しましょうね!


いいなと思ったら応援しよう!

good-sun(a03)
いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!