Хобрук: Ваш путь к мастерству в программировании

Получение последнего ответа формы иногда вместо этого получает тот, который был перед ним

Мне интересно, связано ли это с особенно загруженным временем для скрипта Google Apps, потому что кажется, что это связано с (случайной) задержкой обновления длины массива formResponse []. Я использую следующий код, чтобы получить последний ответ, вызванный отправкой формы:

var form = FormApp.getActiveForm();
var formResponses = form.getResponses();
var formResponse = formResponses[formResponses.length-1]; //latest response only
Logger.log('begin length: ' + formResponses.length);

Затем остальная часть моего скрипта взаимодействует с ответами в массиве formResponse[]. Иногда я замечаю, что он получил ответ раньше последнего ответа. Я могу это проверить, потому что таблица с ответами формы показывает фактический последний ответ. Мой скрипт выполняется за 5-15 секунд, поэтому у меня есть следующие строки в конце моего кода, чтобы еще раз проверить длину массива:

var form2 = FormApp.getActiveForm();
var formResponses2 = form2.getResponses();
Logger.log('end length: ' + formResponses2.length);

и в журнале я замечу, что второе на единицу больше первого (и второе значение является правильным). Я не нашел особой закономерности в том, когда это происходит, но, похоже, это происходит чаще между 7-9 часами утра по тихоокеанскому стандартному времени. На данный момент я добавил Utilities.sleep(5000) в качестве первой строки в функцию, чтобы дать время для обновления формы, прежде чем я получу ответы, и до сих пор у меня не было n-2 ответов, что заставляет меня думать, что есть некоторые своего рода задержка, из-за которой форма записывает последний ответ после срабатывания триггера «при отправке формы».

Кто-нибудь еще сталкивался с чем-то подобным?


  • Вам нужно только получить ответ, который вы отправляете, или вам нужны все ответы? 16.01.2014
  • Мне нужен только последний ответ 16.01.2014

Ответы:


1

Когда серверы заняты, эти состояния гонки становятся более явными, но это просто обычный бизнес. для облачных вычислений. Короче говоря, каждый пользователь документа имеет представление (копию) этого документа, и нельзя гарантировать, что он все время будет идентичен «основной версии». Когда вы смотрите на электронную таблицу, вы смотрите на свою собственную копию этой таблицы. Возможно, ваш соавтор просматривает свою собственную копию. Триггерная функция, обращающаяся к «электронной таблице», фактически также получит свою собственную копию. Изменения, внесенные где угодно, необходимо синхронизировать везде, а это требует времени.

В этом случае ваш код указывает на то, что у вас есть функция в сценарии, который содержится в форме Google. Этот скрипт при запуске получает копию формы, включая прошлые ответы. Однако отправка формы, вызвавшая запуск скрипта, может быть еще не синхронизирована с отправкой формы. Вы также работаете с электронной таблицей, содержащей ответы... когда формы отправляются в службу форм, они сохраняются в службе форм, а также в копии электронной таблицы. Это действие может инициировать событие отправки формы электронной таблицы, и (у вас еще не болит голова?) этой функции будет предоставлена ​​копия электронной таблицы, которая может еще не содержать новые данные отправки формы!

Так что делать?

Предположим, вы используете триггерную функцию для обработки ответов формы.

function handleForm( event ) {
   ...
}

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

function handleForm( event ) {
   var formResponse = event.response;  // The response that triggered this
                                       // function is in the event
   ...
}

Я предлагаю вам также взглянуть на "Как могу ли я протестировать функцию триггера в GAS?".

16.01.2014
  • Вы правы, у меня голова болела (еще до того, как вы спросили)! Спасибо, что указали мне в этих направлениях, я буду читать по темам, которые вы упомянули. Сначала я пытался взаимодействовать с событием, переданным триггеру, но оно продолжало возвращаться как undefined, поэтому я прибегнул к моему текущему методу. Я потрачу больше времени на то, чтобы заставить это работать, потому что это, безусловно, выглядит как более элегантный способ получить последний ответ. Я обновлю этот пост, когда он заработает. 16.01.2014
  • Спасибо, что указали мне правильное направление. Прочитав об этом, все, что мне нужно было сделать, это заменить var formResponse = formResponses[formResponses.length-1]; на var formResponse = event.response;, и это решило проблему! Я оставил отладочный код на несколько пробных прогонов, и он продемонстрировал, что даже несмотря на то, что мой старый метод по-прежнему не работает, обработчик событий работает просто великолепно! Спасибо! 16.01.2014
  • @Mogsdad Я думаю, что использование такой функции, как handleForm(event), действительно лучший способ, но это заставляет меня работать по-старому (со связанной электронной таблицей). Он не работает при вызове из onFormSubmit, запущенного непосредственно в Google Form GAS. Я не могу получить событие (оно возвращает мне {response:{}}). Знаете ли вы, есть ли другой способ эффективного получения значений непосредственно из Google Form GAS? Спасибо, Гарольд. 27.01.2014
  • есть проблема с объектом ответа в форме, если вы попытаетесь выполнить для него JSON.stringify(e), он вернет пустой объект. Тем не менее объект существует, и им можно манипулировать, см. проблему: code.google.com/p/google-apps-script-issues/issues/ 30.01.2014
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..