如何从 Google 表单提交触发器函数访问电子表格
How to access Spreadsheet from a Google Forms submit trigger function
我在 Google 表单脚本中有一个函数,可以将唯一 ID 添加到要添加到关联 Sheet 的行。此函数在提交表单时触发。
这是我一直在玩的脚本的一个版本:-
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
,但我遇到了同样的问题 - "cannot call method...",除了 getActiveSheet
之外几乎每一行都存在。
函数的触发器工作正常,因为我收到通知说函数本身未能成功执行。我上网查了一下,尝试了一些方法,但还没有找到解决方案。
所以我真正想要的是访问表单发布到的电子表格的正确方法。如果 SpreadsheetApp.getActiveSheet() 不是正确的方法,那什么才是?
这个脚本是全新的,最后在 PLI(!) 中编程,抱歉。任何指向现有解决方案或其他解决方案的指针,我们将不胜感激。
您需要检查getActiveSheet()
是否成功。
function onFormSubmit(e) {
// Get the active sheet
var sheet = SpreadsheetApp.getActiveSheet();
if (!sheet) { // No active sheet, nothing to do
return;
}
// 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)
}
}
提交表单时,触发函数没有活动的点差sheet,也不会有活动的单元格。 (它与表格 UI 无关,因此这些概念毫无意义。)
但是,事件参数 e
将提供有关已由表单添加的行的信息。见 Google Sheets events:
e.range
包含一个 Range 对象,该对象覆盖触发函数的表单提交所填充的单元格。您可以从那里回溯以获得 sheet.
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
可能会影响您,因为表单提交会在 sheet 中插入新行。最好从不同的 sheet 中提取该值 - 或者更好的是使用 Properties Service 来管理它。
要使用该事件,您需要模拟它进行测试。阅读 How can I test a trigger function in GAS?.
我在 Google 表单脚本中有一个函数,可以将唯一 ID 添加到要添加到关联 Sheet 的行。此函数在提交表单时触发。
这是我一直在玩的脚本的一个版本:-
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
,但我遇到了同样的问题 - "cannot call method...",除了 getActiveSheet
之外几乎每一行都存在。
函数的触发器工作正常,因为我收到通知说函数本身未能成功执行。我上网查了一下,尝试了一些方法,但还没有找到解决方案。
所以我真正想要的是访问表单发布到的电子表格的正确方法。如果 SpreadsheetApp.getActiveSheet() 不是正确的方法,那什么才是?
这个脚本是全新的,最后在 PLI(!) 中编程,抱歉。任何指向现有解决方案或其他解决方案的指针,我们将不胜感激。
您需要检查getActiveSheet()
是否成功。
function onFormSubmit(e) {
// Get the active sheet
var sheet = SpreadsheetApp.getActiveSheet();
if (!sheet) { // No active sheet, nothing to do
return;
}
// 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)
}
}
提交表单时,触发函数没有活动的点差sheet,也不会有活动的单元格。 (它与表格 UI 无关,因此这些概念毫无意义。)
但是,事件参数 e
将提供有关已由表单添加的行的信息。见 Google Sheets events:
e.range
包含一个 Range 对象,该对象覆盖触发函数的表单提交所填充的单元格。您可以从那里回溯以获得 sheet.
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
可能会影响您,因为表单提交会在 sheet 中插入新行。最好从不同的 sheet 中提取该值 - 或者更好的是使用 Properties Service 来管理它。
要使用该事件,您需要模拟它进行测试。阅读 How can I test a trigger function in GAS?.