0

我正在尝试使用 Google App Scripts 为我发送我编写的 HTML 电子邮件。我的代码工作到可以发送电子邮件的程度,但是正如您在我的代码中看到的那样,我有 4 个不同的模板要发送。. 正如您将看到的,我有一些代码将模板更改为 1 以找到正确的模板和 dateMath 以增加下一封电子邮件发送的日期。

我现在遇到的问题是 deleteRow 和 appendRow。我有 2 个用户正在尝试通过电子邮件发送,当我运行代码 deleteRow 和 appendRow 时,将其中一个用户替换为另一个用户。我的屏幕截图会更有意义。这里有什么见解吗? 脚本之前

脚本之后

function sendEmails(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var today = Utilities.formatDate(new Date(), "MDT", "dd/MM/yyyy");
  for(var i = 1; i<data.length; i++){
    
    if(data[i][3] !== ""){ //skip if is empty
     
      if(isValidDate(data[i][3])){ //skip if isn't a valid date
        
        var formattedDate = Utilities.formatDate(data[i][3], "MDT", "dd/MM/yyyy"); 

        if(formattedDate == today){ //send email if checkin date is today
          
          if(data[i][4] == 1) {  
           var template = HtmlService.createTemplateFromFile('Template1');
          } else if(data[i][4] == 2){
            var template = HtmlService.createTemplateFromFile('Template2');
          } else if(data[i][4] == 3){
            var template = HtmlService.createTemplateFromFile('Template3');
          } else {
            var template = HtmlService.createTemplateFromFile('Template4');
          }                                                                                                      
          var email = data[i][2];
          var firstName = data[i][0];
          var lastName = data[i][1];
          template.firstName = firstName;

          var subject = "Your Next Steps ";
        
          var bcc = "spencer@kwwestfield.com";
  
          var message = template.evaluate();
        
          GmailApp.sendEmail(email,
           subject,
           message.getContent(), {
             htmlBody: message.getContent(),
             bcc: bcc
          });
          
          //change the template
          //delete the row
          sheet.deleteRow(i+1);
          //add the row again
          var newTemplate = data[i][4] + 1;
          var newSend = dateMath(data[i][3], 8);
          sheet.appendRow([firstName, lastName, email, newSend, newTemplate]);
          
        }
      } 
    }
  }
}

/**
 * Does math on dates
 * Triggered from functions
 * Input: date = the orginal date, d = +- number of days
 * Output: a new date
 */
function dateMath(date,d){
  var result = new Date(date.getTime()+d*(24*3600*1000));
  return result
}                  


/**
 * Figures out if is a data
 * Triggered from functions
 * Input: d: any
 * Output: boolean
 */
function isValidDate(d) {
  if ( Object.prototype.toString.call(d) !== "[object Date]" ){
    return false;
  } else {
    return true; 
  }
}

4

1 回答 1

0

因为您正在删除一行,所以该i值不再对应于相同的范围。例如,您有一个包含 5 个元素的数组:

[A, B, C, D, E]

如果你删除 element 0,你会得到

[B, C, D, E]

现在你增加你的迭代器i++; // i = 1,所以你要操作的下一个不是“B”,而是“C”。

你可以通过运行这个来尝试自己

function test() {
  var letters = ["A", "B", "C", "D", "E"];
  for (var i=0; i<letters.length; i++) {
    Logger.log("i : " + i + " || Letter: " + letters[i]);
    letters.shift();
  }
}

要修复您的代码,请添加一个row独立于您的数组迭代器的变量i

function sendEmails(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var today = Utilities.formatDate(new Date(), "MDT", "dd/MM/yyyy");
  var row = 2; // Starting at row 2
  for(var i = 1; i<data.length; i++){

    if(data[i][3] !== ""){ //skip if is empty

      if(isValidDate(data[i][3])){ //skip if isn't a valid date

        var formattedDate = Utilities.formatDate(data[i][3], "MDT", "dd/MM/yyyy"); 

        if(formattedDate == today){ //send email if checkin date is today

          if(data[i][4] == 1) {  
           var template = HtmlService.createTemplateFromFile('Template1');
          } else if(data[i][4] == 2){
            var template = HtmlService.createTemplateFromFile('Template2');
          } else if(data[i][4] == 3){
            var template = HtmlService.createTemplateFromFile('Template3');
          } else {
            var template = HtmlService.createTemplateFromFile('Template4');
          }                                                                                                      
          var email = data[i][2];
          var firstName = data[i][0];
          var lastName = data[i][1];
          template.firstName = firstName;

          var subject = "Your Next Steps ";

          var bcc = "spencer@kwwestfield.com";

          var message = template.evaluate();

          GmailApp.sendEmail(email,
           subject,
           message.getContent(), {
             htmlBody: message.getContent(),
             bcc: bcc
          });

          //change the template
          //delete the row
          sheet.deleteRow(row);
          row--; // Deleted a row
          //add the row again
          var newTemplate = data[i][4] + 1;
          var newSend = dateMath(data[i][3], 8);
          sheet.appendRow([firstName, lastName, email, newSend, newTemplate]);

        }
      } 
    }
    row++; // Go to the next row
  }
}
于 2018-04-08T03:51:37.927 回答