Google App脚本 - 自动发送电子邮件(特定问题删除行和appendRowL)

时间:2018-04-07 20:18:21

标签: google-apps-script google-sheets google-apps-script-editor

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

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

After Script

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

1 个答案:

答案 0 :(得分:0)

由于您要删除行,i值不再对应相同的范围。例如,您有一个包含5个元素的数组:

[A, B, C, D, E]

如果您删除元素0,则会获得

[B, C, D, E]

现在你增加你的迭代器i++; // i = 1,所以你操作的下一个不是&#34; B&#34;,而是&#34; ; C&#34 ;.

你可以试试这个

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的{​​{1}}变量。

i