前提
-
WordPressのセミナー予約機能からセミナー受付のメールが飛ぶ。
-
そのメールを取得して、spreadsheetに予約者情報が記録される(セミナーテーマ、セミナー日程、名前、Email等)。
-
別途、spreadsheetには、セミナー日程の一覧シート(セミナー日程など)があり、セミナー日程は一意(一つしかない)で、予約者情報に登録されたセミナー日程と合致すれば、セミナー日程の1日前にGoogle MeetのセミナーURLが自動的に配信される仕組みをGASで作っている。
-
spreadsheetには、2つのシートがある。
セミナーフォーム(gmailから参加者情報を取得)
セミナーURL事前配信シート(セミナー日程一覧)
やりたいこと
セミナーの1日前の特定時間(例えば17:00)にGoogle MeetのURLを参加者に送信したい。
起きている問題点(以下2点を解決したい)
- 一人の参加者に大量のメール(URL)が届き、GASの一日の処理範囲を超えてしまった。
=>おそらく、ループ処理に問題がある。
- トリガーをセミナー1日前に設定(特定の時間)しているが、機能していない。
問題のコード
function sendSeminarURL(){ //対象シートを取得 const ss = SpreadsheetApp.getActiveSpreadsheet(); let seminarForm = ss.getSheetByName("セミナーフォーム"); let values = seminarForm.getDataRange().getValues(); for(let i = 2; i <= values.length; i++) { //セミナーの日付の取得 let seminarDate = seminarForm.getRange(i,3).getValue(); seminarDate = Utilities.formatDate(seminarDate,'Asia/Tokyo','yyyy/MM/dd'); //もし、取得したセミナー日程と別シート(セミナー日程一覧表)で設定したセミナー日程(一つしかない)が合致すれば、セミナー情報を取得する。 if(seminarDate == getSeminarDate()){ //セミナータイトルの取得 let seminarTitle = seminarForm.getRange(i,2).getValue(); //セミナー時間の取得 let seminarTime = seminarForm.getRange(i,4).getValue(); seminarTime = Utilities.formatDate(seminarTime,'Asia/Tokyo','yyyy/MM/dd'); //名前の取得 let receiverName = seminarForm.getRange(i,5).getValue(); //Emailの取得 let receiverEmail = seminarForm.getRange(i,9).getValue(); /* メール表題、fromアドレス、差出人名を準備 */ let subject = "【@@@@】セミナーURLを送ります。"; let options = { name: "@@@@@", replyTo: "@@@@gmail.com", htmlBody: doGet(receiverName, seminarTitle, seminarDate, seminarTime), }; /* メールを送信 */ GmailApp.sendEmail(receiverEmail, subject, 'セミナーURLの送信', options); } } setTrigger(sendSeminarURL()); inputStatus(); inputStatusTime(); deleteTrigger(sendSeminarURL()); } //HTMLテンプレートを以下で取得(テンプレートには、氏名、セミナーテーマ、日程、時間を記載する。) function doGet(name, title, date, time){ const htmlOutput = HtmlService.createTemplateFromFile("deliverURL").evaluate().addMetaTag('viewport','width=device-width,initial-scale=1,minimal-ui'); const contentForMail = htmlOutput.getContent().replace(/{氏名}/g,name).replace(/{テーマ}/g,title).replace(/{日程}/g,date).replace(/{時間}/g,time); return contentForMail; } //セミナーURL事前配信シートの最後のカラムからセミナー日付を取得する。 function getSeminarDate(){ //対象シートを取得 const ss = SpreadsheetApp.getActiveSpreadsheet(); const seminarURL = ss.getSheetByName("セミナーURL事前配信シート"); //セミナーURL事前配信シートの最終行を取得 const lastRow = seminarURL.getDataRange().getLastRow(); //セミナーURL事前配信シートの日付を取得 for(let i = lastRow; i >= 2; i--){ if(seminarURL.getRange(i, 2).getValue() != ''){ let date = seminarURL.getRange(i, 2).getValue(); date = Utilities.formatDate(date,'Asia/Tokyo','yyyy/MM/dd'); return date; break; } } } //セミナー開催日の前日17:00にトリガーを設定 function setTrigger(triggerFunction){ let seminarDate = new Date(getSeminarDate()); let yesterday = new Date(new Date(seminarDate.setDate(seminarDate.getDate() -1)).setHours(17,00)); let trigger = ScriptApp.newTrigger(triggerFunction).timeBased().at(yesterday).create(); return trigger; } //トリガーの削除 function deleteTrigger(targetHandlerFunction) { // 現在のプロジェクトで設定済みのすべてのトリガーを取得 const triggers = ScriptApp.getProjectTriggers(); // 各トリガーについてループ for ( const trigger of triggers ) { // トリガーに設定されている関数と targetHandlerFunction が一致する場合にトリガーを削除 if ( trigger.getHandlerFunction() === targetHandlerFunction ) { ScriptApp.deleteTrigger( trigger ) ; } } }
エラーが出るわけではなく、実行されるが、大量のメールが送られてきます。
どこに問題点があるのか、ご指摘いただけないでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。