Google应用脚本触发器无效

问题描述 投票:5回答:4

我有一个发送电子邮件的谷歌应用程序脚本,我设置了一个触发器,以便它在每个表单提交时发送电子邮件。问题是触发器在最初的几分钟内完全正常,但后来甚至在输入正确的数据之后。脚本不发送邮件,我必须手动按下脚本的执行按钮。这是我的代码

var EMAIL_SENT = "EMAIL_SENT";
function sendEmailsapp() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = sheet.getLastRow();   // Number of rows to process
  // Fetch the range of cells A2:B3

  var dataRange = sheet.getRange(startRow, 1, numRows,8)
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[4];  // First column
    var message = row[5];       // Second column
    var emailSent = row[7];  // Third column
    var money=row[6]
    if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates
      var subject = "You have been registered for follwoing events:-";
      var event;

      MailApp.sendEmail(emailAddress, subject, "Please bring your college id and copy of this mail either in phone or printed paper"+
                        "\n\n"+"Name:-"+row[1]+"\n"+"USN:-"+row[2]+"\n"+"Mobile:-"+row[3]+"\n"+"Event:-"+ message+"\nMoney status:-"+money+"You registered on"+row[0]);
        sheet.getRange(startRow + i, 8).setValue(EMAIL_SENT);


      // Make sure the cell is updated right away in case the script is interrupted
      SpreadsheetApp.flush();
    }
  }
}

代码工作正常。唯一的问题是触发器。

这是我的触发器的图像。 sendEmailsapp是触发器,sendEmailsweb是另一个也遇到同样问题的触发器。

这是日志

我唯一的问题是触发器没有被触发,它不是发送电子邮件。

google-apps-script google-sheets triggers google-form eventtrigger
4个回答
21
投票

即使脚本是正确的,我的触发器也不像你的那样工作。

解决方案非常愚蠢。我删除了触发器并添加了一个新触发器。完全相同的触发器。


10
投票

我的脚本遇到了这个问题,但我使用Time-Driven作为事件。我每分钟设置它,但它不会做任何事情。使用上面写的日志记录方法,我发现触发器工作正常 - 我设置的每一分钟。但它实际上并没有像我明确点击“运行”按钮时那样做。

我怀疑它与以下行有关:

var sheet = SpreadsheetApp.getActiveSheet();

所以我玩了它并改为:

var spreadsheet = SpreadsheetApp.openById("INSERT_SPREADSHEET_ID_HERE");
var sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);

它终于奏效了。

INSERT_SPREADSHEET_ID_HERE替换为电子表格的ID(来自您的网址https://docs.google.com/spreadsheets/d/INSERT_SPREADSHEET_ID_HERE/edit#gid=0)。

getSheets()[0]0将是您在该特定电子表格中可能的多张表格中的第一张。

我希望这有助于任何方式。


1
投票

我发现有用的是在“资源>当前项目触发器”中将通知设置为立即。我设置它给我发错误邮件。该电子邮件包含您可以解决的问题的详细信息:)。


0
投票

我愿意打赌这个问题不是触发器。即使您的代码有效,也可能是阻止代码的条件部分工作的条件。您可以测试该功能是否实际触发,即使它没有给您预期的结果。在函数后立即放置一个Logger.log()语句:

function sendEmailsapp() {
  Logger.log('sendEmailsapp ran!');

然后查看LOGS。我无法相信该功能没有被触发。电子邮件可能没有被发送,但我愿意打赌你会得到msg'sendEmailsapp跑了!'打印到LOGS。所以,这是你需要做的第一件事。

您需要做的下一件事是在检索电子邮件后立即发出Logger.log()语句:

var emailSent = row[7];
Logger.log('value of the email is: ' + emailSent);

然后检查LOGS以确定实际返回的值。如果返回的每个值都是“EMAIL_SENT”,则不会发送任何电子邮件。

我们需要知道实际结果是什么。您需要提供打印到LOGS的内容。

© www.soinside.com 2019 - 2024. All rights reserved.