google-apps-script:事件触发器上没有“源”字段

时间:2018-09-27 14:54:42

标签: google-apps-script triggers google-form

我设置了一个触发器来提交Google表单以运行我的Google脚本之一:

dragInteraction.on(['modifyend', 'modifystart']

我的ScriptApp.newTrigger('onFormSubmitted') .forForm(form).onFormSubmit().create(); 函数被触发,但是提供给该函数的事件参数没有onFormSubmitted属性。它具有the documentation says it should have的4个字段中的3个。

那我该如何获取触发此事件的表单的引用?

TMI

source

1 个答案:

答案 0 :(得分:1)

documentation for the event object中所述,如果脚本未绑定,则没有关联的source属性。您可以通过使用触发器uid将表单ID存储在properties中来解决此问题。然后在表单提交代码中,使用触发器uid获取正确的表单。

function getFormId_(triggerId) {
  const store = PropertiesService.getScriptProperties();
  var formId = store.getProperty(triggerId);
  if (!formId) console.warn("No form ID found for trigger ID '" + triggerId);
  return formId;
}
function createSubmitTrigger_(form, functionName) {
  const formId = form.getId();
  const trigger = ScriptApp.newTrigger(functionName).forForm(form)
      .onFormSubmit()
      .create();

  const store = PropertiesService.getScriptProperties();
  store.setProperty(trigger.getUniqueId(), formId);
}

function myFormSubmit(e) {
  const form = FormApp.openById(getFormId_(e.triggerUid));
  ...
}

这种方法(存储和检索)有可能可以向后应用,尽管这取决于触发器的先前配置方式-您无法通过编程(或其他方式)与其他触发器进行交互。

function storeAll() { // Run once (more is ok too, will just overwrite existing keys).
  function cb(acc, t, i, allVals) { // callback for Array#reduce
    acc[t.getUniqueId()] = t.getTriggerSourceId();
    return acc;
  }

  const newProps = ScriptApp.getProjectTriggers().reduce(cb, {});
  PropertiesService.getScriptProperties().setProperties(newProps);
}

参考