WedX - журнал о программировании и компьютерных науках

Загрузка файла с помощью формы HtmlService в Google Apps всегда вызывает ошибку сервера и трассировку стека.

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

Error: We're sorry, a server error occurred. Please wait a bit and try again. 

Сообщение об ошибке поставляется с трассировкой стека:

Zd https://n-z7hx4jjtvixobmaqkddve7tkcdyndjsnh3plmfq-0lu-script.googleusercontent.com/static/macros/client/js/2745927008-mae_html_user_bin_i18n_mae_html_user__en_gb.js:56
    bf https://n-z7hx4jjtvixobmaqkddve7tkcdyndjsnh3plmfq-0lu-script.googleusercontent.com/static/macros/client/js/2745927008-mae_html_user_bin_i18n_mae_html_user__en_gb.js:71
    G https://n-z7hx4jjtvixobmaqkddve7tkcdyndjsnh3plmfq-0lu-script.googleusercontent.com/static/macros/client/js/2745927008-mae_html_user_bin_i18n_mae_html_user__en_gb.js:15
    J https://n-z7hx4jjtvixobmaqkddve7tkcdyndjsnh3plmfq-0lu-script.googleusercontent.com/static/macros/client/js/2745927008-mae_html_user_bin_i18n_mae_html_user__en_gb.js:99
    Id https://n-z7hx4jjtvixobmaqkddve7tkcdyndjsnh3plmfq-0lu-script.googleusercontent.com/static/macros/client/js/2745927008-mae_html_user_bin_i18n_mae_html_user__en_gb.js:47
    Ed https://n-z7hx4jjtvixobmaqkddve7tkcdyndjsnh3plmfq-0lu-script.googleusercontent.com/static/macros/client/js/2745927008-mae_html_user_bin_i18n_mae_html_user__en_gb.js:48
    b https://n-z7hx4jjtvixobmaqkddve7tkcdyndjsnh3plmfq-0lu-script.googleusercontent.com/static/macros/client/js/2745927008-mae_html_user_bin_i18n_mae_html_user__en_gb.js:44

Конечно, трассировка стека здесь не поможет, так как указывает на огромный минимизированный файл JavaScript на серверах Google.

Я попытался воспроизвести примеры из текущей документации Google Apps, а также несколько старых и недавних примеров, которые я смог найти на StackOverflow, и проблема всегда одна и та же: когда приходит время отправлять данные формы, происходит сбой сценария.

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

Я могу сказать, что проблема не в файле. Я попытался сначала загрузить большой (125 КБ) текстовый файл, а затем один размером в несколько байтов и даже вообще не отправлять какой-либо файл, и я получаю ту же ошибку. Я сталкиваюсь с этой проблемой как в Chrome, так и в Firefox в двух разных учетных записях Google.

Вот мой скрипт Google. Метод updateTracker вызывается при нажатии на объект рисования, который я разместил в таблице.

function updateTracker()
{  
  var thisUI = SpreadsheetApp.getUi();
  var htmlUpdatePage = HtmlService.createHtmlOutputFromFile('myPage');
  var updatePrompt = thisUI.showModalDialog(htmlUpdatePage, 'Update');
}

function digestXml(theForm) {
  //var fileBlob = theForm.xmlFile;
  var thisUI = SpreadsheetApp.getUi();
  thisUI.alert("Test");
}

Вот мой HTML-файл "myPage":

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      // Prevent forms from submitting.
      function preventFormSubmit() {
        var forms = document.querySelectorAll('form');
        for (var i = 0; i < forms.length; i++) {
          forms[i].addEventListener('submit', function(event) {
            event.preventDefault();
          });
        }
      }
      window.addEventListener('load', preventFormSubmit);     

      function submitXml(objForm)
      {
        google.script.run.withSuccessHandler(updateUrl).digestXml(objForm);
      }
      function updateUrl(url) {
        var div = document.getElementById('output');
        div.innerHTML = 'Got it!';
      }
    </script>

  </head>
  <body>
    <form id="xmlForm" onsubmit="submitXml(this)">    
      <input type="file" value="Browse" name="xmlFile" />
      <input type="submit" value="Digest" />
    </form>
    <div id="output"></div>
  </body>
</html>

Я могу сказать, что проблема возникает именно при попытке передать objForm из HTML в скрипт Google. Я могу писать в консоль прямо перед строкой google.script.run.withSuccessHandler(updateUrl).digestXml(objForm); в HTML, но не дохожу до thisUI.alert("Test"); в скрипте Google. Если я уберу параметр objForm из digestXml() в HTML, сбоя не произойдет.


  • Как давно существует проблема? Вы должны открыть вопрос в issuetracker. Подробнее см. на странице информации о теге сценария приложения. 21.02.2020
  • Вот пример загрузки файла: stackoverflow.com/a/57581534/7215091 21.02.2020
  • Я попробовал ваш код и не получил той же ошибки - я предполагаю, что это должно быть связано с вашим файлом. Вы пробовали с другим файлом? 21.02.2020
  • @Cooper Это дает мне тот же результат. Однако я заметил, что в примере спрашивающего он использует этот метод: function doGet() { return HtmlService.createHtmlOutputFromFile('Index'); }. Это не работает для меня. Это вызывает ошибку сервера, как только я запускаю doGet(), за исключением того, что у этого нет трассировки стека. Возможно, я что-то упустил в шагах, ведущих к отображению формы? 21.02.2020
  • @ziganotschka Я пробовал много разных файлов. Просто чтобы убедиться: в каком контексте и что вы вызвали функцию updateTracker? Возможно, шаги, ведущие к этому, являются проблемой. 21.02.2020
  • Я просто запускаю его из редактора скриптов. И я выбрал файл и нажал «Отправить». Вы запускаете функцию из редактора скриптов или она назначена на кнопку/вызывается из другой функции? 21.02.2020
  • @ziganotschka Если я попытаюсь запустить updateTracker из редактора скриптов, ничего не произойдет. Из-за этого я просто предположил, что невозможно протестировать функции пользовательского интерфейса из редактора сценариев. Поэтому я всегда тестирую свою функцию, связывая ее с объектом рисования, который я добавил в свой лист Google, и нажимая на него. В моем процессе чего-то не хватает? 21.02.2020
  • @TheMaster Я пробовал это на новом листе Google в другой моей учетной записи Google. Нет игральных костей. 21.02.2020
  • На вашем диске достаточно места? 21.02.2020
  • @TheMaster Ага. Я пробовал это с файлами размером всего несколько байтов. 21.02.2020
  • Измените thisUI.alert("Test"); на console.log("Client called on"+ new Date());return "woohoo"; и проверьте просмотр › журнала stackdriver и отчетов об ошибках. Также используйте /dev URL для проверки 21.02.2020
  • @TheMaster Похоже, проблема возникает в последней версии интерфейса сценариев приложений Google, V8, но если я переключаюсь на STABLE, этого не происходит. Я добавил эту информацию в качестве ответа. 21.02.2020
  • @ziganotschka Похоже, проблема возникает в последней версии интерфейса сценариев приложений Google, V8, но если я переключаюсь на STABLE, этого не происходит. Однако все мои новые сценарии по умолчанию настроены на использование V8. Разве это не происходит с вами? 21.02.2020

Ответы:


1

Похоже, что проблема возникает только в недавно выпущенной версии интерфейса сценариев Google App, "V8".

Когда я создаю сценарий, мне предлагается использовать эту версию их интерфейса сценариев. Доверив Google для проверки их функциональности, я согласился, не задумываясь.

Если я редактирую файл конфигурации моего скрипта, чтобы использовать STABLE вместо V8, я не сталкиваюсь с проблемой. Если у вас возникла эта проблема, вот как это сделать:

  1. Откройте редактор сценариев.
  2. В верхнем меню выберите Вид > Показать файл манифеста.
  3. В списке файлов откройте appsscript.json.
  4. Замените "runtimeVersion": "V8" на "runtimeVersion": "STABLE"
  5. Сохранять.

Однако это вызывает тревогу, поскольку я предполагаю, что текущая стабильная версия в конечном итоге будет объявлена ​​устаревшей в пользу V8. Я зарегистрировал проблему для этого: https://issuetracker.google.com/issues/149980602

21.02.2020
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]