google.script.run НЕ запускается при каждом вызове.Иногда функция запускается, иногда она ничего не делает - PullRequest
0 голосов
/ 02 октября 2018

В скрипте приложений Google при использовании клиентского файла .HTML вы можете вызвать серверный скрипт с помощью google.script.run. (Имя функции).

Вы можете увидеть соответствующую документацию здесь: https://developers.google.com/apps-script/guides/html/reference/run

Теперь этот скрипт работал без проблем в течение первых 6 месяцев его жизни или около того.Я не прикасался к программе и не получил уведомления или обнаружил новый устаревший код.

Однако в течение последних нескольких месяцев мои пользователи сообщали, что, когда они заканчивают взаимодействовать с документом HTMLничего не происходит, когда они закрывают его, и им приходится повторять весь процесс 3, а иногда даже 4 раза, прежде чем они получат его пройти. Это означает, что когда пользователь закрывает окно HTML на стороне клиента, функция на стороне сервера должна бытьвызывается для обработки оставшихся задач, но в некоторых случаях нет.Эта проблема является совершенно случайной и, похоже, не вызвана чем-то конкретным.

Я сам предпринял некоторые шаги, чтобы попытаться решить проблему.Я завернул весь код в блоки try catch, включая файлы .HTML и .GS.Это означает, что если буквально ANYTHING пойдет не так в сценарии ANY , я буду немедленно уведомлен об этом.Тем не менее, несмотря на то, что это так, я еще не получил ни одного письма о сбое, хотя я смотрю, как оно провалилось собственными глазами.Я добавил команды журнала до и после этой функции, чтобы увидеть, если она перестает работать все вместе или продолжается.В любом случае, независимо от того, успешен ли вызов функции или нет, проходят команды журнала.

Для меня это может означать только то, что по какой-то причине функция google.script.run не работает должным образом и не работаетзапустить связанную функцию, но не возвращает сообщение об ошибке или не останавливает сценарий.

Я нахожусь в абсолютной растерянности, так как у меня нет сообщения об ошибке, никаких воспроизводимых шагов и истории возникновения этой проблемы раньшев то время как внезапно становится все хуже и хуже с течением времени.Я проверил систему отслеживания проблем Google, но безрезультатно.Если кто-то еще использует эту функцию и у него есть проблемы, я бы хотел, чтобы вы поделились здесь своим опытом.Если у вас есть решение, пожалуйста, дайте мне знать как можно скорее.Если я не смогу решить эту проблему, мне придется полностью использовать новую платформу.

Редактировать 10/2: После изучения этой проблемы я обнаружил список всех выполнений в этом проекте.Я могу видеть, какие функции были выполнены, когда и как долго они выполнялись.Я вижу, что при запуске функции, открывающей службу HTML, следующая функция, которую должен выполнить , не всегда появляется в списке.И когда это не так, я вижу, что пользователь повторял свои шаги, пока он не запустился.Это поддерживает мою теорию, что функция просто не работает, когда она должна быть вызвана после того, как я вызвал мой скрипт.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

В комментариях вы разместили фрагмент этой функции:

Вот базовая копия скрипта, который использует google.script.run:

function onFailure(error) {
  MailApp.sendEmail("sparkycbass@gmail.com", "Order book eror", "ERROR: " + error.message);
  google.script.host.close();
}
function handleFormSubmit(formObject) { 
  google.script.run.withFailureHandler(onFailure).processForm(formObject)
  google.script.host.close();
}

Проблема здесь в том, что google.script.run является асинхронным - вызов вашей функции на стороне сервера processForm не гарантируется даже до того, как будет выполнен вызов google.script.host.close():

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

Правильный шаблон - вызывать только «деструктивные» команды, такие как закрытие хоста и, следовательно, выгрузка всех соответствующих приложений.Экземпляры сценария - после того, как сервер указал асинхронную операцию, завершенную .Это в обработчике успеха вызова google.script.run:

.html

function onFailure(error) { // server function threw an unhandled exception
  google.script.run.sendMeAnEmail("Order book error", "ERROR: " + error.message);
  console.log(error);
  document.getElementById("some element id").textContent = "There was an error processing that form. Perhaps try again?"
}
function onSuccess(serverFunctionOutput, userObj) {
  // do stuff with `serverFunctionOutput` and `userObj`
  // ...
  google.script.host.close();
}
function handleFormSubmit(formObject) {
  google.script.run
    .withFailureHandler(onFailure)
    .withSuccessHandler(onSuccess)
    .processForm(formObject);
}

.gs

function processForm(formData) {
  console.log({message: "Processing form data", input: formData});
  // ...
}
function sendMeAnEmail(subject, message) {
  console.log({message: "There was a boo-boo", email: {message: message, subject: subject}});
  MailApp.sendEmail("some email", subject, message);
}
0 голосов
/ 05 октября 2018

Tl; dr: затронутые компьютеры работают так медленно, что google.script.host.close запустится до того, как google.script.run.functionName () сможет вызываться, и информация передается от клиентасервер, в результате чего функция никогда не запускается, но также не возвращает ошибку.Добавление Utilities.sleep(1000) устраняет проблему.

Я отвечаю здесь в ситуации, когда кто-то наткнется на эту ветку в будущем, потому что у него будут похожие проблемы.Я смог решить эту проблему, добавив две строки кода между google.script.run и google.script.host.close.Я добавил Google Utilities.sleep(1000), чтобы заставить компьютер подождать одну секунду между выполнением функции и закрытием окна HTML.Я также добавил предупреждение HTML, которое показывает, что функция была вызвана и не страдала от ошибки времени выполнения.

Я не знаю точно, почему это, похоже, решило проблему, но у меня есть теория.У меня есть около 20 компьютеров, на которых работает эта таблица.Только у 6 из них возникла проблема, и до недавнего времени это не привлекало мое внимание.Как выяснилось, 6 компьютеров, на которых возникла проблема, были самыми медленными из всех.Моя теория состоит в том, что компьютеры были такими медленными, а пропускная способность интернета колебалась настолько сильно, что у компьютера просто не было времени вызвать google.script.run и выдать информацию из окна HTML на стороне клиента, которое просто закрылосьи отключить при запуске google.script.host.close.Это означает, что функция не будет существовать в протоколах выполнения или истории, равно как и не будет никаких ошибок во время выполнения.Все эти вещи были правдой в моей ситуации.Это также объясняет, почему у меня никогда не возникало проблем ни с одним из моих собственных устройств в тестовой среде, поскольку оно не страдало от каких-либо замедлений, которые были у других компьютеров.это заставляет JavaScript не продолжать google.script.host.close до тех пор, пока пользователь не будет взаимодействовать с предупреждением пользовательского интерфейса (которое представляет собой просто окно подтверждения с кнопкой OK), а затем ждет целую секунду.Это жертвует чуть-чуть удобством для пользователя для более функционального сценария.Поскольку я реализовал это «исправление», ни один из моих пользователей не сообщил о каких-либо проблемах, и вся моя история выполнения выглядит просто отлично.

Надеюсь, это поможет любому будущему прохожему.

...