質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

730閲覧

【GAS】ループ処理の失敗により、大量処理が発生、かつ、トリガーの時間設定ができない。

YousukeTanaka

総合スコア79

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/10/29 06:19

前提

  • 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 ) ; } } }

エラーが出るわけではなく、実行されるが、大量のメールが送られてきます。
どこに問題点があるのか、ご指摘いただけないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

js

1setTrigger(sendSeminarURL()); 2inputStatus(); 3inputStatusTime(); 4deleteTrigger(sendSeminarURL());

ここで無限に実行されてますね。
正しくは下記です。

js

1setTrigger(sendSeminarURL); 2inputStatus(); 3inputStatusTime(); 4deleteTrigger(sendSeminarURL);

setTriggerの直後にdeleteTriggerしてるので、トリガーはられてないのでは?と思うのですが、いかがでしょう。

投稿2021/01/19 23:32

macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問