javascript - 如何从 Google 表单提交触发器函数访问电子表格

标签 javascript google-apps-script google-sheets google-spreadsheet-api

我在 Google 表单脚本中有一个函数,可以将唯一 ID 添加到要添加到关联工作表的行。此函数在提交表单时触发。

这是我一直在玩的脚本的一个版本:-

function onFormSubmit(e) {
  // Get the active sheet
  var sheet = SpreadsheetApp.getActiveSheet();
  // Get the active row
  var row = sheet.getActiveCell().getRowIndex();
  // Get the next ID value.  
  var id = sheet.getRange("Z4").getValue();
  // Check of ID column is empty
  if (sheet.getRange(row, 1).getValue() == "") {
    // Set new ID value
    sheet.getRange(row, 1).setValue(id);
    sheet.getRange("Z4").setValue("Z4"+1)
  }
}

调试时我收到消息:-

TypeError: Cannot call method "getActiveCell" of null. (line 5, file "CreateID")

我已经尝试将代码裁剪成一个简单的setValue,但我遇到了同样的问题——“无法调用方法...”,除了之外几乎每一行>getActiveSheet.

函数的触发器工作正常,因为我收到通知说函数本身未能成功执行。我上网查了一下,尝试了一些方法,但目前还找不到解决方案。

所以我真正想要的是访问表单发布到的电子表格的正确方法。如果 SpreadsheetApp.getActiveSheet() 不是正确的方法,那什么才是?

这个脚本是全新的,最后在 PLI(!) 中编程,抱歉。任何指向现有解决方案或其他解决方案的指针,我们将不胜感激。

最佳答案

提交表单时,触发器函数没有事件电子表格,也没有事件单元格。 (它不与表格 UI 关联,因此这些概念毫无意义。)

但是,事件参数 e 将提供有关已由表单添加的行的信息。参见 Google Sheets events :

screenshot

e.range 包含一个 Range 对象,覆盖触发函数的表单提交所填充的单元格。您可以从那里回溯以获取工作表。

sheet = e.range.getSheet();

你的函数变成这样:

function onFormSubmit(e) {
  // Get the active sheet
  var sheet = e.range.getSheet();
  // Get the active row
  var row = e.range.getRowIndex();
  // Get the next ID value.  
  var id = sheet.getRange("Z4").getValue();
  // Check of ID column is empty
  if (sheet.getRange(row, 1).getValue() == "") {
    // Set new ID value
    sheet.getRange(row, 1).setValue(id);
    sheet.getRange("Z4").setValue("Z4"+1)
  }
}

现在,您还有其他问题要处理。

  • sheet.getRange(row, 1).getValue() 不是必需的;该值刚刚作为 e.values[0] 传递给您。

  • 但是,在提交表单时,第一列包含时间戳,因此它永远不会为空。如果您的“ID”值是表单上的第一个问题,那么它实际上位于第 2 列或 e.values[1]

  • 单元格 Z4 可能会影响您,因为表单提交会在工作表中插入新行。最好从不同的工作表中提取该值 - 或者更好的是使用 Properties Service 来管理它。

要使用该事件,您需要模拟它以进行测试。仔细阅读 How can I test a trigger function in GAS? .

关于javascript - 如何从 Google 表单提交触发器函数访问电子表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31058876/

相关文章:

google-apps-script - 用于创建 Confluence 页面的 Google Apps 脚本 - 导致状态代码 500

google-apps-script - 选择列的最后一个值

javascript - Google Sheet 脚本显然没有返回数字

javascript - 从函数结果中提取时间戳

javascript - css3 动画表现不佳(仅限 Chrome)

javascript - Sourcemap 到原始 SCSS 文件

javascript - 将 JQuery 选定元素存储为 JavaScript 对象属性?

google-apps-script - 如何计算Google表格文档中的公式数量?

google-sheets - 指向特定工作表的超链接

csv - 谷歌表查询第一行乱七八糟