在谷歌应用程序脚本中,如何在满足条件的情况下只发送一次电子邮件



当某个单元格具有所需值时,我正在尝试自动发送电子邮件。我想好了如何不断地做到这一点,也就是说,每天都会在一天中的某个时间触发一个触发器,以检查条件并在满足条件时发送电子邮件。但我希望触发器在发送一次电子邮件后停止工作。我想我可以这样做:

我有一个功能,如果满足条件,就会发送电子邮件。若不满足条件,将创建一个触发器,该触发器将再次运行该函数。依此类推,触发器将继续创建,直到满足条件为止。

这是我写的一个代码:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var ssName = ss.getName();
var emailAddress = ss.getRange("Tab1!B4").getValue();
var Test1 = ss.getRange("Tab1!B6").getValue();
function SendEmailOnce(){
  if (Test1 <= 10) {
    MailApp.sendEmail({
      to: emailAddress,
      subject: "Sample subject: " + ssName,
      htmlBody: "Sample message<br/> Regards, robot",
    });
    }
    else {
      function createTriggerCheckAgain() {
      ScriptApp.newTrigger('SendEmailOnce')
      .timeBased()
      .after(60 * 1000)
      .create();
      }
    }
}

出于某种原因,它不起作用。当我在Test1值为15时运行该函数,然后将值更改为5时,不会发送电子邮件。

如果它们是分开的,那么它的各个部分都可以工作:1.当我运行函数时,如果值为5,则发送电子邮件。2.当值为5时,在我运行创建该触发器的功能一分钟后发送电子邮件。

也许有一种更简单的方法可以做到这一点?我是JavaScript的新手。提前感谢您的任何建议。

当触发器在60秒后运行时,将不再定义Test1,因此无法检查undefined是否为<= 10。原因是只执行SendEmailOnce中的代码,而不执行它之外的代码。emailAddress变量也是如此。

您需要将前四行代码包含在可以调用的函数中,该函数返回Test1emailAddress的值,或者将其包含在SendEmailOnce函数中。

修改代码:

function SendEmailOnce(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssName = ss.getName();
  var emailAddress = ss.getRange("Tab1!B4").getValue();
  var Test1 = ss.getRange("Tab1!B6").getValue();
  if (Test1 <= 10) {
    MailApp.sendEmail({
      to: emailAddress,
      subject: "Sample subject: " + ssName,
      htmlBody: "Sample message<br/> Regards, robot",
    });
  }
  else {
    function createTriggerCheckAgain() {
      ScriptApp.newTrigger('SendEmailOnce')
      .timeBased()
      .after(60 * 1000)
      .create();
    }
  }
}

最新更新