电子表格电子邮件触发器

时间:2012-12-08 14:34:12

标签: google-apps-script google-sheets google-spreadsheet-api

我在Google电子表格上有书面脚本,可以在修改电子表格或添加任何数据时发送电子邮件。电子邮件触发器正常工作,但无论何时在下一行输入任何数据,它都会将电子邮件发送到以前的电子邮件地址。

请建议解决方案

以下是编写的脚本:

function onEdit(e) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = 1;   // Number of rows to process
  var dataRange = sheet.getRange(startRow, 1 , numRows,3) // Fetch the range of cells A2:B3

  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
for (i in data) {
    var row = data[i];
    var emailAddress = row[2];  // First column
    var message = row[0] + "requested" + row [1];       // Second column
    var subject = "Sending emails from a Spreadsheet";
    MailApp.sendEmail(emailAddress, subject, message);
  }
}

2 个答案:

答案 0 :(得分:1)

您似乎正在使用共享电子表格来收集添加用户请求,并信任请求者填写信息。在您共享的详细信息文档中,进一步显示请求已添加,但未进行编辑。 (这是一个重要的简化区别。)

我建议您真正需要的是使用表单来接收该输入。使用表单将在您的电子表格中创建一个“数据表”,一组您不应该乱用的列。 (您可以编辑内容,添加和删除行,但不能添加或删除列。)但是,您可以在此表之外的电子表格中添加列,这为您提供了一个方便的位置来存储有关个人状态的状态信息请求。

Example sheet

此外,您可以触发您的处理以在表单提交上运行,而不是简单的“onEdit” - 这可以摆脱ScampMichael指出的问题。或者,您可以使用可安装的编辑触发器,如in this answer所述。

尝试this sheetthis form。保存自己的副本,进入脚本并删除阻止发送电子邮件的评论,然后尝试一下。电子表格中有一个菜单项可以启动处理;只需清除“请求状态”列即可重新运行它。您可以打开表单(并找到其URL),并添加更多条目进行实验。

它是我编写的类似系统的核心,并包含一个用于处理请求的谨慎状态机。我的系统在多个电子表格中包含大量非常复杂的数据,因此它经常被抢占,然后需要再次运行。 (我使用定时触发器。)这就是通过状态处理请求的原因。如果您发现太复杂,请仅拉出您需要的部件。

答案 1 :(得分:0)

您的问题不清楚...在脚本中没有任何地方我看到某些内容会读取哪些单元格实际被修改...您的目标范围在第2行是硬编码的,因此唯一可以处理的行是第2行(和邮件)只能发一次)...

你也可以:

  • 解释它应该如何运作
  • 解释它现在是如何运作的,特别是“你以前的电子邮件”是什么意思
  • 删除代码中的拼写错误(第[2]行不是第一列)
  • 解释如何触发此功能:名称onEdit(e)建议使用onEdit触发器,但简单触发器无法发送邮件,因此我认为您已设置了其他触发器。
  • 解释为什么(e)在您的函数参数中而不使用它?

编辑:感谢您提供的补充信息。 你建议的脚本不足以实现你想要的。这里的想法是通过添加(或插入)一行数据或(如果我理解的话)通过编辑任何行来检查工作表中的某些内容是否已被修改在具有新值的工作表中。

这并不像第一眼看上去那么简单; - )

我会采取什么方式拍摄工作表的“快照”并基于timeronEdit - 将该快照与工作表的当前状态进行比较。

获得该结果的方法不止一种,您可以在电子表格中设置第二张无人可修改的工作表,这是您在每次修改/邮件发送后更新的主工作表的副本。因此,在更新脚本之前,应查找工作表之间的任何差异,并在发现差异时将报告发送到相应的电子邮件。

另一种方法是在脚本属性中存储转换为字符串的工作表数据,原理相同,但对于访问电子表格的普通用户来说,它更“不可见”。

您也可以使用scriptDb或您的userproperties,但脚本属性可能更适合(更简单)此用例。

告诉我们您的想法/偏好,我(或其他人)可能会为您提供一些代码。