我在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 回答
您似乎正在使用共享电子表格来收集添加用户请求,并信任请求者填写信息 . 在您共享的详细信息文档中,进一步显示请求已添加,但不是EDITED . (这是一个重要的简化区别 . )
我建议您真正需要的是使用表单来接收输入 . 使用表单将在您的电子表格中创建一个“数据表”,一组您不应该乱用的列 . (您可以编辑内容,添加和删除行,但不能添加或删除列 . )但是,您可以在此表之外的电子表格中添加列,这为您提供了一个方便的位置来存储有关个人状态的状态信息要求 .
此外,您可以触发您的处理在表单提交上运行,而不是简单的"onEdit" - 这可以摆脱ScampMichael指出的问题 . 或者,您可以使用可安装的编辑触发器,如in this answer所述 .
试试this sheet和this form . 保存自己的副本,进入脚本并删除阻止发送电子邮件的评论,然后尝试一下 . 电子表格中有一个菜单项可以启动处理;只需清除"Request State"列即可重新运行它 . 您可以打开表单(并找到其URL),并添加更多条目进行实验 .
它是我编写的类似系统的核心,包含一个用于处理请求的谨慎状态机 . 我的系统在多个电子表格中包含大量非常复杂的数据,因此它经常被抢占,然后需要再次运行 . (我使用定时触发器 . )这就是通过状态处理请求的原因 . 如果您发现太复杂,请仅拉出您需要的部件 .
您的问题不清楚...在脚本中没有任何地方我看到有什么内容可以读取实际修改过的单元格...您的目标范围在第2行是硬编码的,因此唯一可以处理的行是第2行(并且邮件只能是发一次)...
你也可以:
解释它应该如何工作
解释它现在是如何工作的,尤其是你的意思'previous email'
删除代码中的拼写错误(第[2]行不是第一列)
解释你如何触发这个函数:名称
onEdit(e)
建议一个onEdit触发器,但是简单的触发器不能发送邮件,所以我想你已经设置了一些其他的触发器 .在您的函数参数中解释为什么
(e)
而不使用它?EDIT : 感谢您提供的补充信息 . 你建议的脚本不足以实现你想要的 . 这里的想法是检查工作表中的某些内容是否已被 adding (或插入)一行数据或(如果我理解的话)修改了 editing 工作表中任何具有新值的行 .
这看起来并不像第一眼看上去那么简单;-)
我会采取什么方法来获取工作表的'snapshot'并基于
timer
或onEdit
- 将该快照与工作表的当前状态进行比较 .获得该结果的方法不止一种,您可以在电子表格中使用第二张表,没有人可以修改,这是您在每次修改/邮件发送后更新的主表的副本 . 因此,在更新脚本之前,应查找工作表之间的任何差异,并在找到差异时将报告发送到相应的电子邮件 .
另一种方法是在脚本属性中存储转换为字符串的工作表数据,原理是相同的,但对于访问电子表格的普通用户来说,它更“不可见” .
您也可以使用scriptDb或您的userproperties,但脚本属性可能更适合(更简单)此用例 .
告诉我们你的想法/偏好,我(或其他人)可能会给你一些代码 .