e.source returns 电子表格而不是表单对象?
e.source returns Spreadsheet instead of Form object?
我使用电子表格中的数据创建 google 表单 'on the fly'。我还在提交表单事件上安装了触发器。
ScriptApp.newTrigger('onSubmit')
.forForm(form)
.onFormSubmit()
.create();
onSubmit 函数放置在电子表格脚本中,因为无法将函数指向表单端(我使用脚本代码复制了现有表单,但它没有用,因为我无法实现该函数 运行).
好吧,我在电子表格端处理提交事件。没问题。但是当我试图获取 'e' 对象的来源时:
function onSubmit(e) {
var response, items, i, item, hash, answer, id;
var sheet, arr, source;
sheet = SpreadsheetApp.openById(RESPONSE_SS_ID).getSheetByName(RESPONSE_SHEET);
response = e.response;
source = e.source;
Logger.log(e);
...
我得到的不是 manual 中承诺的 Form 对象,而是 Spreadsheet 对象
Logger.log([{response=FormResponse, source=Spreadsheet, triggerUid=4071774310898422364, authMode=FULL}
也许,我做错了什么?在这种情况下如何正确获取表单源?
很明显,表单的行为并不像它的文档所说的那样,Google Code Issue 4810
中对此进行了记录
幸运的是,在该问题的评论中至少提供了一种解决方法,即使用响应的 getEditResponseUrl 方法获取表单。这是我以修复事件对象以添加缺失源的函数形式实现的修复:
function fixBrokenEvent (event) {
if (! event.source ) {
var responseEditUrl = event.response.getEditResponseUrl(); //gets edit response url which includes the form url
var responseUrl = responseEditUrl.toString().replace(/viewform.*/,''); //returns only the form url
event.source = FormApp.openByUrl(responseUrl); //gets the submitted form id
}
return event
}
这个解决方法对我有用。另一种解决方案是使用触发器 UID 并在 ScriptApp.getProjectTriggers() 的触发器列表中搜索正确的触发器 UID。
类似...
function fixEventWithTriggers (event) {
ScriptApp.getProjectTriggers().forEach(function (trigger) {
if (trigger.getUniqueId()==event.triggerUid) {
event.source = FormApp.openFormById(trigger.getSourceId())
return event
}
}
}
最后一个解决方法来自 Issue 3786
上的评论 #5
我使用电子表格中的数据创建 google 表单 'on the fly'。我还在提交表单事件上安装了触发器。
ScriptApp.newTrigger('onSubmit')
.forForm(form)
.onFormSubmit()
.create();
onSubmit 函数放置在电子表格脚本中,因为无法将函数指向表单端(我使用脚本代码复制了现有表单,但它没有用,因为我无法实现该函数 运行).
好吧,我在电子表格端处理提交事件。没问题。但是当我试图获取 'e' 对象的来源时:
function onSubmit(e) {
var response, items, i, item, hash, answer, id;
var sheet, arr, source;
sheet = SpreadsheetApp.openById(RESPONSE_SS_ID).getSheetByName(RESPONSE_SHEET);
response = e.response;
source = e.source;
Logger.log(e);
...
我得到的不是 manual 中承诺的 Form 对象,而是 Spreadsheet 对象
Logger.log([{response=FormResponse, source=Spreadsheet, triggerUid=4071774310898422364, authMode=FULL}
也许,我做错了什么?在这种情况下如何正确获取表单源?
很明显,表单的行为并不像它的文档所说的那样,Google Code Issue 4810
中对此进行了记录幸运的是,在该问题的评论中至少提供了一种解决方法,即使用响应的 getEditResponseUrl 方法获取表单。这是我以修复事件对象以添加缺失源的函数形式实现的修复:
function fixBrokenEvent (event) {
if (! event.source ) {
var responseEditUrl = event.response.getEditResponseUrl(); //gets edit response url which includes the form url
var responseUrl = responseEditUrl.toString().replace(/viewform.*/,''); //returns only the form url
event.source = FormApp.openByUrl(responseUrl); //gets the submitted form id
}
return event
}
这个解决方法对我有用。另一种解决方案是使用触发器 UID 并在 ScriptApp.getProjectTriggers() 的触发器列表中搜索正确的触发器 UID。
类似...
function fixEventWithTriggers (event) {
ScriptApp.getProjectTriggers().forEach(function (trigger) {
if (trigger.getUniqueId()==event.triggerUid) {
event.source = FormApp.openFormById(trigger.getSourceId())
return event
}
}
}
最后一个解决方法来自 Issue 3786
上的评论 #5