Загрузка файла с помощью формы HtmlService в Службах Google всегда вызывает «ошибку сервера» и трассировку стека - PullRequest
3 голосов
/ 21 февраля 2020

Я пытаюсь создать скрипт для моей электронной таблицы 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, а также несколько старых и последних примеров, которые я мог найти в 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 Script. Я могу записать на консоль прямо перед строкой google.script.run.withSuccessHandler(updateUrl).digestXml(objForm); в HTML, но я не до thisUI.alert("Test"); в Google Script. Если я удаляю параметр objForm из digestXml() в HTML, cra sh не происходит.

1 Ответ

3 голосов
/ 21 февраля 2020

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

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

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

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

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

...