Я не могу воспроизвести вашу проблему со следующим кодом клиента и сервера:
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 - все кажется великолепным.
Обратите внимание, что согласно ограничениям 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
объекты недопустимы и приводят к неопределенному/ отсутствует параметр функции.