Событие отправки формы Google: TypeError: невозможно вызвать метод getRow of undefined

введите здесь описание изображения

function onOpen(e) {
  FormApp.getUi()
  .createAddonMenu()
  .addItem('About', 'showAbout')
  .addToUi();
}

function onInstall(e) {
  onOpen(e);
}

function testFormSubmit (event) {
  try {

    //{"response":{},"source":{},"authMode":{},"triggerUid":2146837001}
    Logger.log( JSON.stringify(event) ); 

    var responce = event.response;
    Logger.log("responce.getId(): -------------");
    Logger.log( responce.getId() );

    Logger.log("responce.getEditResponseUrl(): ----------------");
    Logger.log( responce.getEditResponseUrl() );

    var ss = event.source; //Spreadsheet

    //Logger.log( event.range.getA1Notation() );
    Logger.log("event.range.getRow(): ----------------");
    Logger.log( event.range.getRow() );
  } catch (err) {
    Logger.log(err.toString());
  }
}

У меня ошибка:

TypeError: Невозможно вызвать метод "getRow" неопределенного

Я прочитал документацию (триггеры/события) и Устанавливаемые триггеры и Простые триггеры, но я до сих пор не понимаю, что мне нужно сделать, чтобы получить событие. range.getRow() (все остальное работает нормально)

Спасибо.


person Alex Pilugin    schedule 02.11.2017    source источник


Ответы (1)


Существует два типа триггеров, управляемых отправкой формы: триггер таблиц (который вы создаете с помощью редактора скриптов Таблиц) и Формы триггер (созданный с помощью редактора скриптов Forms). Их объекты событий различны. Триггер «Листы» имеет свойство range, а триггер «Формы» — нет. Вы используете триггер форм.

Если вам нужно знать, в какой строке регистрируются записи, используйте триггер Sheets (Примечание: у него не будет свойства response). Документация, на которую вы ссылаетесь, содержит всю эту информацию.

person Community    schedule 02.11.2017
comment
Ах так... Спасибо за объяснение. Не могли бы вы сказать - можно ли одновременно использовать оба типа триггеров? Мне нужно: var timestamp = formResponse.getTimestamp(); var responseUniqueId = event.response.getId(); и rowNumber, а также - person Alex Pilugin; 02.11.2017
comment
Вы можете использовать оба триггера, но они будут срабатывать независимо. Вам понадобятся две функции: одна обрабатывает триггер «Листы», а другая — триггер «Формы». Не существует процесса, который даст вам и то, и другое одновременно или сопоставит один объект события с другим. Триггер листов ничего не знает о форме; он видит значения и знает, где они находятся в электронной таблице. Триггер формы ничего не знает о электронной таблице. - person ; 02.11.2017
comment
Триггер формы должен знать что-то о электронной таблице: строка или триггер листа должен знать идентификатор ответа ... в другом случае я не понимаю, как было реализовано редактирование после отправки? - person Alex Pilugin; 02.11.2017