Email 递归会影响MailApp的输出吗? 目标

Email 递归会影响MailApp的输出吗? 目标,email,google-apps-script,google-sheets,google-apps,Email,Google Apps Script,Google Sheets,Google Apps,根据某人是否已收到电子邮件发送HTML电子邮件,并根据谷歌电子表格中适用行中的单元格内容有条件地向该电子邮件添加某些链接 背景 我使用的是一个独立的脚本(因为这只是其中的一个函数,它本身可以独立运行),它可以执行并且大多数时候会发送电子邮件。我设置了我的测试,这样就可以满足发送两封电子邮件的条件,但是,大多数时候只发送一封。我最初认为这是一个需要成功处理程序的问题,因为我调用了createTemplateFromFile()方法,并在三行之后对其进行评估,然后发送电子邮件。这是for循环的一部分

根据某人是否已收到电子邮件发送HTML电子邮件,并根据谷歌电子表格中适用行中的单元格内容有条件地向该电子邮件添加某些链接

背景 我使用的是一个独立的脚本(因为这只是其中的一个函数,它本身可以独立运行),它可以执行并且大多数时候会发送电子邮件。我设置了我的测试,这样就可以满足发送两封电子邮件的条件,但是,大多数时候只发送一封。我最初认为这是一个需要成功处理程序的问题,因为我调用了createTemplateFromFile()方法,并在三行之后对其进行评估,然后发送电子邮件。这是for循环的一部分,所以我希望有两封电子邮件。我的电子表格上有三行测试数据,但第一行是标题行

代码 代码.gs

function sendForms () {
/*this function will determine which people are new entries and then send them an email with a link to the form.
the email should include a short code which will be used as a verification*/
  var masterSS = SpreadsheetApp.openById("1GxM-NGk4kLOwaxFygJMfvafiL0lJmOCbCNsbmDmfJbU");
  var masterSheet = masterSS.getSheets()[0];
  var masterRange = masterSheet.getDataRange();
  var masterData = masterRange.getValues();
  var startRow = 1;
  for (var i = 1; i < masterData.length; i++) {
    var row = masterData[i];
    var emailAddress = row[2];
    var routineContact = row[5];
    var requireDrive = row[6];
    var compCheck = row[7];  
    var affidavit = " ";
      if (routineContact != "SENT" && routineContact != "RECEIVED" && routineContact != "No") {
      var affidavit = "<li>Form: <a href='www.duckduckgo.com'>Affidavit of Compliance with PA Background Checks</a> Verification Code: 169827C9</li>";
      masterSheet.getRange(startRow + i, 6).setValue("SENT");
  }
    var motorVehicleUsage = " "; 
      if (requireDrive != "SENT" && requireDrive != "RECEIVED" && requireDrive != "No") {
      var motorVehicleUsage = "<li>Form: <a href='www.yahoo.com'>Motor Vehicle Agreement</a> Verification Code: 13444C9</li>";
      masterSheet.getRange(startRow + i, 7).setValue("SENT");
  }
    var workersCompForm = " ";
      if (compCheck != "SENT" && compCheck != "RECEIVED") {
      var workersCompForm = "<li>Form: <a href='www.google.com'>Workers Compensation</a> Verification Code: 13589C9</li>";
      masterSheet.getRange(startRow + i, 8).setValue("SENT");
  }    
      if (motorVehicleUsage != " " && affidavit != " ") {
      //var html = function() {
      var sendingDate = new Date();
      var formatSendingDate = Utilities.formatDate(sendingDate, "GMT-05:00", 'DD');
      masterSheet.getRange(startRow + i, 10).setValue(formatSendingDate);
      var subject = "Additional Onboarding Forms";  
      var template = HtmlService.createHtmlOutputFromFile('Initial Form Email Message').getContent();
      template.workersCompForm = workersCompForm;
      template.motorVehicleUsage = motorVehicleUsage;
      template.affidavit = affidavit;
      var html = template.evaluate().getContent();//original
      MailApp.sendEmail(emailAddress, subject, "Requires HTML", {htmlBody:html});
      }
    }
  }
函数sendForms(){
/*此功能将确定哪些人是新条目,然后向他们发送带有表单链接的电子邮件。
电子邮件应包含一个简短的代码,用于验证*/
var masterSS=SpreadsheetApp.openById(“1GxM-NGk4kLOwaxFygJMfvafiL0lJmOCbCNsbmDmfJbU”);
var masterSheet=masterSS.getSheets()[0];
var masterRange=masterSheet.getDataRange();
var masterData=masterRange.getValues();
var startRow=1;
对于(变量i=1;i格式:验证代码:169827C9”;
masterSheet.getRange(startRow+i,6).setValue(“已发送”);
}
var motorVehicleUsage=“”;
if(requireDrive!=“已发送”&&requireDrive!=“已接收”&&requireDrive!=“否”){
var motorVehicleUsage=“
  • 格式:验证代码:13444C9
  • ”; masterSheet.getRange(startRow+i,7).setValue(“已发送”); } var workersCompForm=“”; 如果(compCheck!=“已发送”和&compCheck!=“已接收”){ var workersCompForm=“
  • 格式:验证代码:13589C9
  • ”; masterSheet.getRange(startRow+i,8).setValue(“已发送”); } 如果(机动车宣誓书和宣誓书){ //var html=function(){ var sendingDate=新日期(); var formatSendingDate=Utilities.formatDate(发送日期,“GMT-05:00”,“DD”); masterSheet.getRange(startRow+i,10).setValue(formatSendingDate); var subject=“其他入职表格”; var template=HtmlService.createHtmlOutFromFile('Initial Form Email Message').getContent(); template.workersCompForm=workersCompForm; template.motorVehicleUsage=机动车sage; 模板。宣誓书=宣誓书; var html=template.evaluate().getContent();//原始 sendmail(emailAddress,主题,“需要HTML”{htmlBody:HTML}); } } }
    html文件片段

    <ul>
        <?!= workersCompForm ?><?!= motorVehicleUsage ?><?!= affidavit ?>
    </ul>
    
    研究和解决方案? 我认为这可能是一个递归的问题,根据我从a上读到的内容,但它并没有完全回答我的问题。我读了另外两个关于递归的资料(,和),但我不是有意创建一个递归函数,至少我不认为我是,因为我几乎不理解它

    执行日志显示使用setValues()方法更新的第二行和第三行的值,这是我想要的行为,但大多数情况下只显示发送的电子邮件的一个实例。对收件人正确评估了电子邮件,但只发送了一封电子邮件,我在该实例中查找每行一封

    但我真的不知道如何修复它。我在想我需要将电子邮件的发送放在一个单独的函数中,并将参数传递给它。如果我这样做,我不确定参数是什么,因为我认为使用“return”将结束函数

    我的另一个想法是,如果我必须为我想打印在HTML文件上的三个变量中的每一个都创建一个函数,但是直接将它们放在HTML文件上

    我真的很想了解我的代码是怎么回事,我也想修复它,但要理解为什么修复会起作用

    我添加了我的电子表格和脚本的可查看副本。虽然我使用的是电子表格中的实际电子邮件地址。但这些是我测试的条件,只给了我一封电子邮件


    我找到了这个问题的解决方案。我需要的是一个类似于闭包的东西,或者实际上是一个闭包。我从网上读到的东西中得到了我的解决方案

    在我的代码的这一部分
    if((motorVehicleUsage!=“”| | |誓章!=“”)和&workersCompForm!=“”)之后
    我添加了一个命名函数,该函数将三个变量作为我在代码前面定义的参数,并返回一个经过评估的html输出,我将其作为电子邮件发送

    现在,执行日志完全按照我的要求执行。它们获取第2行,评估并更新它,然后发送电子邮件,然后获取第3行,并按顺序执行相同的操作

    我的更新代码:
    我仍然不知道递归是否是一个问题,或者这是否是编写代码的一种有效方法,但它现在的工作方式是我想要的。

    我找到了这个问题的解决方案。我需要的是一个类似于闭包的东西,或者实际上是一个闭包。我从网上读到的东西中得到了我的解决方案

    在我的代码的这一部分
    if((motorVehicleUsage!=“”| | |誓章!=“”)和&workersCompForm!=“”)之后
    我添加了一个命名函数,该函数将三个变量作为我在代码前面定义的参数,并返回一个经过评估的html输出,我将其作为电子邮件发送

    现在,执行日志完全按照我的要求执行。它们获取第2行,计算并更新它,然后
     if ((motorVehicleUsage != " " || affidavit != " ") &&  workersCompForm != " ") {
     var sendingDate = new Date();
     var formatSendingDate = Utilities.formatDate(sendingDate, "GMT-05:00", 'DD');
     masterSheet.getRange(startRow + i, 10).setValue(formatSendingDate);
    
     function sendHtmlEmail(a, b, c) {
       var template = HtmlService.createTemplateFromFile('Initial Form Email Message');
       this.a = a.toString();
       this.b = b.toString();
       this.c = c.toString();
       template.workersCompForm = this.a;
       template.motorVehicleUsage = this.b;
       template.affidavit = this.c;
       var htmlMessage = template.evaluate().getContent();//original
       return htmlMessage;
       }
    
     var html = sendHtmlEmail(workersCompForm, motorVehicleUsage, affidavit);
     var subject = "Additional Onboarding Forms"; 
     MailApp.sendEmail(emailAddress, subject, "Requires HTML", {htmlBody:html});
     }