ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

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つあるらしい

qiita.com

Google Formのものではなく間違えてSpreadSheetへのアクセス権が設定されていてもsubmitのタイミングで呼び出せてしまって、以下のサンプルコードでformの値を取得するために使われているgetItemResponses関数がundefinedとなりまともに動作しない

更に自分の環境が悪いのかgetItemReponsesundefinedだというエラーが自分の環境だと表示されず*1

aliasに設定してないと送信できない

これはやらないとできないと書いてる記事を見て、やってない場合にできないことを体力が削られすぎて確認まではしてない。とりあえず自分は設定したのでもしメール送れなかったら確認してもいいかも

tonari-it.com

サンプルコード

以下設定値とサンプルコード

{
  "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を関数としてコールしてんだからエラー出せよとすごい思う