Сценарии Google Apps - вызов функции на стороне сервера
Я запускаю функцию doGet(). Это создает модальное диалоговое окно в электронной таблице. Он покажет кнопки "Закрыть" и "Создать копию", где последняя будет запускать серверную функцию doSomething(), которая создает копию шаблона. Независимо от того, прикрепляю ли я функцию к кнопке или запускаю ее прямо в теге скрипта, она отказывается запускаться. Есть ли способ исправить или хотя бы отладить это?
Code.gs
function doGet() {
return SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile('Index'), 'Report');
}
function doSomething() {
var file = template.makeCopy();
file.setName('NEW FILE NAME')
google.script.host.close()
}
Index.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
google.script.run.doSomething()
</script>
</head>
<body>
<input type="button" value="Close" onclick="google.script.host.close()"/>
<input type="button" value="Make Copy" onclick="google.script.run.doSomething();" />
</body>
</html>
2 ответа
- doGet() - зарезервированное слово для веб-приложений.
- SpreadsheetApp.getUi можно использовать только в ограниченных проектах
- google.script.host.close() - это метод на стороне клиента, который работает только для диалогов и боковых панелей, а не для веб-приложений.
Предложения:
Поскольку ваш проект ограничен,
- изменить имя функции doGet().
- Удалить
google.script.host.close()
от doSomething() Удалить
<script> google.script.run.doSomething() </script>
- После внесения вышеуказанных изменений добавьте меню для вызова переименованной функции. Если все еще не работает, ищите ошибки в консоли браузера для ошибок на стороне клиента и в журналах Stackdriver для ошибок на стороне сервера.
Цитаты
doGet(e)
запускается, когда пользователь посещает веб-приложение или программа отправляет HTTP-запрос GET в веб-приложение.
google.script.host
представляет собой асинхронный клиентский API JavaScript, который может взаимодействовать с диалоговыми окнами или боковыми панелями в Документах, листах или формах Google, которые содержат страницы службы HTML. Для выполнения серверных функций из клиентского кода используйтеgoogle.script.run
, Для получения дополнительной информации см. Руководство по взаимодействию с функциями сервера в службе HTML.
Рекомендации
В Apps Script функции doGet() и doPost() предназначены исключительно для отправки HTTP-запросов в веб-приложения на основе GAS. Скрипты, связанные с таблицами, можно публиковать в виде веб-приложений, однако, согласно документам
Чтобы создать веб-приложение со службой HTML, ваш код должен включать функцию doGet(), которая сообщает сценарию, как обслуживать страницу. Функция должна возвращать объект HtmlOutput, как показано в этом примере.
В вашем случае метод showModalDialog() возвращает 'void'. Также,
В отличие от веб-приложения, сценарий, который создает пользовательский интерфейс для документа, электронной таблицы или формы, не требует специально функции doGet(), и вам не нужно сохранять версию своего сценария или развертывать его. Вместо этого функция, открывающая пользовательский интерфейс, должна передать ваш HTML-файл в виде объекта HtmlOutput в методы showModalDialog()) или showSidebar() объекта Ui для активного документа, формы или электронной таблицы.
Короче говоря, вам не нужно развертывать свой скрипт как веб-приложение. Вместо этого вы должны поместить код сборки пользовательского интерфейса непосредственно в основную функцию и, наконец, связать эту функцию с кнопкой.