Google Apps脚本中的表单提交事件的事件参数中的源对象

时间:2014-07-04 07:08:18

标签: google-apps-script

所以我有一个电子表格脚本,表单提交触发器设置为:

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对象 - 这是打算用的吗?

为了澄清,您无法通过单击脚本编辑器中的“当前项目的触发器”按钮来设置电子表格的此类触发器,只能使用我发布的第一个代码段创建。参见:

http://imgur.com/FoVTaPB.jpg

(在此图片中,onFormResponse函数的触发器是以编程方式创建的,而someOtherFunction触发器是使用“添加新触发器”按钮创建的。

3 个答案:

答案 0 :(得分:0)

根据触发事件的文件类型,电子表格(您正在调用的那种)和de Form文件,有两种表单提交。在文档中,电子表格没有解释源参数,但它看起来已经实现了。

来源表明触发事件的文件是您的文件,并且与表格的来源无关。

如果您需要在电子表格脚本中打开表单文件,则必须按[FormApp.openById][1][FormApp.openByUrl][2]对文件的开头进行编码,并对ID / URL进行硬编码。这将使脚本要求您进行表单授权。

答案 1 :(得分:0)

Google Code Issue 4810

中记录了未能提供事件的.source属性

幸运的是,在该问题的评论中提供了至少一种解决方法,即使用响应的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
}