【问题标题】:Recursion affecting output for MailApp?递归影响MailApp的输出?
【发布时间】:2015-12-18 19:03:36
【问题描述】:

目标

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

背景

我正在使用一个独立的脚本(因为这只是其中的一个函数,它实际上可以独立于自身)执行并且大多数时候会发送一封电子邮件。我设置了我的测试,以便满足发送两封电子邮件的条件,但是,大多数时候只发送一封。我最初认为这是需要成功处理程序的问题,因为我调用了 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});
      }
    }
  }

html文件sn-p

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

研究与解决方案?

根据我从similar post about passing a variable into an HTML File 中读到的内容,我认为这可能是一个递归问题,但它并没有完全回答我的问题。我阅读了另外两个关于递归的资料(iteration and recursionJava and recursion),但我并没有刻意尝试创建递归函数,至少我不认为是因为我几乎不理解它。

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

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

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

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

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

Script Link

Spreadsheet Link

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2021-08-06
      • 2020-06-14
      • 1970-01-01
      相关资源
      最近更新 更多