GoogleFormがsubmitされた時にgasからメールを投げる
会社のwebサイトに導入したGoogle Formがsubmitされた時にG Suiteで用意したメーリングリスト(グループ)にメールを送りたかっただけなのに
信じられないくらいハマって時間かかったので、誰かが同じような所でハマった時に助けになればと思いメモ
ハマった点
appscript.jsonに使うものは手書きしないといけない
appscript.jsonというマニフェストに、使用するものはoauthScopes
に手書きしないといけない
コード的に使用しているものがうまく認識されれば勝手に入るらしいけど、関数の引数で渡ってくるeventとかでformとか判断するのは無理そうだった
マニフェストに書いても有効になっていない
例えばGoogle Formであればhttps://www.googleapis.com/auth/forms
というURLを設定するが、スクリプトエディタの画面で実行ボタンを押した時に初めて出る認証のダイアログで認証が完了して初めて有効になる
ちなみにフォームから呼ばれた時等のイベント発火では当然ながらダイアログは出ない
submit関数2つある
submitが2つあるらしい
Google Formのものではなく間違えてSpreadSheetへのアクセス権が設定されていてもsubmitのタイミングで呼び出せてしまって、以下のサンプルコードでformの値を取得するために使われているgetItemResponses
関数がundefined
となりまともに動作しない
更に自分の環境が悪いのかgetItemReponses
がundefined
だというエラーが自分の環境だと表示されず*1
aliasに設定してないと送信できない
これはやらないとできないと書いてる記事を見て、やってない場合にできないことを体力が削られすぎて確認まではしてない。とりあえず自分は設定したのでもしメール送れなかったら確認してもいいかも
サンプルコード
以下設定値とサンプルコード
{ "timeZone": "Asia/Tokyo", "oauthScopes": ["https://www.googleapis.com/auth/script.send_mail", "https://www.googleapis.com/auth/gmail.modify", "https://www.googleapis.com/auth/forms" ], "dependencies": { }, "exceptionLogging": "STACKDRIVER" }
"use strict"; function myFunction(e) { var itemResponses = e.response.getItemResponses(); var msg = itemResponses.map(function (res) { return res.getItem().getTitle() + ":\n" + res.getResponse(); }).join('\n\n'); var address = ''; var options = { noReply: true, from: address }; GmailApp.sendEmail(address, 'HPお問い合わせ', msg, options); console.log('done'); }
最後に
参考にさせていただいた記事のおかげでとりあえず動くものはできました。ありがとうございます。
*1:undefinedを関数としてコールしてんだからエラー出せよとすごい思う