【问题标题】:e.source returns Spreadsheet instead of Form object?e.source 返回电子表格而不是表单对象?
【发布时间】:2015-07-19 20:54:42
【问题描述】:

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

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}

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

【问题讨论】:

  • 由于您的脚本在电子表格中,因此它绑定到它,因此电子表格成为源。您必须将脚本放入表单中才能使其绑定到表单中。
  • 当然可以,但我不能以编程方式在 from 中分配脚本。我只能从电子表格模块为触发器分配功能。换句话说 - 有没有办法通过与表单中的函数链接的 onSubmit 触发器以编程方式创建表单,而不是在生成此表单的模块中。
  • 不确定“无法以编程方式在 from 中分配脚本”是什么意思 您是否通过脚本创建表单?您可以在表单中使用与 onSubmit 触发器相同的脚本。
  • 是的,我通过脚本创建表单。比我用 ScriptApp.newTrigger 安装触发器,但这个方法的参数是函数的名称。它必须是生成脚本中的一个函数。以其他方式,我收到错误“找不到所选功能”。

标签: events triggers google-sheets google-forms


【解决方案1】:

显然,该表单的行为不像其文档中所说的那样,这已在 Google Code Issue 4810 中记录

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多