SAMP-RP [Samp-RP] Автоматизируем таблицы на Google Sheets и Samp-DB

treywisp

Новичок
Автор темы
3
1
Устал наверное, бедненький, заполнять вручную гугл таблицы на твоем самом любимом сервере Samp-RP? Думаешь, что участь государственного раба заключается в документах, отчетах, таблицах? В целом ты прав, но смотри этот гайд, тут ты автоматизировать хотя бы таблицы научишься.

В чем заключается вообще автоматизация таблиц? Ты вписываешь ник в одну из ячеек, желательно на одной строке, а формула автоматически подставляет в нужную тебе ячейку данные "Находится ли онлайн в данный момент", "Ранг", "Онлайн за день / неделю (1 / 14)". Можно еще настроить прочие данные из offmembers в Samp-DB, но они практически бесполезные (общий онлайн на сервере в днях, дата принятия в фракцию и так далее). Кратко как реализовано: отправка через прокси GET запроса на API Samp-DB, получение json таблицы, запись json таблицы на отдельный лист с форматированием (Fetch не терпел у меня большой размер json, да и смысла нет мусорные данные вписывать), подстановка формулами нужных данных в ячейки.

1748045758020.png
Пошаговое руководство:

1. Создание прокси для отправки http запросов, поскольку Google имеет свойство насильно изменять User-Agent на свой. Для этого я использовал Cloudflare Workers, бесплатная тема, мешающих ограничений вроде как нету.
1.1. Заходим на https://www.cloudflare.com/ru-ru/developer-platform/products/workers/
1.2. Нажимаем на "Начать создание", проходим регистрацию
1.3. Заходим в панель управления, находим пункт "Compute (Workers)", там выбираем Workers & Pages.
1.4. Создаем новый файл "Workers", выбираем "Start with Hello World!", называем как душе угодно, далее просто создаем, ничего пока что не меняем.
1.5. После окончания создания появится страница, где есть кнопочка "Edit Code", нажимаем на нее.
1.6. Удаляем весь код и вставляем приложенный ниже с заменами. Заменить надо *ИД ТВОЕЙ ФРАКЦИИ*, *НИКНЕЙМ, ПРИВЯЗАННЫЙ К SAMP-DB*, *НОМЕР ТВОЕГО СЕРВЕРА: 101, 102 или 103*, *ТВОЙ АПИ КЛЮЧ, ПОЛУЧЕННЫЙ НА SAMP-DB*. Не заменил на корректные - работать не будет. Кавычки "" убирать не нужно.

JavaScript:
export default {
  async fetch(request) {
    const targetUrl = 'https://samp-db.ru/api/offmembers?faction_id=*ИД ТВОЕЙ ФРАКЦИИ*';

    const customHeaders = {
      "content-type": "application/json",
      "Nickname": "*НИКНЕЙМ, ПРИВЯЗАННЫЙ К SAMP-DB*",
      "User-Agent": "samp-db",
      "Server": "*НОМЕР ТВОЕГО СЕРВЕРА: 101, 102 или 103*",
      "API-Key": "*ТВОЙ АПИ КЛЮЧ, ПОЛУЧЕННЫЙ НА SAMP-DB*"
    };

    const response = await fetch(targetUrl, {
      method: "GET",
      headers: customHeaders
    });

    const body = await response.text();
    return new Response(body, {
      status: response.status,
      headers: { "content-type": "application/json" }
    });
  }
}

1.7. Далее просто сохраняем. Профит, просто копируем ссылку https://название.ник.workers.dev/. Только убедитесь, что сохранили и он работает.

2. Настройка Apps Script и гугл таблиц, как найти первый думаю разберетесь.
2.1. Создаем чистый лист "Данные", название можно изменить, только и в дальнейшем коде нужно будет поменять его.
2.2. Открываем Apps Script в гугл таблицах, вставляем туда код с заменами. Запросы реализованы через триггер, про настройку ниже. Там можно и установить время обновления:

JavaScript:
function fetchPlayerData() {
  const url = "*ТВОЯ ССЫЛКА*";
  const options = {
    method: "get",
    muteHttpExceptions: true
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    if (response.getResponseCode() !== 200) {
      Logger.log("HTTP " + response.getResponseCode());
      return null;
    }

    const json = JSON.parse(response.getContentText());

    return json.map(p => [
      p.name,
      p.rank.replace(/(\S)(\[)/, "$1 $2"),
      p.activity_day + " / " + p.activity_week,
      p.is_online === 1 ? "✅" : "❌"
    ]);
  } catch (e) {
    Logger.log("Ошибка загрузки: " + e.message);
    return null;
  }
}

function updatePlayerSheet() {
  const data = fetchPlayerData();
  if (!data) return;

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName("Данные");

  if (!sheet) {
    sheet = ss.insertSheet("Данные");
  }

  sheet.clear();
  const headers = ["Ник", "Ранг", "Активность", "Онлайн"];
  sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
  sheet.getRange(2, 1, data.length, headers.length).setValues(data);
}

2.3. Создание ТРИГГЕРА, который будет инициировать обновление данных. Он находится в Apps Scripts, слева есть менюшка, на которой располагаются как раз триггеры. Создаем новый с настройками:

Выберите функцию - updatePlayerSheet()
Выберите, какое развертывание выполнить - Основное развертывание
Выберите источник мероприятия - Триггер по времени
Выберите тип триггера - По минутам
Выберите промежуток времени - 1 минута (можно и больше, тут как хочешь)


Далее сохраняем, теперь срабатывает каждую минуту. После ваш лист "Данные" должен заполняться автоматически полной json табличкой оффмемберса фракции.

2.4. Финалочка. Использование формул в самой таблице, в любом месте, кстати.

- Находится ли онлайн в данный момент: =ЕСЛИОШИБКА(ВПР(*ЯЧЕЙКА*; 'Данные'!A:D; 4; ЛОЖЬ); "Нет данных"), где нужно заменить *ЯЧЕЙКА* на ячейку с ником в формате Имя_Фамилия.
Аналогично для:
- Ранг игрока: =ЕСЛИОШИБКА(ВПР(*ЯЧЕЙКА*; 'Данные'!A:D; 2; ЛОЖЬ); "Нет данных")
- Онлайн игрока: =ЕСЛИОШИБКА(ВПР(*ЯЧЕЙКА*; 'Данные'!A:D; 3; ЛОЖЬ); "Нет данных")

Поздравляю, вы имеете автоматизированную таблицу. Интересный факт, если скопировать значение ячейки с формулой, а после вставить, протянув вниз - *ЯЧЕЙКА* подставится сама, только нужен рабочий образец.

1748045895495.png




Актуально на 24.05.2025