Автоматизация
September 20, 2024

Как автоматизировать отправку скриншотов из Google Таблиц в Telegram

В этой статье мы рассмотрим, как с помощью Google Apps Script и Telegram бота автоматически отправлять скриншоты данных из Google Таблиц в Telegram. Такой подход может быть полезен для мониторинга отчетов, уведомлений и другой информации.

Что нам понадобится:

  1. Google Таблицы — чтобы хранить данные.
  2. Telegram-бот — для отправки сообщений.
  3. Google Apps Script — для автоматизации процессов и создания скриншотов.

Шаг 1: Создание Telegram-бота

  1. В Telegram найдите бота @BotFather.
  2. Напишите ему /start и затем /newbot.
  3. Следуйте инструкциям и введите имя и username бота.
  4. После создания бот отправит вам токен API. Сохраните его, он понадобится для отправки сообщений.

Шаг 2: Подготовка Google Таблиц

  1. Создайте или откройте существующую Google Таблицу.
  2. Убедитесь, что у вас есть доступ на редактирование или выше.
  3. Перейдите в меню Файл → Опубликовать в Интернете и опубликуйте таблицу, если хотите делиться данными без ограничений доступа.

Шаг 3: Создание скрипта в Google Apps Script

  1. Перейдите в Расширения → Apps Script.
  2. Создайте новый проект и вставьте следующий код:
// Основная функция для отправки скриншота в Telegram
function sendImageToTelegram() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName('Название вашего листа'); // Укажите название листа
  const botToken = 'Ваш токен бота'; // Вставьте сюда токен вашего бота
  const chatId = 'Ваш chat_id'; // Вставьте сюда ваш chat_id или id группы

  // Получаем диапазон данных
  const range = sheet.getDataRange();
  const blob = convertToImage(range); // Преобразуем диапазон в изображение

  // Отправляем изображение в Telegram
  const result = sendPhoto(chatId, blob, botToken, 'Ваш текст сообщения');
  Logger.log(result);
}

// Преобразование диапазона в изображение
function convertToImage(range) {
  const values = range.getValues().map(row => row.map(cell => cell.toString())); // Все ячейки в строковый формат
  const table = Charts.newDataTable();

  values[0].forEach((header) => table.addColumn(Charts.ColumnType.STRING, header)); // Задаем заголовки
  values.slice(1).forEach((row) => table.addRow(row)); // Добавляем строки данных

  return Charts.newTableChart()
    .setDataTable(table.build())
    .setDimensions(1000, 500) // Размеры изображения
    .setOption("alternatingRowStyle", false)
    .build()
    .getBlob();
}

// Функция для отправки фото в Telegram
function sendPhoto(id, blob, botToken, text = '') {
  const data = {
    chat_id: id,
    photo: blob,
    thumb: '',
    caption: text,
    parse_mode: "HTML",
    disable_notification: false
  };
  const options = {
    method: 'POST',
    payload: data,
    muteHttpExceptions: true
  };
  return UrlFetchApp.fetch('https://api.telegram.org/bot' + botToken + '/sendPhoto', options).getContentText();
}

// Создание триггера для автоматической отправки
function createDailyTrigger() {
  deleteSpecificTrigger('sendImageToTelegram'); // Удаляем старые триггеры для этой функции

  // Устанавливаем новый триггер
  ScriptApp.newTrigger('sendImageToTelegram')
    .timeBased()
    .everyDays(1)
    .atHour(12)
    .nearMinute(5)
    .inTimezone("Europe/Moscow")
    .create();
  
  Logger.log('Триггер установлен на каждый день в 12:05 по МСК.');
}

// Удаление существующего триггера для конкретной функции
function deleteSpecificTrigger(functionName) {
  const allTriggers = ScriptApp.getProjectTriggers();
  
  for (let i = 0; i < allTriggers.length; i++) {
    if (allTriggers[i].getHandlerFunction() === functionName) {
      ScriptApp.deleteTrigger(allTriggers[i]);
      Logger.log(`Триггер для функции ${functionName} удален.`);
    }
  }
}

Описание кода:

  • sendImageToTelegram() — основная функция, которая создает скриншот данных и отправляет его в Telegram.
  • convertToImage(range) — функция преобразует диапазон ячеек в изображение с помощью Google Charts.
  • sendPhoto(id, blob, botToken, text) — отправляет изображение в Telegram.
  • createDailyTrigger() — создает триггер, который запускает функцию sendImageToTelegram каждый день в 12:05 по московскому времени.
  • deleteSpecificTrigger(functionName) — удаляет существующий триггер для указанной функции, чтобы избежать дублирования.

Шаг 4: Установка триггера

  1. Запустите функцию createDailyTrigger() один раз из редактора скриптов.
  2. Проверьте в меню Триггеры наличие триггера на ежедневный запуск.

Шаг 5: Проверка работы

  1. Вернитесь в редактор Google Таблиц.
  2. Запустите функцию sendImageToTelegram() вручную, чтобы убедиться, что все работает корректно.
  3. Проверьте, пришло ли сообщение в Telegram с изображением данных.

Советы и рекомендации:

  • Убедитесь, что бот добавлен в группу или канал, если используете групповые сообщения.
  • В случае проблем проверьте журнал логов в редакторе скриптов (Ctrl + Enter).
  • В настройках Google Таблиц убедитесь, что доступ к данным имеет ваш Google аккаунт.

Готово! Теперь у вас есть автоматическая система для отправки данных из Google Таблиц в Telegram.