我已经写脚本在谷歌电子表格发送电子邮件时,电子表格被修改或添加任何数据。 电子邮件触发器是工作,但每当在下一行中输入任何数据就请发送电子邮件到以前的电子邮件地址也。
请建议的解决方案
下面是写脚本:
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” - 这从ScampMichael指出问题后逃脱。 或者,你可以使用一个可安装编辑触发器,描述在这个答案 。
尝试这种片材 ,并且这种形式 。 保存自己的副本,进入脚本和删除被阻止被发送的电子邮件的意见,并尝试一下。 有一个在能揭开序幕处理电子表格中的菜单项; 只是清除“请求状态”一栏重新运行它。 您可以打开表单(并找到它的URL),并添加更多的条目进行试验。
这是我已经写了一个类似的系统的核心,并包含一个不显眼的状态机来处理请求。 我的系统有大量的在多个电子表格非常复杂的数据,因此它常常被捷足先登,则需要再次运行。 (我用的应该是一个定时触发。)这就是为什么请求通过状态进行处理。 如果您发现太复杂,仅抽出你所需要的零件。
你的问题是不清楚......无处在脚本中,我看到的东西,读哪个小区实际修改...你的目标范围,第2行硬编码,这样可以处理的唯一行为行2(和邮件只能是发送一次)...
所以你也可以:
- 解释它如何工作
- 解释它是如何工作的,现在,特别是你所说的“以前的邮件”是什么意思
- 除去错别字在代码(行[2]不是第一列)
- 解释你如何触发这个函数:名称
onEdit(e)
建议的onEdit触发,但简单的触发器无法发送邮件,所以我想你已经设置了一些其它触发。 - 解释
(e)
在你的函数的参数,而不是使用它吗?
编辑:谢谢你的信息的补充。 你建议的脚本是不足以实现你想要什么。 这里的想法是通过编辑表的任何行用新的值来检查,如果事情在片已被修改通过添加 (或插入)数据的行或(如果我深知)。
这是不是真的那么简单,因为它看起来第一眼;-)
我会做什么它采取板的“快照”和基础的一个timer
或onEdit
-该快照比较纸张的当前状态。
还有就是要得到这一结果不止一种方法,你可以在你的电子表格中的第二层,没有人能够改变的,那就是你每次修改/邮件发送后更新主表的副本。 所以之前更新脚本应该寻找片之间有什么区别,当发现差别时将报告发送到相应的邮箱。
另一种方法是存储转换为脚本属性的字符串的纸张数据,原理是一样的,但它更“无形”为正常用户访问电子表格。
你也可以使用一个ScriptDb或您userproperties但脚本特性可能是更适合(简单)这个用例。
告诉我们你的想法/喜欢和我(或者其他人)也许可以给你一些代码开始。