google-apps-script: нет поля «источник» при срабатывании события - PullRequest
0 голосов
/ 27 сентября 2018

Я настроил триггер для отправки формы Google для запуска одного из моих сценариев Google:

ScriptApp.newTrigger('onFormSubmitted')
    .forForm(form).onFormSubmit().create();

Моя onFormSubmitted функция срабатывает, но аргумент события, предоставленный функции, имеетатрибут source отсутствует.Он имеет 3 из 4 полей, которые в документации говорят, что он должен иметь .

Так как мне получить ссылку на форму, которая вызвала это событие?

TMI

function onFormSubmitted(data, arg) {
  log(8, data['triggerUid'], -1) // => 1874727473075378640
  log(9, data['authMode'], -1) // => FULL
  log(10, data['response'], -1) // => FormResponse
  log(11, data['source'], -1) // => undefined
}

1 Ответ

0 голосов
/ 28 сентября 2018

Как упомянуто в документации для объекта события , если сценарий не привязан, то связанное свойство source отсутствует.Вы можете преодолеть это, сохранив идентификатор формы в 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);
}

Ссылки

...