Я пытаюсь создать сценарий для своей электронной таблицы 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, сбоя не произойдет.