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