表单提交后获取活动的电子表格行

时间:2013-07-19 16:04:01

标签: google-apps-script google-sheets form-submit

我对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失败。

任何反馈都将不胜感激!

3 个答案:

答案 0 :(得分:1)

在表单提交的上下文中使用getActiveRow有点奇怪,因为人们不能认为用户实际上在工作表上活动...我不知道你为什么选择这种方法而我实际上想知道它是怎么回事碰巧工作了这么久......

处理表单提交还有其他可能性,但需要对代码进行最少更改的方法就是使用getLastRow()代替getActiveRange().getRow()

使用这种简单的“策略”存在一些风险,因为当两个或更多人同时发送表单时可能会出现并发问题。 另一个解决方案是直接从表单提交中的事件属性获取所有字段值,因为在这种情况下,每个事件都是唯一的,无论它如何进入电子表格,但您的脚本必须更深入地重写。

答案 1 :(得分:1)

我相信Google表单已经涵盖了您提到的案例,触发器“onFormSubmit”电子表格,会将对象作为参数接收您需要的所有信息。

我同意Serge的观点,认为脚本会被重写,但绝对可以省去很多问题。

转到文档,特别是“电子表格表单提交事件”https://developers.google.com/apps-script/understanding_events

答案 2 :(得分:0)

您正在寻找代码e.range.getRow()

所以我们有:

function onFormSubmit(e) {
   const row = e.range.getRow()
}

您还需要为onFormSubmit函数设置触发器。

  

编辑>当前项目的触发器

enter image description here

现在(终于)有些有趣:每次提交表单时,您都会知道它对应的行。玩得开心!

  

请注意,onFormSubmit函数可以具有任何名称-触发器将映射到任何命名函数,并向其传递包含范围等信息的“ e”参数。