Не удается получить объект из кэша пользователя. Сценарий Google Apps - PullRequest
0 голосов
/ 14 марта 2019

У меня проблема с получением объекта из кэша пользователя в скрипте Google Apps. Я не получаю ноль, я просто получаю пустой объект. Мне даже интересно, правильно ли объект сохраняется в пользовательский кеш. Любая помощь очень ценится. Вот что у меня пока ...

Этот код НЕ работает:

// global variable to access user cache
var cache = CacheService.getUserCache();

// the function to save to cache for an end-user
function saveToUserCache(dynamicObj) {
  Logger.log(dynamicObj); // the object displays here
  cache.putAll(dynamicObj, 300);
  Logger.log(cache.getAll(['test1', 'test2'])); // the object does not display here
}

Это вызывается из файла .html:

...
// Object being passed dynamically: 
var testObj = {'test1': "value1",'test2': "value2"};
google.script.run.withSuccessHandler(onSuccess).saveToUserCache(testObj);
...

Этот код работает:

// global variable to access user cache
var cache = CacheService.getUserCache();

// object to pass into the function
var testObj = {'test1': "value1",'test2': "value2"};

// the function to save to cache for an end-user
function saveToUserCache() {
  Logger.log(testObj); // the object displays here
  cache.putAll(testObj, 300);
  Logger.log(cache.getAll(['test1', 'test2'])); // the object displays here
}

Чтобы дать некоторый контекст ... Причина, по которой мне нужно использовать первый блок кода, заключается в том, что я передаю объект из интерфейсного интерфейса с помощью withSuccessHandler(). И, как вы можете видеть, объект отлично отображается в первом логгере, поэтому данные попадают в функцию saveToUserCache(), но после этого я не могу извлечь их из кэша в первом блоке кода. Что я делаю не так?

1 Ответ

0 голосов
/ 14 марта 2019

Я не могу воспроизвести вашу проблему со следующим кодом клиента и сервера:

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

function saveToUserCache(clientObject) {
  const cache = CacheService.getUserCache();
  const clientKeys = Object.keys(clientObject);

  console.log({message: "object from client code", clientObject: clientObject, user: Session.getTemporaryActiveUserKey()});
  cache.putAll(clientObject, 300);
  const values = cache.getAll(clientKeys);
  console.log({message: "Retrieved key values from client object", keys: clientKeys, values: values});
  return {"type": "user", values: values};
}

var testObject = {"script_test1": "script_value1", "script_test2": "script_value2"};
function saveNonParameterToUserCache() {
  const cache = CacheService.getUserCache();
  const scriptKeys = Object.keys(testObject);

  console.log({message: "global var object", testObject: testObject, user: Session.getTemporaryActiveUserKey()});
  cache.putAll(testObject, 300);
  const values = cache.getAll(scriptKeys);
  console.log({message: "Retrieved key values from test object", keys: scriptKeys, values: values});
  return {"type":"fixed", values: values};
}

function showSidebar() {
  const output = HtmlService.createHtmlOutputFromFile("usercachetest.html");
  SpreadsheetApp.getUi().showSidebar(output);
}

usercachetest.html (на стороне клиента)

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <button onclick="doit()">Click to run</button>
  </body>
  <script>
    function doit() {
      console.log("running doit");
      var clientObject = {"user_test1": "user_value1", "user_test2": "user_value2"};
      google.script.run.withSuccessHandler(onSuccess).saveToUserCache(clientObject);
      google.script.run.withSuccessHandler(onSuccess).saveNonParameterToUserCache();
    }
    function onSuccess(result) {
      console.log(result);
    }
    </script>
</html>

Запустите функцию showSidebar, переключитесь на файл контейнера Google Sheets, а затем откройте консоль браузера.Нажмите кнопку боковой панели.Проверьте свои журналы Stackdriver - все кажется великолепным.

enter image description here

Обратите внимание, что согласно ограничениям CacheService все ключи и все значения помещены в Cache должно быть строкой.Хорошей практикой является использование JSON.stringify для значений перед их кэшированием, а затем JSON.parse извлечение извлеченных элементов (если они есть) из кэша перед возвратом их для потребления.Например:

function foo(inputObject) {
  if (!inputObject) return;
  const cacheable = Object.keys(inputObject).reduce(function (obj, key) {
    obj[key] = JSON.stringify(inputObject[key]);
    return obj;
  }, {});
  CacheService.get____Cache().putAll(cacheable, expiryTime);
  ...
}

Также обратите особое внимание на то, что вы не передаете недопустимых типов от клиента к серверу - такие вещи, как Date объекты недопустимы и приводят к неопределенному/ отсутствует параметр функции.

...