Асинхронное сохранение флажков в скрипте Google Apps - PullRequest
1 голос
/ 15 марта 2019

Я новичок в асинхронных вызовах, и я думаю, что это проблема.Однако я не очень уверен, как это исправить, поскольку Google Apps Script не поддерживает обещания, и я также не знаю, как их использовать.Я слышал, что если в GAS используется HTML-сервис, то возможны обещания, и это то, что я использую.Однако я не знаю, как это реализовать.Вот что у меня так далеко. Основная проблема в том, что мне нужно, чтобы данные отображались во втором Logger.log на стороне сервера (code.gs) ниже .Данные попадают в функцию в первом logger.log (code.gs), но затем объект становится пустым (не нулевым) при отображении пользовательского кэша во втором logger.log (code.gs).Могут быть использованы любые ключи / данные и проблема может быть реплицирована, так что это как-то связано с асинхронными вызовами, но как мне исправить это в коде GUI_JS?

На стороне сервера (code.gs):

// global variable to save into the cache
var userCache = CacheService.getUserCache();

// SAVE OPERATION - saves the checkboxes into the user cache
function processSavedValues(checkboxesObj){
  Logger.log(checkboxesObj); // this line shows in Logger
  userCache.putAll(checkboxesObj, 20);
  var getCache = userCache.getAll(['key1','key2']);
  Logger.log(getCache); // this line doesn't show in Logger
}

// Loads the HTML Service of Apps Script
function doGet(request) {
  return HtmlService.createTemplateFromFile('index').evaluate();
}
function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

На стороне клиента (index.html):

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>

  <form>
    <fieldset class="columnList">
      <div>
        <input type="checkbox" id="key1" name="fieldset[]" value="value1">
        <label class="checkmark" for="key1">test1</label>
      </div>
      <div>
        <input type="checkbox" id="key2" name="fieldset[]" value="value2">
        <label class="checkmark" for="key2">test2</label>
      </div> 
    </fieldset>
  </form>

  <button onclick="saveAllCheckboxValues()">test</button>

  <?!= include('GUI_JS'); ?> 
  </body>
</html>

На стороне клиента с использованием службы HTML (GUI_JS.html):

<script>

// Saves all checkbox values into the cache
function saveAllCheckboxValues(){

  // Select all checkboxes in the document
  var allCheckboxes = document.querySelectorAll("input[type=checkbox]");

  // Create a Key/Value pairs with the IDs and values of each checkbox
  var checkboxesObj = {};
  for (var i = 0; i < allCheckboxes.length; i++) {
     checkboxesObj[allCheckboxes[i].id] = allCheckboxes[i].checked;
  }

  // sends the checkbox values server-side into the cache
  google.script.run.withSuccessHandler(checkboxSaved).processSavedValues(checkboxesObj);

  // displays successfully saved
  function checkboxSaved(){
    alert("Great Success!");
  }

}

</script>

РезультатLogger.log:

[19-03-14 18:28:38:913 PDT] {key1=true, key2=true}
[19-03-14 18:28:38:959 PDT] {}

1 Ответ

1 голос
/ 15 марта 2019

Я думаю, что причина вашей проблемы - логические значения в объекте для помещения в CacheService.В CacheService строковое значение используется для размещения.Так как насчет этой модификации?Пожалуйста, подумайте об этом как один из нескольких ответов.В моей модификации была изменена функция processSavedValues().

Модифицированный скрипт:

function processSavedValues(checkboxesObj){
  Logger.log(checkboxesObj);
  userCache.put("sampleKey", JSON.stringify(checkboxesObj), 20); // Modified
  var getCache = userCache.get("sampleKey"); // Modified
  getCache = JSON.parse(getCache); // Added
  Logger.log(getCache);
}

Ссылки:

Если это не сработало и это не тот результат, который вам нужен, я прошу прощения.

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