e.source返回电子表格,而不是窗体对象?(e.source returns Spreadshe

2019-10-30 03:00发布

我“对飞”在电子表格中使用的数据创建谷歌的形式。 此外,我在安装提交表单事件触发。

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);
...

我得到的不是promissed在Form对象手动 ,但电子表格对象

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

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

Answer 1:

显然,形式并不表现为它的文件说,确实如此,这已经被证明谷歌代码问题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
       }
    }
}

这最后的解决办法来自评论#5 期3786



文章来源: e.source returns Spreadsheet instead of Form object?