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

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

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

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

Q&A

解決済

3回答

4132閲覧

GASのPostでのフォーム値の渡し方

mmtt234

総合スコア14

Google Apps Script

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

0グッド

1クリップ

投稿2019/03/31 11:51

編集2019/04/04 10:21

POSTで送信したいのですが、どうするべきか困っています。
何度か試しているところで、画面遷移が別タブで開き、真っ白なページが出ます。

その様子だと名前=値の形で入っているようですが、URL上では渡せない内容のためPOSTで受け取りたいです。

JSファイルで一旦送信確認をし、google.script.run.doPost(引数);で実行しているのですが、真っ白なページが返ってきます。

もうなんども調べているのですが、よくわからないので、聞いています。
ちなみにそのPostの中ではdoPost(e){}で受け取り、e.parameter.nameという形で取得しようとしていました。

わかる方いましたら、Postはどんな形で送信されているのか教えて欲しいです。

追記

html

1<body> 2 <div class="container"> 3 <form class="form-horizontal" id="resev-form" action="https://script.google.com/・・・/exec" 4 method="post" target="_blank"> 5 6 <div class="form-group"> 7 <label class="control-label col-xs-3 col-la-3" for="input-id1">名前</label> 8 <div class="col-xs-3 col-la-3"> 9 <input type="text" class="form-control" id="input_id1" name="name"> 10 <div class="help-block with-errors"></div> 11 </div> 12 </div><!--form-group--> 13 14 <div class="form-group"> 15 <div class="col-xs-offset-3 col-xs-9"> 16 <button id="send_button" type="submit" class="btn btn-primary btn-block"> 17 送信する 18 </button> 19 </div> 20 </div> 21 22 </form> 23 </div> 24 </body>

gs

1function doGet(){ 2 var HtmlOutput = HtmlService.createHtmlOutputFromFile('html'); 3 return HtmlOutput; 4} 5 6 7function doPost(e){ 8 9 var val = e.parameter.name; 10 Logger.log(e); 11 return ContentService.createTextOutput(e.parameter.name); 12} 13↓でリターンを試みたりもしましたが同じ結果です、ポストに入りません。 14return HtmlService.createHtmlOutputFromFile("thanks");

まだ色々試していますがうまくいきません。4/4

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

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

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

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

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

guest

回答3

0

自己解決

随分経ちましたが進展があったのでまとめます。

1.まず、PostしたいデータがForm送信でOKな場合は、

type="submit"  → function getPost(e){ var name = e.parameters.name;}

値の取得が可能でした。
SubmitのHTMLとGASファイルは同一プロジェクトです。

parameter(s無し)だと、1つ目のパラメータの値か、何も取れないです。
なのでFormの送信データが1つだけの場合はparameterで取得できます。

※ちなみにForm-dataだとparametersで取得。

application/application/x-www-form-urlencodedだと、
e.postData.getDataAsString()で取得できる。

2.jsonデータを飛ばすことも別で試み

別ファイルかHTMLファイル内にjsを書いてPost送信をしようとしたけれども、数個のForm送信なら、すんなりうまくいきました。

$ -> $('form').on 'submit', (e) -> e.preventDefault() form_url = $(this).attr("action") form_type = $(this).attr("method").toUpperCase() form_data = $(this).serialize() $.ajax url: form_url type: form_type data: form_data dataType: 'json' crossDomain: true cache: false followAllRedirects: true

拾ってきたカフェスクリプトのコードですが、普通にajaxで送信できます。

でも、データ制限に引っかかるのか分かりませんが、データの多いjsonを送ろうとすると
Access-Control-Allow-Origin (クロスドメイン)
で引っかかり、サーバーからのレスポンスヘッダーを変更しなければ解決できないため、GASでは無理です。

なので単純にフォームのデータを送信するならSubmitで完了させるのが無難でやり易いと分かりました。

投稿2019/09/07 08:17

mmtt234

総合スコア14

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

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

0

Postはどんな形で送信されているのか

(質問をコードで示してください。そうでなきゃマトモな回答になりません)

google.script.run.doPost(引数);としたときdoPosteは引数に書いたものがそのママ入ります。例えば、

html

1<select id="sel" name="sel" onchange"google.script.run.doPost(this.value);"> 2<option value="R">令和</option>

としたとき、

javascript

1function doPost(e) { 2 var val = e; 3}

のvalには"R"が入ります。

e.parameterの形式で取れるのは、"http://...../exec"で表現されるwebアプリケーションのエンドポイントに、httpメソッドpostでformなり何らかのデータが送信されたときだけで、google.script.runに複数の値をわたしたいときは、自分で、eにわたしたいものを組み立てる必要があります。

従って、↓こういう面倒なことをすれば

html

1<select id="sel" name="sel" onchange"send(this.value);"> 2<option value="R">令和</option> 3</select> 4<script> 5function send(val) { 6 const param = {"parameter":{"name":val}} 7 google.script.run.doPost(param); 8} 9</script>

javascript

1function doPost(e) { 2 var val = e.parameter.name; 3}

このようにして、valに"R"を取り出すことができます。

あらためて、コードを示してください。引数と隠蔽して書いている部分が致命的に重要なのです。

投稿2019/04/01 15:06

papinianus

総合スコア12705

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

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

mmtt234

2019/04/01 15:33

コード出していなくてすみません。 聞きたかったのはまさにここです。。 google.script.run.~(); で送信の場合は成形しなければならないのは理解しました。 それでも普通にアクションとメソッド、サブミットでフォームを送信してもはじき返されます。真っ白な画面が別窓で出てきます。 コードは載せてみます。
papinianus

2019/04/01 15:46

別質問に回答書いてる。
papinianus

2019/04/01 15:49

別質問に、参考としてだが、eがどう取れるか書きました。しかし、方針転換したほうがいい。この先に解決はない。google.runは不適切。 あまり詳しくはみていないが、yut148様が書いているやりかたが正解のように思う。
mmtt234

2019/04/01 15:57

質問2つ出しててすみません。 とても疑問に思っていたところを的確に答えていただきありがとうございます。 2日くらい悩んでいて、色々検索したのですが理解できず、重要な部分が出てなかったように思います。 シンプルに対処できるように考え直してみます。ありがとうございます。
papinianus

2019/04/01 16:19

一応、追記するが、google.script.run.doPost(formObject)とした場合、doPost(e)の内部では `e.[htmlのinputのname]`とすれば、値が取れる、`e.parameter.[htmlのinputのname]`ではない(parameterが勝手につくことはないし、また自分でそのようにパラメータを成形する意味もない)。
papinianus

2019/04/01 16:22

なんとか解決したいという気概は買うし、質問が多いとそれだけで避けられてしまうことが多いのも事実だが、まとめるべきはまとめて欲しい。 とりあえず、こちらは、自己解決なりで、クローズして、元質問に、こっちでききたかったことをまじえて整理するのが良いように思う。 質問者様がこれで「うっへぇ」と思わず、回答者としての私に期待していただけるよう頑張りたいと思う。
guest

0

真っ白なページという事象はよくわかりませんが以下の方法でPOSTの内容は取得できます。

doPost(e){}上で、
HtmlService.createTemplateFromFile
を使い、POST後に表示したい、htmlを作成します。
以下ではresultsと指定しています。

GoogleAppsScript

1function doPost(e){ 2 //データ取得 3 var title = e.parameter.name; 4 var temp = HtmlService.createTemplateFromFile('results'); 5 temp.data = title; 6 return temp.evaluate().setSandboxMode(HtmlService.SandboxMode.NATIVE); 7}

doPostから新たなwebページを表示する場合は指定した
results.html
内で

<?= data ?>

を取得します。

javascript

1<script> 2var inputdata = String("<?= data ?>"); 3</script>

あいにくどんな形式という事まではわかりかねます。

以降追記
GASのURLはexecで終わるものとなります。

html

1<form method="post" action=“【https://script.google.com/で始まるGASのURL】”target="_blank"> 2 <p> 3 <label>name<input type="text" name="name"></label> 4 </p> 5 <br> 6 <p> 7 <input type="submit" value="送信"> 8 </p> 9</form>

投稿2019/03/31 14:01

編集2019/03/31 15:22
yut148

総合スコア752

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

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

mmtt234

2019/03/31 14:25

わかりにくいところ、回答いただきありがとうございます。 とりあえずやってみたのですが、doPostが動いていないようです。 formのアクションを指定しているのですが、関係ありますか? jsファイル の中でgoogle.script.run.doPost(引数);にしていますが、js噛ませることでうまくいかなかったりするんでしょうか? わかりましたら回答いただきたいです。
yut148

2019/03/31 15:19

jsを介してる方法では試していません。 通常のdoGetでhtmlを書くことしか試していないです。 htmlをjsで何か加工するという事でしょうか? 上の回答に参考までにformを書き足しておきます。
mmtt234

2019/04/02 02:01 編集

うまくいったかと思ったのですが、遷移しただけのようでした。
yut148

2019/04/02 02:13

ちょっと話の流れがよくわからないのですが、うまくいかなかった事しかわかりません。 POSTで値が受け取れないと理解していいでしょうか? 遷移だけはうまくいった? こちらとしても誤った回答を書いてしまったかの様な印象を受けるのですが。 何か別の問題があってうまくいかないのかどうかなど何を実行してどの様な結果だったのか非常に見えなく回答に困る状況です。 JSをかませた等改めてて質問を書いた方がいいと思います。 このサイトの仕様上、回答が複数できてしまい返信を個別に書かないといけないので非常に読み辛く、他の方からも読み辛い状況にあります。
mmtt234

2019/04/02 02:25

ちゃんと回答できていなくてすみません。 とりあえずjsを噛ませない方法でactionに別プロジェクトのURLを指定し、実行したのですが、画面遷移だけされていたことに先ほど気づきました。 同プロジェクトのURLを指定した場合は『スクリプト関数が見つかりません:doPost()』と表示されます。 doPostの中身は回答いただいたものを使用し、setSandboxModeは消して実行しました。 Postが動作していないということで間違いないと思います。
yut148

2019/04/02 02:40 編集

JSの有無以前に問題があったという事ですね。 ちょっと検証時間とれないのとと検証環境が準備できないので即答できません。 時間出来次第となりますが回答に務めます。 読んでいて気になったのですが 別プロジェクトのURL 同プロジェクトのURL という事が原因ではないでしょうか。 こちらで事象を確認するにも、どの様な環境やソースで実行しているかよく理解出来ないので再現が難しいものとなってしまっています。
mmtt234

2019/04/02 03:27

環境自体から問題があるということなのでしょうか…。 プロジェクトにつき1URL(後ろにexec)だと認識してて、actionにそれを指定してました。 お仕事でもないのに時間割いて回答いただき本当にありがとうございます。
yut148

2019/04/02 04:38

環境についてはわかりかねます。 >プロジェクトにつき1URL(後ろにexec)だと認識してて、actionにそれを指定してました。 はい承知しました。 時間をさけるかはちょっとわからないので気になさらないでください。 回答をしている自分に役立つ事があると考えています。
yut148

2019/04/06 14:51

時間があいてしまって申し訳ありません。 その後、自分でも新規にプロジェクトを作成して試みたのですが、できませんでした。 上の回答では正しくない可能性があります。 Gsuiteになる前の知識で答えてしまっています。 今のところ正しい回答ができない状態です。 申し訳ありません。 業務で使う事もあるので何か分かり次第こちらで回答する様に努めます。
mmtt234

2019/04/08 05:07

通知が確認できず遅くなりました。 私の方も色々とやってみているのですが、解決に至っていません。 ただ、一個可能性が潰せたので助かります。 何かと変更点が出てきているようで、他の記事をみても今使えないものが結構出ているようです。何かわかり次第追加できたらと思います。
yut148

2019/04/08 05:12

この問題以外と根深いですね。多くの人が意外と困っている事と思います。 以前自分が調べた時も <script> var inputdata = String("<?= data ?>"); </script> すらわからず非常に苦労しました。 微力ながらお役にたてた様でなによりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問