Как настроить уведомления в Google Таблицах, чтобы получать оповещения при изменении значений в определенном диапазоне ячеек с помощью использования формул?

Как изменить скрипт для уведомлений в Telegram так, чтобы он реагировал на числа, образованные формулами, в столбце "Сумма", и присылал уведомления, как и при ручном изменении чисел в этом столбце?
  • 10 января 2024 г. 9:39
Ответы на вопрос 2
Для настройки уведомлений при изменении значений в определенном диапазоне ячеек в Google Таблицах можно использовать скрипты Google Apps Script, которые позволяют автоматизировать различные задачи. Ниже представлена пошаговая инструкция, как создать скрипт для отправки уведомлений в Telegram:

**Шаг 1: Получение токена бота и ID чата в Telegram**
1. Создайте нового бота в Telegram через @BotFather и получите токен для бота.
2. Найдите свой ID чата. Это можно сделать, написав что-нибудь боту `userinfobot` в Telegram, который скажет ваш ID чата.

**Шаг 2: Создание скрипта в Google Таблицах**
1. Откройте Google Таблицы.
2. Нажмите на `Инструменты` -> `Редактор скриптов`.
3. Удалите код, который уже есть в редакторе, и вставьте следующий скрипт (замените `your-telegram-bot-token` на токен вашего бота и `your-telegram-chat-id` на ваш ID чата):

```javascript
var TELEGRAM_TOKEN = 'your-telegram-bot-token';
var CHAT_ID = 'your-telegram-chat-id';
var SHEET_NAME = 'Лист1'; // Название листа
var RANGE_TO_WATCH = 'Сумма'; // Название столбца для отслеживания

function doPost(e) {
  // Эта функция не требуется для данной задачи, но её наличие обязательно для реализации веб-приложения.
}

function setTrigger() {
  // Эта функция устанавливает триггер на изменение таблицы
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ScriptApp.newTrigger('sendTelegramNotification')
           .forSpreadsheet(ss)
           .onChange()
           .create();
}

function sendTelegramNotification() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
  
  var range = sheet.getDataRange();
  var values = range.getDisplayValues(); // Получаем значения последних ячеек в столбце "Сумма".

  var columnToWatch = getColumnNumberByName(RANGE_TO_WATCH, values[0]);
  if (columnToWatch === -1) {
    return;
  }
  
  // Проходим по каждой строке и проверяем, является ли содержимое числом, полученным формулой
  for (var i = 1; i < values.length; i++) {
    var cellValue = values[i][columnToWatch];
    var cellFormula = range.getCell(i + 1, columnToWatch + 1).getFormula();
    
    // Если значение является результатом формулы, присылаем уведомление
    if (cellFormula && !isNaN(cellValue)) {
      var prevValue = range.getCell(i + 1, columnToWatch + 1).getNote();
      
      if (prevValue !== cellValue) {
        // Сохраняем текущее значение в примечание, чтобы не отправлять повторные уведомления
        range.getCell(i + 1, columnToWatch + 1).setNote(cellValue);

        var message = 'Значение в столбце "' + RANGE_TO_WATCH + '" изменено: ' + cellValue;
        sendTelegramMessage(message);
      }
    }
  }
}

function sendTelegramMessage(text) {
  var url = 'https://api.telegram.org/bot' + TELEGRAM_TOKEN + '/sendMessage';
  var payload = {
    chat_id: CHAT_ID,
    text: text,
    parse_mode: 'Markdown'
  };
  
  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'muteHttpExceptions': true,
    'payload': JSON.stringify(payload)
  };
  
  UrlFetchApp.fetch(url, options);
}

function getColumnNumberByName(columnName, headers) {
  for (var i = 0; i < headers.length; i++) {
    if (headers[i]
Есть несколько подходов: 


В любом случае, вам всегда нужно брать текущий диапазон и предыдущий его снимок, иначе все эти сравнения будет сложно отслеживать.

Кстати, задания оставлять нельзя по правилам сообщества.
Похожие вопросы