e.source返回Spreadsheet而不是Form对象?

时间:2015-07-19 20:54:42

标签: events triggers google-sheets google-form

我使用电子表格中的数据“动态”创建谷歌表单。我还在提交表单事件上安装了触发器。

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对象,但是电子表格对象

Logger.log([{response=FormResponse, source=Spreadsheet, triggerUid=4071774310898422364, authMode=FULL}

也许,我做错了什么?在这种情况下如何正确获取表单源?

1 个答案:

答案 0 :(得分:0)

显然,表单的行为并不像文档所说的那样,已在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
}

这种解决方法对我有用。另一个解决方案是使用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