GAS HTMLService: отправка переменных с помощью createTemplateFromFile в файл, включенный в шаблон - PullRequest
1 голос
/ 04 октября 2019

Я использую CreateTemplateFromFile и помещаю переменную в свой шаблон. Мой файл шаблона включает в себя другой файл, но я не могу вставить эту переменную во второй встроенный файл.

Ниже показано, что я пробовал:

index.html:

<!DOCTYPE html>
<html>
    <?!= include('header'); ?>
    <?!= include('style'); ?>
  <body>
     ...
  </body>

<?!= include('script'); ?>

</html>

часть сценария index.html в отдельном файле:

<script>
  function getData() {
    $("#loadingMessage").html('Loading');
    console.log('myContent:', <?= data ?>);
    ...
  }
</script>

Часть doGet кода сценария приложений Google:

var template = HtmlService.createTemplateFromFile('index');
template.data = myContent;

return template.evaluate()
  .setSandboxMode(HtmlService.SandboxMode.IFRAME);

переменнаяправильно помещается в index.html, но не достигает части скрипта. Любая идея ? Может быть, включить файл сценария в качестве шаблона также?

1 Ответ

1 голос
/ 04 октября 2019

Как передавать переменные между Apps Script и Javascript.

В Google Apps Script есть метод google.script.run , который можно вызывать из JS-части Web. App . Метод позволяет передавать параметры в функцию «Сценарий приложения» и назначать возвращаемое значение функции GAS обратно функции JS.

Пример:

Файл .gs

function doGet() {
var template = HtmlService.createTemplateFromFile('index');

return template.evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME);

}

function myContent(input) {
  var myContent="foo"+input;
  return myContent;
}

Файл HTML / js

<html>
  <head>
    <base target="_top">
  </head>
  <body onload="getData()">
    <script>
      function getData() {
        google.script.run.withSuccessHandler(proceedData).myContent("bar");
       ...
     }
      function proccedData(returnValue) {
        var data  = returnValue;
      }
    </script>
  </body>
</html>

Если вы хотите использовать скриптлеты

в документации указано :

  • Помните, однако, что, поскольку код шаблона выполняется до того, как страница предоставляется пользователю, эти методы могут только подавать исходное содержимое на страницу. Чтобы получить интерактивный доступ к данным скрипта приложений со страницы, используйте API google.script.run.

  • Поскольку код скриптлета выполняется до обслуживания страницы, он может выполняться только один раз для каждой страницы;В отличие от клиентских функций JavaScript или Apps Script, которые вы вызываете через google.script.run, скриптлеты не могут выполняться снова после загрузки страницы. ^

  • скриптлеты могут вызывать функции, определенные в других файлах кода,ссылаться на глобальные переменные или использовать любой из API скриптов приложений.

В вашем случае, если вы хотите использовать скриптлеты, вам нужно либо вызвать функцию, либо сделать вашу переменнуюdata global, например:


//global variable
var data=myContent;

function doGet() {
  var temp=HtmlService.createTemplateFromFile("index.html");
  return temp.evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME);
}

Также имейте в виду:

  • Шаблоны могут быть сложными для отладки, потому что код, который вы пишете, не выполняетсянепосредственно;вместо этого сервер преобразует ваш шаблон в код, а затем выполняет полученный код.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...