递归影响MailApp的输出?

时间:2015-12-18 19:03:37

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

目标

根据某人是否已收到电子邮件发送HTML电子邮件,并根据Google电子表格中相应行中的单元格内容有条件地向此电子邮件添加某些链接。

背景

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

代码

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中读到的内容,但它并没有完全回答我的问题。我读了两个关于递归的其他来源(iteration and recursionJava and recursion),但我并没有故意尝试创建一个递归函数,至少我不认为我是因为我真的很难理解它。

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

我真的不知道如何修复它。我想我需要将电子邮件发送到单独的函数并将参数传递给它。如果我这样做,我不确定参数是什么,因为我认为使用&#39; return&#39;会结束这个功能。

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

我真的很想了解我的代码发生了什么,我也希望修复它,但要理解为什么修复可行。

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

Script Link

Spreadsheet Link

1 个答案:

答案 0 :(得分:0)

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

在我的代码if ((motorVehicleUsage != " " || affidavit != " ") && 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});
 }

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