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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Q&A

解決済

1回答

752閲覧

formごとに異なる処理を行いたい

3_April_2021

総合スコア48

Google Apps Script

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

0グッド

0クリップ

投稿2021/04/03 09:13

編集2021/08/12 07:16

同じページに設置された各フォームを送信するときにそれぞれ異なるページを表示します。そのため、doPost()内で各フォームの処理を分離したかったのですが、質問は、フォームを区別するために使用される値を取得する方法がわからないということでした。 次の3つの方法を試しましたが、この試みは残念ながら失敗しました。

  • (1)button要素(type属性button)のidをクリックイベントから受け取ります。→何も起こりません。

html

1<button type='button' id='form1' class='button'>button</button> 2<button type='button' id='form2' class='button'>button</button>

js

1const button = document.querySelectorAll('.button'); 2for(let i=0;i<button.length;i=i+1){button[i].addEventListener('click',function(){buttonF(this.id)});} 3function buttonF(x){google.script.run.buttonClick(x);}

gs

1function buttonClick(x){ 2let template; 3switch (x){ 4 case 'form1': template = HtmlService.createTemplateFromFile('form1'); 5 break; 6 case 'form2': template = HtmlService.createTemplateFromFile('form2'); 7 break; 8} 9return template.evaluate(); 10}
  • (2)button要素(type属性submit)のidをクリックイベントから受け取ります。→「スクリプトが完了しましたが、何も返されませんでした」
  • (3)input要素(type属性hidden)の値をdoPost()から受け取ります。→ウェブブラウザが埋め込みページの表示をブロックします。新しいウィンドウで開いても元のページが表示されるだけです。

html

1<form action='...' method='post'> 2 <input type='hidden' name='form' value='form1'> 3 <button type="submit" class='submit'>submit</button> 4</form> 5<form action='...' method='post'> 6 <input type='hidden' name='form' value='form2'> 7 <button type='submit' class='submit'>submit</button> 8</form>

js

1const submit = document.querySelectorAll('.submit'); 2for(let i=0;i<submit.length;i=i+1){submit[i].addEventListener('click', function(){submitF(this.id)});} 3function submitF(x){google.script.run.submitClick(x);}

gs

1 2function submitClick(x){ 3let template; 4switch (x){ 5 case 'form1': template = HtmlService.createTemplateFromFile('form1'); break; 6 case 'form2': template = HtmlService.createTemplateFromFile('form2'); break; 7} 8return template.evaluate(); 9}//(2) 10 11function doPost(e){ 12const form= e.parameter.form; 13let template; 14switch (form){ 15 case 'form1': template = HtmlService.createTemplateFromFile('form1'); break; 16 case 'form2': template = HtmlService.createTemplateFromFile('form2'); break; 17} 18return template.evaluate(); 19}//(3)

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

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

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

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

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

y_waiwai

2021/04/03 09:27

で、しつもんはなんでしょうか
3_April_2021

2021/04/21 23:00

進展と助言が必要な部分の見通しがつきました。見込み内容に関連する検証作業があるため、コンテンツは段階的に更新されます。助言を求める部分まで編集された段階で、この欄に改めてその旨や疑問が示されるでしょう。
guest

回答1

0

自己解決

(3)のhiddenを使用する場合、doPost()内でフォームによって処理を分岐することはできます。ただし、ページ遷移処理に関しては、一定期間の調査結果 少なくともdoPost()を直接トリガーとして利用することはおそらく不可能だと見込まれました。質問の全体的な状況に基づいて、この結論で質問を一旦中断します。ページ遷移処理に関してポイントとなるのは、複数のhtml表示のようです。仕様を理解して配慮する必要があるようですが、この処理は実現自体は可能です。それが唯一の方法であるかどうかは、現在の知識では言えませんが、doGet()に値を与えて分岐させることで解決できます。このため、js/html側が活用でき、doPost()を直接トリガーとして使用することに固執しなければ、質問の件の問題解決自体は可能だと思われます。しかし、質問の条件に固執すると問題を解決するための回りくどい方法しか思いつかなかったので、実際には前提条件を変更して対処しました。似たようなケースを見ても、そのような対処でうまくいくように見えるケースが多かったので、その観点からの情報共有を回答とします。

  • フォームを分割する必要がありますか?: フォームの無効化/有効化のタイミングを分離したいだけの場合は、visibility, display,disabledなどを使用できる場合があります。
  • 新しいページを表示する必要がありますか?: 小さな要素を追加したいだけなら、innerHTML,textContent,alert系統を使用できる場合があります。
  • 遷移先はウェブアプリ上のページである必要はありますか?: おそらく、動的コンテンツと割り切って使用する方が、解決策を見つけるのが簡単になります。

投稿2021/08/16 07:19

3_April_2021

総合スコア48

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問