2

我对 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 失败的“电子邮件地址”。

对于任何反馈,我们都表示感谢!

4

3 回答 3

1

我相信谷歌表单已经很好地涵盖了你提到的情况,触发器“onFormSubmit”电子表格,接收一个对象作为参数,包含你需要的所有信息。

我同意 Serge 对脚本进行深度重写的观点,但绝对可以省去很多问题。

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

于 2013-07-19T20:15:50.353 回答
1

在表单提交的上下文中使用 getActiveRow 有点奇怪,因为不能认为用户实际上在工作表上处于活动状态......我不知道你为什么选择这种方法,我实际上想知道它是如何工作的这么久...

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

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

于 2013-07-19T16:55:46.587 回答
1

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

所以我们有:

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

您还需要为该onFormSubmit功能设置触发器。

编辑 > 当前项目的触发器

在此处输入图像描述

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

请注意,该onFormSubmit函数可以具有任何名称 - 触发器将映射到任何命名函数并传递给它一个“e”参数,其中包含 range.getRow() 以及其他信息。

于 2018-11-02T01:14:20.110 回答