Повторяющиеся сообщения электронной почты, отправленные из проекта Apps Script с еженедельным срабатыванием по времени.

Приведенный ниже сценарий правильно отправлял одно еженедельное электронное письмо каждому человеку, который соответствовал условиям, указанным в сценарии. Триггер работает по времени и запускается еженедельно в понедельник утром. Этим утром скрипт запускался 4 раза, и одни и те же люди 4 раза получали одно и то же письмо.

Единственное, о чем я могу думать, - это то, что на прошлой неделе я поместил ярлык для листа в общую папку. В папке есть 5 человек, которые могут получить доступ ко всему в ней - я и еще 4 человека. Я на 100% уверен, что никто из других людей не открывал Лист или скрипт, не говоря уже о том, чтобы он запускал или создавал другой триггер.

Почему это могло произойти и что я могу сделать, чтобы это исправить? Любая помощь очень ценится!

Выполнено 4 раза в журналах Stackdriver - область "Мои казни"

Настроен только 1 триггер

Полный сценарий ниже

function sendEmailLoop() {

  var sheets =   SpreadsheetApp.getActiveSpreadsheet().getSheets();
  sheets.forEach(function(sheet) {
    var range = sheet.getDataRange();

    if (sheet.getName() == "Summary") //Disregard tab named 'Summary' 
    {      
    }

    else {    
      var range = sheet.getDataRange(); //to set the range as array
      var values = range.getDisplayValues(); //to get the value in the array
      var lastRow = range.getLastRow();
      var ss = SpreadsheetApp.getActiveSpreadsheet();  //declare the spreadsheet
      var sheet = ss.getSheetByName("Sheet1");
      var message = "";
      var i;
      var logContent = '';


      for (i = 3; i < lastRow; i++) { 
        if (values[i][8] == 'TRUE') {

      var EmpName = values[i][0];        //[Name] cell A++
      var EmpEmail = values[i][1];       // [Email] cell B++
      var SupName = values[i][2];       //[Supervisor Name] cell C++
      var SupEmail = values[i][3];      //[Supervisor Email] cell D++
      var LastComplete = values[i][4];  //[Last Completed Date] cell E++
      var DueDate = values[i][5];       //[Due date] cell F++
      var Title = values[0][0];         //[Title] cell A1
      var URL = values[0][1];         //[URL] cell B1
      var CertTo = values[1][1];      // [Certificate goes to] cell B2
      var curDate = values[0][4];
      console.log(EmpEmail);

        Logger.log('to: ' + EmpEmail);
        Logger.log('subject: ' + EmpName + Title + 'Test');
        Logger.log('message: ' + 'This is a test message for the training that can be found at ' + URL);


        if (EmpEmail == "") {
          continue;
        };

        message = "Dear " + EmpName + ","+
            "<br/><br/>This is a reminder that you must complete the " + Title + " training by " + DueDate + " in order to comply with the annual training requirement. You last completed the course on " +
              LastComplete + ". " + 
                "<p>Please complete the course at <a href=\ " + URL + ">this link</a> prior to the due date. You will continue to receive email reminders until you complete it. Once completed, please email a PDF of your completion certificate to your supervisor and " + CertTo + ".</p>" +
                "<em><br/><br/>**This email is auto-generated. If you already completed this training, please let your supervisor know.**</em>";

        MailApp.sendEmail({
          to: EmpEmail,
          cc: SupEmail,
          subject: 'Annual ' + Title + ' Training Reminder - Due ' + DueDate,
          htmlBody: message});
      }
      }; //end for loop - email tab data
    };   // end 'else'
  }); // end function(sheet)       
} // end SendEmailLoop()  


1 ответ

Решение

Это похоже на ошибку

Если это не исправлено, как обходной путь:

  • Используйте свойства сценария, чтобы сохранить время последнего выполнения
  • Реализовать if оператор в начале вашего кода, который выполняет остальную часть кода только в том случае, если последнее время выполнения (полученное из свойств скрипта) не менее одной недели назад

Образец:

function sendEmailLoop() {
  if(!PropertiesService.getScriptProperties().getProperty("lastExecution")){
    PropertiesService.getScriptProperties().setProperty("lastExecution", new Date().getTime());
  }
  var lastExecution = PropertiesService.getScriptProperties().getProperty("lastExecution");
  var now = new Date().getTime();
  var oneWeek = 1000*3600*24*7;
  if(now-lastExecution >= oneWeek){
    // paste here the rest of your code
    PropertiesService.getScriptProperties().setProperty("lastExecution", now);
  }
}
Другие вопросы по тегам