質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

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

Google Apps Script

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

Q&A

解決済

2回答

2325閲覧

GASとGSSを使ったパスワード照合が必ず不一致になる

yukitorte

総合スコア9

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/02/03 07:00

編集2020/02/03 08:48

お世話になります。
GASで出力したhtml(webアプリケーション)でパスワード制限をかけようとしているのですが、
スプレッドシート(GSS)のデータとの照合がうまくいっていないようなので
お知恵をお貸しいただけますでしょうか。

###やりたいこと
・indexにてパスワードを入力し送信
・GSS内のパスワードリストを照会し、正しければMenu1.htmlを、正しくなければMenu2.htmlを表示する
・GSS内のログシートへ、入場日時と照会の結果と使用パスワードを記録する

###状況
・パスワードリストに含まれている文字列を入力しても必ずMenu2へ遷移する
・特定のパスワードのみ有効な形式にしたときはMenu1に遷移できる(後述)

現在のコード

gas

1function doGet(e){ 2 var page=e.parameter["p"]; 3 4 if(page == "index" || page==null){ 5 return HtmlService.createHtmlOutputFromFile('Index'); //入口 6 } else if(page =="menu1"){ 7 return HtmlService.createHtmlOutputFromFile('Menu1'); //パスワード一致時に表示するページ 8 } else if(page =="menu2"){ 9 return HtmlService.createHtmlOutputFromFile('Menu2'); //パスワード不一致時に表示するページ 10 } else{ 11 return HtmlService.createHtmlOutputFromFile('Error'); //不正なURLを直打ちした時のページ 12 } 13} 14 15 16function doPost(e){ 17 Logger.log(e); 18 var SS = SpreadsheetApp.openById('***************************');//参照先のSSのID 19 var passSh = SS.getSheetByName('pass') //パスワード格納シート 20 var passVal = passSh.getDataRange().getValues(); //passシート内の値を取得 21 var LastRow = passSh.getDataRange().getLastRow(); //passシート内の最終行 22 var col = "B"; //passリストが記載されている列 23 24 var LogSh = SS.getSheetByName('test_log') //ログ記録シート 25 var date = new Date(); 26 var today = Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd HH:mm"); //dateのフォーマット指定 27 28 var pass = e.parameter.name; //入力された文字列の受取 29 30 31 for(var row = 9; row <= LastRow-1; row++) { //rowを9行目から最終行まで値を1ずつ増加 32 if(passVal[row][col] === pass){ 33 var array = [date,"Success",pass]; 34 LogSh.appendRow(array); 35 return HtmlService.createHtmlOutputFromFile('Menu1').setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL); 36 37 } else{ 38 var array = [date,"fail",pass]; 39 LogSh.appendRow(array); 40 return HtmlService.createHtmlOutputFromFile('Menu2').setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL); 41 } 42 } 43}

※passShのパスワードが羅列されているリストは、
A  B  C
8 No PASS ユーザー名
9  1 hoge1 ユーザーA
10 2 hoge2 ユーザーB
といった感じで、以下400程度『No』『PASS』『ユーザー名』が続いています。
ユーザー名は入力式ではなく、使用されたパスワードと所持ユーザーを紐付けるためだけの目的です。

試した事

現状、ログシートには入力したとおり正常に記録されていて
文字化け等もないため、文字列は正常に受け取っているとは思います。
となると、if構文の中身に問題がある(照会の仕方が悪い)か、
passValが正しくデータを取得できていないか……のどちらかではないかと思っていますが……。

for構文を取り払って、if("hogehoge" === name)) { ......という形にして
indexのパスワードフォームで『hogehoge』を入力すると、想定どおりMenu1へ移動しました。


初歩的な内容で大変申し訳ありませんが、どうぞよろしくお願いします。

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

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

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

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

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

guest

回答2

0

経緯の前に解決コードをぺたり……。

GAS

1function doPost(e){ 2 Logger.log(e); 3 var SS = SpreadsheetApp.openById('***************************');//参照先のSSのID 4 var passSh = SS.getSheetByName('pass') //パスワード格納シート 5 var passVal = passSh.getDataRange().getValues(); //passシート内の値を取得 6 var LastRow = passSh.getDataRange().getLastRow(); //passシート内の最終行 7 var col = 1; //passリストが記載されている列 8 9 var LogSh = SS.getSheetByName('test_log') //ログ記録シート 10 var date = new Date(); 11 var today = Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd HH:mm"); //dateのフォーマット指定 12 13 var pass = e.parameter.name; //入力された文字列の受取 14 15 16 for(var row = 8; row <= LastRow-1; row++) { //rowを9行目から最終行まで値を1ずつ増加 17 if(passVal[row][col] === pass){ 18 var array = [date,"Success",pass]; 19 console.log('入力値:' + pass + ' 取得値:' + passVal[row][col]) ; 20 LogSh.appendRow(array); 21 return HtmlService.createHtmlOutputFromFile('Menu1').setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL); 22 } 23 } 24 if(row = LastRow) { 25 console.log('パスワード不一致。入力値:' + pass ); 26 var array = [date,"fail",pass]; 27 LogSh.appendRow(array); 28 return HtmlService.createHtmlOutputFromFile('Menu2').setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL); 29 } 30}

draqさんのご助言をいただいたあと、
返り値がundefinedでもなく空欄っておかしいな?とふと思い、
passシートを見直したところ10行目がまるっと空欄だったことに気づきました。
(hogehogeパスやユーザー名は11行目から記載されてました……)

空白で検索が躓いたのでは……と空欄を削除して実行したところ、
ログが入力値:hogehoge 拾った値:ほげほげユーザーと返されていたため、
2次元配列のB列は2ではなく1かも?と思い、var col = 1;に変更。
するとhogehogeパスでMenu1へ遷移することに成功しました。

が、10行目以外のパスを受け付けず、不一致扱いに。
11行目の別パスワードを入力すると入力値:hogehoge2 拾った値:hogehogeとなったため
どうやら10行目以降の検索ができていないのでは?と推測。

原因は、for構文の内部で『パスが一致したらMenu1、不一致ならMenu2』のif・elseをしていたため
リストforループをする前に『不一致ならMenu2』という結果をreturnして終了したのかなと。
なのでelseを撤廃し、forの後ろで『row=LastRow(最終行まで検索した)になったらMenu2へ』
という形にしたところ、想定どおりの動作となりました。

コードとしてスマートなのかはわかりませんが(笑)、
ひとまずの解決をみたため、こちらの質問は解決とさせていただきます。
お世話になりました!

投稿2020/02/04 05:24

yukitorte

総合スコア9

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

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

0

ベストアンサー

for構文を取り払って、if("hogehoge" === name)) { ......という形にして

indexのパスワードフォームで『hogehoge』を入力すると、想定どおりMenu1へ移動しました。

であれば、passVal[row][col]が意図通りシートの値を意図通りに取得できていないのでしょう。
ログに出力などして確認しましょう、


それはともかく、

var col = "B"; //passリストが記載されている列 // 省略 passVal[row][col]

はおかしいです。
passValは2次元配列(ジャグ配列)なので、colは数値を指定する必要があります。
2列目の値を得たいのであれば、var col = 2;でしょう。

投稿2020/02/03 23:11

draq

総合スコア2573

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

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

yukitorte

2020/02/04 04:32 編集

draqさんご回答ありがとうございます! var col = 2;に修正した上で console.log('入力値:' + pass + ' 拾った値:' + passVal[row][col]) ;を仕込んで 実行してみたところ、相変わらずMenu2(不一致)へ遷移したうえで コンソールログでは 入力値:hogehoge 拾った値: となりました。(拾った値が空欄でした) やはりpassVal[row][col]が値を取得できていない感じがしますね……。 力足らずで申し訳ありません、 よろしければ引き続きご助力よろしくお願いします!
yukitorte

2020/02/04 05:28

ご助力をもとに自己解決いたしました! ログで確認、大事ですね……。 またコード迷子になった際はどうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問