1

我在 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);
  }
}
4

2 回答 2

0

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

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

示例表

此外,您可以触发您的处理以在表单提交时运行,而不是简单的“onEdit”——这可以避免 ScampMichael 指出的问题。或者,您可以使用可安装的编辑触发器,如本答案中所述。

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

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

于 2012-12-14T01:49:52.803 回答
0

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

你也可以:

  • 解释它应该如何工作
  • 解释它现在是如何工作的,尤其是“以前的电子邮件”是什么意思
  • 删除代码中的拼写错误(行 [2] 不是第一列)
  • 解释你是如何触发这个函数的:这个名字onEdit(e)暗示了一个 onEdit 触发器,但简单的触发器不能发送邮件,所以我想你已经设置了一些其他的触发器。
  • 解释为什么(e)在你的函数参数中而不使用它?

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

这并不像乍一看那么简单;-)

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

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

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

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

告诉我们您的想法/偏好,我(或其他人)可能会给您一些代码来开始。

于 2012-12-08T15:32:51.503 回答