Задать вопрос
@treywisp

Как пофиксить неизвестное имя функции при обновлении параметра функции?

Приветствую, недавно столкнулся с проблемой автоматического перерасчета функции в ячейке. Поскольку отсутствуют предусмотренные варианты автоматического перерасчета пользовательских функций, использую через функцию 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 ? "✅" : "❌";
}
  • Вопрос задан
  • 53 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@treywisp Автор вопроса
Вопрос решил ликвидацией кэширования. Теперь работает стабильно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы