Wig*_*ore 3 javascript google-sheets google-apps-script google-sheets-api
我在 Google Forms 脚本中有一个函数,可以将唯一 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)
}
}
Run Code Online (Sandbox Code Playgroud)
在调试时我收到消息:-
类型错误:无法调用 null 的方法“getActiveCell”。(第 5 行,文件“CreateID”)
我尝试将代码裁剪为一个简单的setValue,但我遇到了同样的问题 - “无法调用方法...”,除了getActiveSheet.
该函数的触发器工作正常,因为我收到通知说该函数本身未能成功执行。我在网上查了一下,尝试了一些方法,但尚未找到解决方案。
所以我真正想要的是访问表单发布到的电子表格的正确方法。如果 SpreadsheetApp.getActiveSheet() 不是正确的方法,那么什么是?
这个脚本完全陌生,上次在 PLI 中编程(!),抱歉。任何指向现有解决方案或其他解决方案的指示都将不胜感激。
提交表单时,触发器函数没有活动电子表格,也没有活动单元格。(它与 Sheets UI 无关,因此这些概念毫无意义。)
但是,事件参数e将会提供有关表单已添加的行的信息。查看Google 表格事件:

e.range包含一个 Range 对象,该对象覆盖了触发函数的表单提交所填充的单元格。您可以从那里原路返回以获取该表。
sheet = e.range.getSheet();
Run Code Online (Sandbox Code Playgroud)
你的函数变成这样:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您还有其他问题需要处理。
sheet.getRange(row, 1).getValue()没有必要; 该值刚刚作为 传递给您e.values[0]。
但是,在提交表单时,第一列包含时间戳,因此它永远不会为空。如果您的“ID”值是表单上的第一个问题,那么它实际上位于第 2 列或 中e.values[1]。
当表单提交将新行插入到工作表中时,单元格Z4可能会移动。最好从不同的工作表中提取该值 - 或者更好地使用属性服务来管理它。
要利用该事件,您需要模拟它进行测试。阅读如何在 GAS 中测试触发函数?。