Сценарии 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 ответа

  1. doGet() - зарезервированное слово для веб-приложений.
  2. SpreadsheetApp.getUi можно использовать только в ограниченных проектах
  3. 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 для активного документа, формы или электронной таблицы.

Короче говоря, вам не нужно развертывать свой скрипт как веб-приложение. Вместо этого вы должны поместить код сборки пользовательского интерфейса непосредственно в основную функцию и, наконец, связать эту функцию с кнопкой.

Другие вопросы по тегам