🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

4084閲覧

GASのgetSelectedButtonで簡易的なパスワード制限をかけたい

yukitorte

総合スコア9

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2019/12/16 11:46

編集2019/12/17 05:15

たびたびお世話になります。

シートを開いた時にgetSelectedButtonを表示することで、
簡易的なパスワード制限&入場記録をとる仕組みを考えていますが、
OKボタンを押した時の挙動が安定しないため、
コードにおかしい所がないかご意見をいただけませんでしょうか。

###想定する動作
1)シートを開いたとき入力ボックスを表示
. 2-a)OKボタン押下時、入力されたテキストと一致するパスワードがあるかpassSh検索
.  3-a)一致する場合、entShに時刻と入力テキスト(使用されたパスワード)を記録
.   4)「ご入力ありがとうございます」表示後、スクリプトを終了
.  3-b)一致しない(あるいは空白でOK押した)場合、
.     「パスワードが一致しません」表示後、promptmsgを再実行
. 2-bc)×ボタン、キャンセルを押したときはpromptmsgを再実行

###困っている所・改善できたら嬉しい所
空白のままOKを押した時の挙動がおかしい
・4)の挙動へ入ってしまう(alertが実行される)
・alertをOKで消すと、そのままpromptmsgが終了してしまう
(空白をパスワード不一致とみなしていない?)

×やキャンセル等でpromptmsgループを経由したあとだと、
正しいパスワードを入力してもpromptmsgループ、空白でOKでもpromptmsgループ……となる。
何度かOKを押していると終了する。
(promptmsg();の挙動がスタックしてる?)

動作4ののち、指定のシートを表示させることはできるでしょうか?
(こちらは自己解決しました)

また、これはどうにもならない仕様かな……とは思っていますが、
起動時トリガーが3~5秒かかり非常に遅いので
もしGASの実行を早める方法があればご教授ください……(:3」∠)

###現在のコード

GAS

1function promptmsg(){ 2 var MasterSS = SpreadsheetApp.openById('***************');//SSID 3 var passSh = MasterSS.getSheetByName('pass') //パスワード格納シート 4 var entSh = MasterSS.getSheetByName('Log') //Logシート 5 var values = passSh.getRange("C8:C400"); //passシートのC8:C378(パスワードのリスト)の値を取得 6 var today = Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd HH:mm"); //dateのフォーマット指定 7 8 var ui = SpreadsheetApp.getUi(); 9 var ret = ui.prompt("パスワードを入力してください",ui.ButtonSet.OK_CANCEL); 10 11 switch(ret.getSelectedButton()){ //押されたボタンによって処理を分岐 12 13 case ui.Button.OK: //OKボタンを押した時の処理 14 var input = ret.getResponseText(); //入力した文字をinputに格納 15 var result = Array.prototype.concat.apply([],values.getValues()).indexOf(input); 16 17 if (result >= 0) { 18 entSh.appendRow([today,input]); //entShシートに入場記録 19 SpreadsheetApp.getUi().alert("ご入力ありがとうございます"); 20 break; 21 22 } else { 23 SpreadsheetApp.getUi().alert("パスワードが一致しません"); 24 promptmsg(); 25 } 26 break; 27 28 case ui.Button.CANCEL: //キャンセルを押した時の処理 29 promptmsg(); 30 case ui.Button.CLOSE: //ダイアログの×を押した時の処理 31 promptmsg(); 32 } 33} 34

###追記の補足
パスワードは複数個(100個以上)あり、その中の
どのパスを使ってログインしたのかを記録するのが本スクリプトの目的になります。
(閲覧者がGoogleアカウントを持っていない場合でも、誰がログインしたのかを記録したい)

いろんな参考を引っ張ってきたキメラコードなので、不要な部分等あるかもしれません……。
ご意見よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

空白のままOKを押した時の挙動がおかしい
・4)の挙動へ入ってしまう(alertが実行される)
・alertをOKで消すと、そのままpromptmsgが終了してしまう
(空白をパスワード不一致とみなしていない?)

C8:C400の中に空白セルがありませんか?
コメントをみる限りだとC378以降が空白セルなので、それと空白パスワードが一致しているのでは?と推測されます。

×やキャンセル等でpromptmsgループを経由したあとだと、
正しいパスワードを入力してもpromptmsgループ、空白でOKでもpromptmsgループ……となる。
何度かOKを押していると終了する。
(promptmsg();の挙動がスタックしてる?)

おそらくbreakがないからです。

javascript

1 case ui.Button.CANCEL: //キャンセルを押した時の処理 2 promptmsg(); 3 break; 4 case ui.Button.CLOSE: //ダイアログの×を押した時の処理 5 promptmsg(); 6 break;

投稿2019/12/17 07:04

macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukitorte

2019/12/17 07:42

macaron_xxxさんご回答ありがとうございます! ご指摘のとおりbreakの追加および空白セルをなくすことで解決しました……! 空白も空欄送信も『""』ですもんね……そりゃ一致判定するわけだ……(;ノノ)恥ずかしい breakに関しては目からウロコといいますか、 function呼び出しより後ろの行(処理)なので不要かと思ってましたーー(>_<; 同様にelseを閉じる前にもbreakしておいたほうがよさそうでしょうか?
macaron_xxx

2019/12/17 07:45

いえ、逆にifの最後のbreakが不要です。
yukitorte

2019/12/17 07:52

承知いたしましたっ 最後までお付き合いいただきありがとうございました! コード迷子になったときはまたご指導よろしくお願いします……!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問