所以我有一个电子表格脚本,表单提交触发器设置为:
ScriptApp.newTrigger('onConfirmationFormSubmit').forForm(confirmationForm).onFormSubmit().create();
使用处理函数:
function onConfirmationFormSubmit(event)
{
Logger.log('Source object ID:');
Logger.log(event.source.getId());
Logger.log('Spreadsheet ID');
Logger.log(SpreadsheetApp.getActiveSpreadsheet().getId());
}
现在,根据this页面,对于Form Submit事件,event参数中的源对象应该是已提交的Form - 但是当提交表单时,上面的代码给出了以下日志输出:
[14-07-04 17:03:59:417 EST] Source object ID:
[14-07-04 17:03:59:417 EST] 1I7ap9XJuFJtTgcM4xIFpE-IGqXQE8ohDJEpN7oN9IUk
[14-07-04 17:03:59:417 EST] Spreadsheet ID
[14-07-04 17:03:59:418 EST] 1I7ap9XJuFJtTgcM4xIFpE-IGqXQE8ohDJEpN7oN9IUk
上面链接的文档页面声明source属性应该始终是Form对象,但它似乎是一个Spreadsheet对象 - 这是打算用的吗?
为了澄清,您无法通过单击脚本编辑器中的“当前项目的触发器”按钮来设置电子表格的此类触发器,只能使用我发布的第一个代码段创建。参见:
(在此图片中,onFormResponse
函数的触发器是以编程方式创建的,而someOtherFunction
触发器是使用“添加新触发器”按钮创建的。
答案 0 :(得分:0)
根据触发事件的文件类型,电子表格(您正在调用的那种)和de Form文件,有两种表单提交。在文档中,电子表格没有解释源参数,但它看起来已经实现了。
来源表明触发事件的文件是您的文件,并且与表格的来源无关。
如果您需要在电子表格脚本中打开表单文件,则必须按[FormApp.openById][1]
或[FormApp.openByUrl][2]
对文件的开头进行编码,并对ID / URL进行硬编码。这将使脚本要求您进行表单授权。
答案 1 :(得分:0)
幸运的是,在该问题的评论中提供了至少一种解决方法,即使用响应的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
}
这种解决方法对我有用。另一个解决方案是使用Trigger 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答案 2 :(得分:0)
我修复了代码
function fixEventWithTriggers (event){
ScriptApp.getProjectTriggers().forEach(function (trigger) {
if (trigger.getUniqueId()==event.triggerUid) {
Logger.log("trigger source id: " + trigger.getTriggerSourceId())
event.source = FormApp.openById(trigger.getTriggerSourceId())
Logger.log("e.source: "+event.soure)
return event
}
})
return event
}