我对 Google Apps 脚本比较陌生,一直在使用大约一年前创建的一个非常简单的脚本,当用户通过 Google 表单提交输入时会触发该脚本。该脚本一直运行良好,直到大约今年五月,我一直在努力弄清楚当我没有对代码进行任何更改时发生了什么。我搜索了很多不同的地方,似乎找不到问题所在。
基本上,我有一个用户填写然后提交的表单。提交后,脚本从最新行获取输入并将它们存储在变量中,然后将这些变量组装成电子邮件消息确认,以确认每个用户提交的输入。
这是我的代码:
function acknowledgement() {
var ActiveSheet = SpreadsheetApp.getActiveSheet();
var ActiveRow = ActiveSheet.getActiveRange().getRow();
var emailAddy = ActiveSheet.getRange("E"+ActiveRow).getValue();
var locvar = ActiveSheet.getRange("C"+ActiveRow).getValue();
var employeevar = ActiveSheet.getRange("B"+ActiveRow).getValue();
var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Variables");
var contactvar = sh.getRange("A2").getValue();
var subject = sh.getRange("B2").getValue();
var contactvar2 = sh.getRange("C2").getValue();
var linebrk = "<br />";
var msg = "Dear " + employeevar + ","
+ linebrk + linebrk
+ "This confirms that you have completed your review of the latest security presentation."
+ linebrk + linebrk
+ "Your location number is " + locvar + "."
+ "Thank you very much for your participation."
+ linebrk + linebrk
+ contactvar;
var msghtml = '<p>'+msg+'</p>';
var advancedargs = {cc:contactvar2, htmlBody:msghtml};
MailApp.sendEmail(emailAddy, subject, msg, advancedargs);
}
当前发生的情况是我的代码不再获取当前行号(即用户刚刚提交的事件行)。相反,它只是抓取工作表的顶行(即我的行标题,如“员工姓名”、“电子邮件地址”等)并将这些行标题分配给变量,从而在尝试发送电子邮件确认时产生错误。例如,我的变量 emailAddy 将包含“电子邮件地址”,导致 sendEmail 失败。
如有任何反馈,我们将不胜感激!
最佳答案
在表单提交的上下文中使用 getActiveRow 有点奇怪,因为人们无法认为用户实际上在表单上处于事件状态...我不知道你为什么选择这种方法,我实际上想知道它是如何实现的碰巧工作了这么久...
还有其他方法可以处理表单提交,但需要对代码进行最少更改的方法是简单地使用 getLastRow()
而不是 getActiveRange().getRow()
使用这种简单的“策略”存在一些风险,因为当 2 人或更多人同时发送表单时可能会出现并发问题。 另一种解决方案是直接从表单提交时出现的事件属性获取所有字段值,因为在这种情况下,每个事件都是唯一的,无论它如何进入电子表格,但您的脚本将必须更深入地重写。
关于google-apps-script - 提交表单后获取事件电子表格行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17750625/