Отображать радиокнопки в HTML из возвращенных значений функции скрипта Google Apps - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь отобразить некоторые переключатели в HTML, которые используют все, что возвращается функцией в GAS.

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

Для начала я пытался простополучить информацию для отображения, но мне не удалось это сделать.

Любая помощь приветствуется!

function getSheetNames() {
  var sheetNames = [];
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  
  for (var i = 0; i < sheets.length; i++) {
    sheetNames.push(sheets[i].getName())
  }
  
  return JSON.stringify(sheetNames); 
}
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    Please fill in the form below.<br><br>
    <form id="settingsForm" onsubmit="event.preventDefault(); google.script.run.processForm(this)">
      <div id="output"></div>
      Sheet Name:
      <input type="text" name="sheetName"><br><br>
      Email CC:
      <input type="text" name="emailCC"><br><br>
      Send Email or Draft?:<br>
      <input type="radio" name="sendEmail" value="true" checked> Send Emails<br>
      <input type="radio" name="sendEmail" value="false"> Save to Drafts<br>
      <br>
      <input type="submit" value="Submit">
    </form><br>
    <input type="button" value="Cancel" onclick="google.script.host.close()" />
  </body>
</html>

<script>
  var sheetNames = google.script.run.getSheetNames();
  document.getElementById('output').innerHTML = JSON.parse(sheetNames);
</script>

1 Ответ

0 голосов
/ 01 февраля 2019

Проблема в google.script.run в отличие от обычной функции JavaScript, которая не возвращает значение.Он вызывает функцию на стороне сервера асинхронно.Т.е. он вызывает функцию на стороне сервера, но не ожидает возврата или ответа.Вызывает функцию и продолжает выполнение оставшегося кода.

Причина этого в том, что серверный код не останавливает загрузку страницы для удобства пользователей.Однако вы можете использовать google.script.run.withSuccessHandler для настройки обратного вызова функции на стороне клиента после завершения функции на стороне сервера.В котором вы передаете функцию для вызова .withSuccessHandler().В вашем случае вы будете делать что-то вроде этого:

<script>
  google.script.run.withSuccessHandler(showNames).getSheetNames();
  function showNames(sheetNames){
  document.getElementById('output').innerHTML = sheetNames;
  }
</script>

Обратите внимание, что возврат из вашей функции getSheetNames () передается в качестве аргумента функции обратного вызова, в данном случае - функции showNames()

Наконец, для обработки любого сбоя в выполнении кода сервера вы можете использовать google.script.run.withFailureHandler(onFailure).Рекомендуется всегда включать функцию для обработки сбоев.

Редактировать: Альтернативное решение с использованием скриптлетов .Вы можете использовать скриптлеты для вывода значения getSheetNames() следующим образом:

<script>
  document.getElementById('output').innerHTML = JSON.parse(<?= getSheetNames() ?>);
</script>

Преимущество этого заключается в том, что выполнение getSheetNames() завершено перед загрузкой страницы.Просто убедитесь, что вы создали HTML-шаблон и оценили его, прежде чем показывать веб-страницу следующим образом: var html = HtmlService.createTemplateFromFile('Your_HTML_File').evaluate()

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