見出し画像

[GAS]フォーム未回答者へ督促メール送信(その3)最後の回答者が回答した時点で自分宛てに完了メールを送信

前回まで「トリガー」を用い、あらかじめ指定した時間にGoogleフォーム未回答者を判別し、督促メールを送信するスクリプトを紹介しました。

前回では「あらかじめ設定したトリガー発動時に未回答者がいない場合 = 自分宛てに「完了しました」メールを送信する」というスクリプトを書きましたが、実際には「最後の回答者が回答した時点で自分宛てに「完了しました」メールを送信する」としたほうが実用的です。

トリガーでは「フォーム送信時]」に発動できるので、今回は

●未回答者がいる場合  = 何もしない
●未回答者がいない場合 = 自分宛てに「完了しました」メールを送信

という条件分岐を設定します。

フォームはこちら。

function formAnswer3() {

 const ss          = SpreadsheetApp.getActiveSpreadsheet();
 const memberSheet = ss.getSheetByName("allMember");
 const answerSheet = ss.getSheetByName("フォームの回答1");

 //シート[allMember]から全員のメアド、[フォームの回答1]から回答済みメンバーのメアドを取得
 const array01 = memberSheet.getRange(2, 2, memberSheet.getLastRow() - 1).getValues().flat();
 const array02 = answerSheet.getRange(2, 2, answerSheet.getLastRow() - 1).getValues().flat();
 const array03 = [];

 //pushメソッドを用い差分をarray03に代入
 for (const num of array01) {
   if (!array02.includes(num)) {
     array03.push(num);
   }
 }

 const mailSheet = ss.getSheetByName("mail");

 const recipient = array03;
 const subject   = mailSheet.getRange(1, 2).getValue();
 const body      = mailSheet.getRange(2, 2).getValue();

 //  GmailApp.sendEmail(recipient, subject, body); //メール送る      
 //  GmailApp.createDraft(recipient, subject, body); //メール下書き     

}

function checkMember() {

 const ss          = SpreadsheetApp.getActiveSpreadsheet();
 const memberSheet = ss.getSheetByName("allMember");
 const answerSheet = ss.getSheetByName("フォームの回答1");

 //シート[allMember]から全員のメアド、[フォームの回答1]から回答済みメンバーのメアドを取得
 const array01 = memberSheet.getRange(2, 2, memberSheet.getLastRow() - 1).getValues().flat();
 const array02 = answerSheet.getRange(2, 2, answerSheet.getLastRow() - 1).getValues().flat();
 const array03 = [];

 //pushメソッドを用い差分をarray03に代入
 for (const num of array01) {
   if (!array02.includes(num)) {
     array03.push(num);
   }
 }

 //未回答者がいなかったら完了メールを自分宛てに送信
 if (array03 == '') {
   const myAddress  = 'me@example.com'; //自分のメアドを設定
   const mail2Sheet = ss.getSheetByName('mail2');
   const subject2   = mail2Sheet.getRange(1, 2).getValue();
   const body2      = mail2Sheet.getRange(2, 2).getValue();

   GmailApp.sendEmail(myAddress, subject2, body2); //完了メールを自分宛てに送信

//予め設定したトリガーを削除
   const triggers = ScriptApp.getProjectTriggers();
   for (const trigger of triggers) {
     if (trigger.getHandlerFunction() == "formAnswer3") {
       ScriptApp.deleteTrigger(trigger);
     }
   }

 }
}

トリガーはそれぞれ以下のように設定します。

function [formAnswer3]  = 締め切りの前日、前々日など
function [checkMember] = フォーム送信時

「フォーム送信時」のトリガー設定は以下の通り。

画像1

以下の部分で「あらかじめ設定したトリガーを削除」を実装します。

未回答者に督促メールを送信する日(締め切りの前日、前々日など)よりも前に全員の回答が集まった場合、トリガーで設定したformAnswer3関数は実行不要なので削除します。

//予め設定したトリガーを削除
   const triggers = ScriptApp.getProjectTriggers();
   for (const trigger of triggers) {
     if (trigger.getHandlerFunction() == "formAnswer3") {
       ScriptApp.deleteTrigger(trigger);
     }
   }

これでだいぶ実用的なスクリプトになりました。

この記事が気に入ったらサポートをしてみませんか?