💡

Googleフォームを送信せずにGASをテスト/デバッグする方法

2023/03/01に公開

引き続き自分用の備忘録。Googleフォームの通知メール・自動返信メールのスクリプトを作った際の学びです。

テストのたびに、毎回フォームに回答する?

通知メールや自動返信メールを送る際に、フォームの回答者メールアドレスや回答内容を

function sendForm(e){
  const emailOfRespondent = e.response.getRespondentEmail();
  const responseItems = e.response.getItemResponses();
  //以下略
}

という感じで取得するわけですが、実際に回答が送信されたときでないと eundefined になり、エラーになってしまいます。このままでは、テストやデバッグをするために毎回フォームに回答しないといけません。

送信済の回答を取得する

そんなことはとてもやっていられないので、どうにかうまくやる方法はないかと調べたら、こちらの質問と回答を発見できました。

google formのスクリプトをデバッグする方法(回答して「onsend」を発動させずに)

要はフォームにあらかじめ1件だけ回答を送信しておき、テスト時はその送信済の回答から値を取得するということですね。なるほど。

テスト時は e.response のかわりに FormApp.getActiveForm().getResponses()[0] を使い、

function sendForm(e){
  const emailOfRespondent = FormApp.getActiveForm().getResponses()[0].getRespondentEmail();
  const responseItems = FormApp.getActiveForm().getResponses()[0].getItemResponses();
  //以下略
}

という感じで回答者メールアドレスや回答内容を取得すれば、簡単にテストやデバッグができるわけです。

(改善版) 通知メール・自動返信メールのコード

理屈が分かったので、三項演算子を使って eが定義できるか否か で場合分けして、ひとつのコードにしてしまいます。

Googleフォームの通知メール・自動返信メールのスクリプトのコードの最初の部分、回答者メールアドレスと回答内容を取得する部分を以下のように書き換えます。

function sendForm(e){  
  const thisResponse = 
    //eが定義できる場合(=通常の回答送信時)は送信されたその回答を取得
    (e !== undefined) ? e.response 
    //そうでない場合(=テスト時)は送信済の1件目を取得
    : FormApp.getActiveForm().getResponses()[0]; 
  // 回答者メールアドレスと回答内容を取得
  const emailOfRespondent = thisResponse.getRespondentEmail();
  const responseItems = thisResponse.getItemResponses();
  // 以下略

こうすることで、ひとつのコードでテスト用・本番用を兼ねられるようになりました。

その他メモ

  • 三項演算子をはじめて使った(if文しか使ったことなかった)。場合分けしつつ、そのまま変数宣言できるの便利。
  • まだいまいち「テストを書く」という概念に慣れていない気がする。引き続き学び、慣れる。

Discussion