递归影响 MailApp 的输出?

Recursion affecting output for MailApp?

目标

根据某人是否已收到电子邮件发送 HTML 电子邮件,并根据 [=53= 上适用行中单元格的内容有条件地向此电子邮件添加某些链接] 电子表格。

背景

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

代码

Code.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});
      }
    }
  }

html 文件片段

<ul>
    <?!= workersCompForm ?><?!= motorVehicleUsage ?><?!= affidavit ?>
</ul>

研究与解决方案?

我认为这可能是递归的问题,基于我从 similar post about passing a variable into an HTML File, but it didn't quite answer my issue. I read two additional sources about recursion (iteration and recursion, and Java and recursion) 中读到的内容,但我并不是有意尝试创建递归函数,至少我不认为我是因为我实在是看不懂。

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

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

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

我真的很想了解我的代码发生了什么,我也想修复它,但理解为什么修复会起作用。

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

Script Link

Spreadsheet Link

我找到了解决这个问题的方法。我需要的是类似闭包的东西,或者实际上是闭包。我通过尝试在 JavaScript Documentation on Mozilla 上阅读的内容获得了解决方案。

在我的代码的这一部分之后 if ((motorVehicleUsage != " " || affidavit != " ") && workersCompForm != " ") 我添加了一个命名函数,它将三个变量作为我在代码前面定义的参数并返回一个评估的 html 输出,我将其发送为一封电邮。

现在执行日志完全符合我的要求。他们使用第 2 行,对其进行评估和更新并发送电子邮件,然后使用第 3 行并按顺序执行相同操作。

我更新的代码:

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

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