【问题标题】:Spreadsheet Email Trigger电子表格电子邮件触发器
【发布时间】:2012-12-08 14:34:11
【问题描述】:

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

【问题讨论】:

  • OnEdit 不是要走的路。如果 onEdit 触发器是从电子表格中的更改触发的,则它不会发送电子邮件,只有在从代码编辑器运行时才会发送电子邮件。此外,如果它确实发送了电子邮件,它会为您更改的每个单元格发送一封电子邮件。如果行中输入了三个项目,则每行至少尝试三次。您可能应该创建一个按钮或菜单项,可以在完成该行后单击以发送该行的电子邮件。

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


【解决方案1】:

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

你也可以:

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

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

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

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

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

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

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

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

【讨论】:

【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 2014-09-14
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多