Сценарии Google Apps - вызов функции на стороне сервера - PullRequest
0 голосов
/ 26 августа 2018

Я запускаю функцию 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 ]

0 голосов
/ 26 августа 2018

В Apps Script функции doGet () и doPost () предназначены исключительно для отправки HTTP-запросов в веб-приложения на основе GAS. Скрипты, связанные с таблицами, можно публиковать в виде веб-приложений, однако, согласно документам

Чтобы создать веб-приложение со службой HTML, ваш код должен включать Функция doGet (), которая сообщает скрипту, как обслуживать страницу. функция должна возвращать объект HtmlOutput, как показано в этом примере.

В вашем случае метод showModalDialog () возвращает 'void'. Кроме того,

В отличие от веб-приложения, сценарий, который создает пользовательский интерфейс для документ, электронная таблица или форма не нуждаются в функции doGet () в частности, и вам не нужно сохранять версию вашего скрипта или развернуть его. Вместо этого функция, которая открывает пользовательский интерфейс, должна передать ваш HTML-файл как объект HtmlOutput в showModalDialog ()) или методы showSidebar () объекта Ui для активного документа, Форма или электронная таблица.

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

0 голосов
/ 26 августа 2018
  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 Docs, Sheets или Forms, которые содержат страниц HTML-сервиса .Для выполнения функций на стороне сервера из кода на стороне клиента используйте google.script.run.Для получения дополнительной информации см. Руководство по взаимодействию с функциями сервера в службе HTML .

Ссылки

...