Приветствую, недавно столкнулся с проблемой автоматического перерасчета функции в ячейке. Поскольку отсутствуют предусмотренные варианты автоматического перерасчета пользовательских функций, использую через функцию updateTime() запись текущего времени в ячейку А4 с минутным триггером и дальнейшей отправкой в качестве аргумента в ячейку: =getPlayerOnline(B9; A4). (upd. остальные функции работают так же кривовато)
function updateTime() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Состав");
sheet.getRange("A4").setValue(new Date());
}
Данный костыль вполне приемлемо работает, однако после изменения данных в А4, искомая функция getPlayerOnline() по словам Google не найдена, хотя имеется в коде. Проблема частично решается с помощью перезагрузки страницы с таблицей, однако решение перезагружать каждую минуту в целях получения актуальных данных кажется уделом мазохиста. Получение json-таблички реализовано через кэширование с последующим запросом каждую минуту во избежание флуда GET запросами. Есть ли какое-то решение этой проблемы?
function getCachedPlayersData() {
const cache = CacheService.getScriptCache();
const cached = cache.get("sampData");
if (cached) {
return JSON.parse(cached);
}
const url = "адрес прокси";
const options = {
method: "get",
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(url, options);
const code = response.getResponseCode();
const text = response.getContentText();
if (code !== 200) {
Logger.log("Non-200 response code: " + code);
return null;
}
const json = JSON.parse(text);
const filtered = json.map(p => ({
name: p.name,
rank: p.rank,
activity_day: p.activity_day,
activity_week: p.activity_week,
is_online: p.is_online
}));
const filteredStr = JSON.stringify(filtered);
if (filteredStr.length > 100000) {
Logger.log("Filtered data too large for cache: " + filteredStr.length);
return filtered;
}
cache.put("sampData", filteredStr, 60); // 1 минута
return filtered;
} catch (e) {
Logger.log("Fetch error: " + e.message);
return null;
}
}
function getPlayerRank(nickname) {
if (!nickname) return "Пустой ник";
const data = getCachedPlayersData();
if (!data) return "API Error";
const user = data.find(p => p.name === nickname);
if (!user) return "Игрок не найден";
return user.rank.replace(/(\S)(\[)/, "$1 $2");
}
function getPlayerActivity(nickname) {
if (!nickname) return "Пустой ник";
const data = getCachedPlayersData();
if (!data) return "API Error";
const user = data.find(p => p.name === nickname);
if (!user) return "Игрок не найден";
return user.activity_day + " / " + user.activity_week;
}
function getPlayerOnline(nickname) {
if (!nickname) return "Пустой ник";
const data = getCachedPlayersData();
if (!data) return "API Error";
const user = data.find(p => p.name === nickname);
if (!user) return "Игрок не найден";
return user.is_online === 1 ? "✅" : "❌";
}