У меня есть электронная таблица с ограниченным скриптом, которая объединяет библиотеку. Эта библиотека предоставляет 2 функции:
- Показ мод html с кнопкой
- Предоставляет функцию обратного вызова при нажатии кнопки на html
Содержимое БИБЛИОТЕКИ:
test.html
<!DOCTYPE html>
<html>
<head>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
</head>
<body>
<a class="waves-effect waves-light btn" onclick="runButtonFunction()">My Button</a>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
function onSuccess() {
console.log("onSuccess");
}
function onFailure(error) {
console.error("onFailure");
console.error(error);
}
function runButtonFunction() {
console.log("runButtonFunction");
google.script.run
.withFailureHandler(onFailure)
.withSuccessHandler(onSuccess)
//.callbackTestInBounded();
.callbackTestInLibrary();
}
</script>
</body>
</html>
success.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<p>SUCCESS!</p>
</body>
</html>
script.gs
function showModal() {
console.info("execute showModal");
var html = HtmlService.createHtmlOutputFromFile('test.html');
SpreadsheetApp.getUi().showModalDialog(html, 'Test')
}
function callbackTestInLibrary() {
console.info("callbackTest");
htmlCallback();
}
function htmlCallback() {
console.info("execute htmlCallback");
var html = HtmlService.createHtmlOutputFromFile('success.html');
SpreadsheetApp.getUi().showModalDialog(html, 'Test')
}
И ОГРАНИЧЕНО content
function onOpen() {
SpreadsheetApp.getUi().createMenu("TEST").addItem("show modal", "openModal").addToUi();
}
function openModal() {
console.info("execute openModal");
TestLibrary.showModal();
}
function callbackTestInBounded() {
console.info("execute callbackTest");
TestLibrary.htmlCallback();
}
function callbackTestInLibrary() {
// Empty, only for make it works
}
Пока открытый модал работает нормально, окно html отображается без проблем, у меня возникают некоторые проблемы с обратным вызовом при нажатии кнопки.
Моя гипотеза о том, почему сейчас не работает, связана с изменением среды выполнения V8, так как в прошлом я всегда создавал html модальные функции, которые запускают функции, которые объявлены внутри ограниченного скрипта , теперь это не так кажется, то же самое.
TEST # 1
Если я объявлю фактическую функцию обратного вызова callbackTestInBounded
внутри ограниченного скрипта, а в HTML я использую google.script.run.callbackTestInBounded();
, я получаю такое поведение: «Uncaught error» в консоли Chrome,
и если я вижу X Ответ HR Я получаю это:
)]}'
[["op.exec",null,[1,[]
,"Script function not found: callbackTestInBounded","ScriptError"]
]
,["di",377,null,null,null,null,[]
,[]
,null,null,[]
,[]
,[]
]
]
Итак, я подумал ... может быть, новая среда выполнения вызывает функцию как реализацию из библиотеки, показанной сам модал, поэтому я переключился на второй сценарий.
TEST # 2
Я переключил html на вызов google.script.run.callbackTestInLibrary();
, и, нажав кнопку, я получаю это:
userCodeAppPanel:15 Uncaught TypeError: google.script.run.withFailureHandler(...).withSuccessHandler(...).callbackTestInLibrary is not a function
at runButtonFunction (userCodeAppPanel:15)
at HTMLAnchorElement.onclick (userCodeAppPanel:1)
Видимо .. функции действительно извлекаются из ограниченного скрипта, а не из библиотеки, так почему первый тест не сработал? Фактическая смешанная конфигурация, которую я обнаружил, работает:
HTML
google.script.run.callbackTestInLibrary();
BOUNDED
function callbackTestInLibrary() {
// Empty, only for make it works
}
БИБЛИОТЕКА (то же имя, что и ограниченное)
// The actual implementation of the function
function callbackTestInLibrary() {
console.info("callbackTest");
htmlCallback();
}
При всем этом отображается второй HTML:
Требуется ли это новый тип конфигурации для среды выполнения V8, когда Есть сценарий, где html и скрипт-обратный вызов наследуются от библиотеки? Этого следовало ожидать?