Перейти к содержанию
  • Язык
  • записей

    16
  • высказываний

    18
  • просмотров

    12 535

О блоге

Всем привет, буду время от времени выкладывать что-нибудь интересное.  Блог в таком формате веду впервые, так что не судите строго.

Записи в этом блоге

В этой статье я расскажу про использование Google Forms и Google Sheets для отслеживания расходов с автоматическими уведомлениями через Telegram Bot. После ввода суммы в форму бот должен отправлять сообщение с текущим статусом бюджета. 

Все скрипты в этой работе я вставляю во вшитый в в таблицы гугл редактор скриптов, который можно найти во вкладке “Расширения” под названием “Apps Script”. Там же настраиваются триггеры, по которым эти скрипты будут работать. 

Я уже давно пыталась найти связку между таблицами и ботом в телеграм, так как мне это было необходимо для решения множества задач. То же расписание в университете, к примеру, теперь будет реализовывать куда как легче и приятней, чем поднимать свой сервер для этой задачи и мучиться с тяжелейшей задачей переноса названия предметов в код. Изначально я рассматривала такие сервисы как IFTTT, pushbullet, однако эти капиталистические помойки были моментально посланы мной маршировать в закат сразу после требования оплатить подписку за вебхуки. 

И вот, о чудо! Я случайно наткнулась на то, что лежало на поверхности: Google App Script.

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

Описание пошагово:

1. Сбор данных через Google Forms

Сначала мне захотелось сделать так, чтобы каждый день в промежутке между 22:00 и 23:00 мне приходила ссылка на гугл формы с вопросом о том, сколько денег я потратила. Затем, по задумке, эта цифра заносится в специальный столбец и выступает главной переменной в формулах.

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

function onFormSubmit(e) {

  // Получаем данные из формы

  var formResponse = e.values; // Массив всех значений формы

  var sumValue = formResponse[1]; // Предполагаем, что сумма находится в первом столбце формы



  // Указываем идентификатор другой книги и лист, куда переносить данные

  var targetSpreadsheetId = 'sheetpost-id';  // ID целевой книги(можно найти в url таблицы между /d/ и /edit

  var targetSheetName = 'Расчеты';  // Название листа в целевой книге



  // Получаем целевой лист в другой книге

  var targetSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetId);

  var targetSheet = targetSpreadsheet.getSheetByName(targetSheetName);



  // Находим первую пустую ячейку в столбце C начиная с C3

  var targetRange = targetSheet.getRange('C3:C');  // Диапазон начиная с C3

  var values = targetRange.getValues(); // Получаем все значения в столбце C



  var row = values.findIndex(function(row) {

    return row[0] === '';  // Ищем первую пустую ячейку

  });



  // Если не нашли пустую строку, то используем первую пустую ячейку

  if (row === -1) {

    row = values.length;

  }



  // Записываем сумму в найденную ячейку

  targetSheet.getRange('C' + (row + 3)).setValue(sumValue);  // Записываем сумму в найденную ячейку

}

2. Обработка данных в Google Sheets

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

Формулы вычисляют:

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

Пример моего кода: 

// Функция для отслеживания изменений в таблице
function checkForChanges() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Расчеты");  // Лист с данными
  var oldSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("OldValues");  // Лист для хранения старых значений
 
  var rangeC = sheet.getRange('C3:C50');  // Диапазон для Value1
  var rangeD = sheet.getRange('D3:D50');  // Диапазон для Value2
  var rangeB = sheet.getRange('B3:B50');  // Диапазон для Value4
  var valuesC = rangeC.getValues();  // Получаем значения из столбца C
  var valuesD = rangeD.getValues();  // Получаем значения из столбца D
  var valuesB = rangeB.getValues();  // Получаем значения из столбца B
 
  // Получаем старые значения из листа OldValues
  var oldValuesC = oldSheet.getRange('C3:C50').getValues();
  var oldValuesD = oldSheet.getRange('D3:D50').getValues();
 
  var updatedOldValuesC = [];
  var updatedOldValuesD = [];


  for (var i = 0; i < valuesC.length; i++) {
    var value1 = Math.round(valuesC[i][0]);  // Значение из столбца C (округляем)
    var value2 = Math.round(valuesD[i][0]);  // Значение из столбца D (округляем)
    var value4 = Math.round(valuesB[i][0]);  // Значение из столбца B (округляем)
   
    // Получаем старые значения
    var oldValue1 = oldValuesC[i][0];
    var oldValue2 = oldValuesD[i][0];
   
    // Вычисляем Value3 как сумму value4 + Value2 (округляем)
    var value3 = Math.round(value4 + value2);
   
    // Если значение изменилось, и value1 не равно 0, отправляем уведомление и обновляем старое значение
    if ((value1 !== oldValue1 || value2 !== oldValue2) && value1 !== 0) {
      sendTelegramMessage(value1, value2, value3, value4);  // Отправляем уведомление в Telegram


      // Добавляем измененные значения в массивы для обновления
      updatedOldValuesC.push([value1]);
      updatedOldValuesD.push([value2]);
    } else {
      // Если значения не изменились или value1 = 0, добавляем старые данные
      updatedOldValuesC.push([oldValue1]);
      updatedOldValuesD.push([oldValue2]);
    }
  }


  // Обновляем старые значения за один раз
  oldSheet.getRange('C3:C50').setValues(updatedOldValuesC);
  oldSheet.getRange('D3:D50').setValues(updatedOldValuesD);
}


// Функция для отправки сообщения в Telegram
function sendTelegramMessage(value1, value2, value3, value4) {
  var token = "bot-API";  // Вставьте ваш Telegram API токен
  var chatId = "id";  // Вставьте ваш chat_id, в который должны быть отправлены данные из google
 
  // Формируем сообщение для отправки
  var message = "УВЕДОМЛЕНИЕ ОБ ИЗМЕНЕНИИ\n\n" +
                "Потрачено денег: " + value1 + "\n" +
                "Осталось: " + value2 + "\n" +
                "Можно потратить завтра: " + value3 + "\n" +
                "Было доступно: " + value4;
 
  var url = "https://api.telegram.org/bot" + token + "/sendMessage";
 
  var payload = {
    chat_id: chatId,
    text: message
  };
 
  var options = {
    method: "post",
    payload: payload
  };
 
  UrlFetchApp.fetch(url, options);  // Отправка сообщения в Telegram
}

Описание работы кода

Цель функции checkForChanges отслеживать изменения в диапазонах столбцов таблицы Google Sheets, сравнивая текущие значения с сохранёнными старыми данными. При обнаружении изменений отправлять уведомления через Telegram Bot и обновлять список старых значений.

Пошаговый процесс:

1. Получение текущих и старых значений

  • Текущие данные считываются из листа "Расчеты" в диапазонах C3:C50 (Value1), D3:D50 (Value2) и B3:B50 (Value4).
  • Старые данные берутся с листа "OldValues" для диапазонов C3:C50 и D3:D50.

2. Сравнение данных

  • Проход по каждой строке таблицы:
  • Значения из текущих и старых столбцов округляются.
  • Если значения в столбцах C или D изменились (и value1 ≠ 0), генерируется уведомление в Telegram с помощью sendTelegramMessage.
  • Если изменений нет, старые значения остаются без изменений.

3. Вычисление Value3

  • Value3 рассчитывается как сумма Value4 (данные из столбца B) и Value2 (данные из столбца D), результат округляется.

4. Обновление старых данных

  • Изменённые значения записываются в массивы updatedOldValuesC и updatedOldValuesD.
  • По завершении цикла обновляются диапазоны C3:C50 и D3:D50 на листе "OldValues", чтобы зафиксировать последние данные.
  • Функция sendTelegramMessage
  • Формирует сообщение с информацией:
  • Потрачено денег (Value1)
  • Осталось (Value2)
  • Можно потратить завтра (Value3)
  • Было доступно (Value4)
  • Отправляет сообщение через Telegram API с помощью метода UrlFetchApp.fetch.

Результат работы кода

  • После внесения изменений в таблицу:
  • Если данные в столбцах C или D изменились, Telegram Bot уведомляет о новых расходах и текущем состоянии бюджета.
  • Обновляются старые значения, чтобы избежать повторных уведомлений.

 

Также отдельно можно добавить отправку сообщения по времени в бот с ссылкой на гугл форму, чтобы не забыть внести расходы за день: 

function mySendTelegramMessage() {
  var token = 'bot-API';  // Ваш API Token
  var chatId = '';  // Ваш chat_id
  var message = 'Заполни форму! Если не тратилась, введи любое число. Иначе все поломается и умрет в муках (в первую очередь, ты): https://forms.gle/xxxxxxxx';


  var url = 'https://api.telegram.org/bot' + token + '/sendMessage';
  var payload = {
    chat_id: chatId,
    text: message
  };
 
  var options = {
    method: 'post',
    contentType: 'application/x-www-form-urlencoded',
    payload: payload
  };


  try {
    var response = UrlFetchApp.fetch(url, options);  // Отправка запроса через API Telegram
    Logger.log('Message sent successfully: ' + response.getContentText());
  } catch (e) {
    Logger.log('Error: ' + e.toString());
  }
}


function createTimeTrigger() {
  // Создание триггера для выполнения sendTelegramMessage каждый день в 22:00
  ScriptApp.newTrigger('mySendTelegramMessage')
    .timeBased()
    .everyDays(1)
    .atHour(22)  // Установите нужное время
    .create();
}

Вот так выглядят сообщения в Telegram:

image.png

P.S. Это весьма сырой вариант подобной реализации, потому важно каждый день вности в форму какое-то число, хотя бы единицу, потому как если внести 0, то изменения не считаются и далее внесение данных может сильно "поплыть".

Спойлер

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

 

Обзор моделей ИИ

Здорова, решила выкатить небольшой халтурный обзорчик на модели ИИ, тремя из которых сама регулярно пользуюсь.

Честно, если б не великая математика, которая подарила нам AI-шки, я бы сдохла с голода и ненависти к себе и своей неспособности обрабатывать необходимое количество информации. В моей памяти еще свежи времена, когда надо было гулять по форумам с 20-х страниц гугла дабы узнать, почему команда source ~/.bashrc выдает какую-то срань вместо того что б нормально отработать. В ответ получать "пнх, рачелло, иди делай уроки" или советы ввести sudo rm -rf , что б все заработало (твари, ненавижу вас, надеюсь, эти калопотребители все еще сисадмины в ООО "Подзалупзавод").

Сегодня же можно наехать на чат-гопоту с вопросом "ты че мне прислал, шерсть? почему не работает" и получить тысячи извинений и подробное разъяснение разницы между bash и zshrc.

Благодаря AI я автоматизировала себе почти все в жизни, реализовала кучу идиотских, но при этом забавных проектов буквально за пару дней, написала диплом, множество курсовых и статей. Естественно, при работе с AI необходимо понимание предмета, ибо ошибок там море и не всегда эта дура может додуматься, в чем именно ошибка. Прискорбно, но мозги все еще приходится включать. Но все же масштабы рутинного говна, которое AI взяли на себя, переоценить невозможно. Ниже перечислю самые популярные модельки, которые используются сегодня в работе не только мной, но и многими разрабами, сисадминами, дизайнерами, музыкантами, писателями: всеми, короче. Наслаждайтес.

ChatGPT (OpenAI)

Разработчик: OpenAI

Модели: GPT-3.5, GPT-4, GPT-4 Turbo

Особенности:

  • Одна из самых известных и мощных языковых моделей (LLM).

  • Отличная работа с естественным языком, генерация текста, кода, диалогов.

  • Поддержка множества языков, включая русский.

  • Интеграция с API, плагинами, ботами, DALL·E для генерации изображений.

  • Доступен через ChatGPT (бесплатная и платная версии).

Плюсы:

  • Высокое качество ответов, богатая экосистема, активное развитие.

Минусы:

  • Ограничен доступ к GPT-4 без подписки; данные могут использоваться для обучения.

Для себя выделила, что очень сильно заколебалась врубать vpn и платить. Адекватные люди покупают аккаунт и делят его со знакомыми/друзьями, но той херней, которую я скрамливаю временами ИИ, я делиться не готова ни с кем, кроме своей совести. Безусловно, на сегодняшний день чат-гопота - лучшая на рынке, но геморрой, сопутствующий блокировкам, необходимостью вливать немало бабок, растет не по дням, а по часам, потому невольно начинаешь засматриваться на весьма и весьма перспективных китайцев.

DeepSeek

Разработчик: DeepSeek AI (Китай)

Модели: DeepSeek 1, DeepSeek 2, DeepSeek Chat

Особенности:

  • Мощные открытые (open-weight) модели, конкурирующие с Llama и GPT.

  • Хорошо оптимизированы под эффективность и скорость.

  • Поддержка длинных контекстов (до 128K токенов).

  • Бесплатны для исследовательского и коммерческого использования.

Плюсы:

  • Открытый исходный код, высокая производительность, поддержка длинных диалогов.

Минусы:

  • Меньше интеграций, чем у OpenAI; пока менее известен в западном сегменте.

Минусы, на самом деле, вообще не заканчиваются на меншем количестве интеграций и низкой популярности. Иногда это чудо может прислать ответ полностью на китайском языке, так еще и полностью поменять обсуждаемую тему. Просишь его исправить 2 строки, а оно переписывает код с нуля, так еще и так, что оно в принципе работать перестает. Впрочем, чат-гопота тоже частенько этим грешит. Уровень ярости, который исптываешь, когда понимаешь, что две строки придется вбить РУКАМИ, описанию не поддается.

Qwen (Tongyi Qianwen)

Разработчик: Alibaba Cloud

Модели: Qwen-1, Qwen-1.5, Qwen-2, Qwen-Max, Qwen-VL (мультимодальная), Qwen-Audio

Особенности:

  • Семейство моделей с открытым исходным кодом.

  • Поддержка до 32768 токенов контекста.

  • Мультимодальность (текст + изображение).

  • Хорошо работает с китайским и английским, частично — с другими языками.

  • Интеграция с экосистемой Alibaba.

Плюсы:

  • Открытые модели, масштабируемость, мультимодальность.

Минусы:

  • Пока не так популярен за пределами Китая; локализация на русском — средняя.

Эту AI открыла для себя совсем недавно по совету коллеги. И пока что нахожусь в восторге. Данная AI весьма неплохо работает с кодом и понимает, чего ты от нее хочешь, пока что даже лучше, чем чат-гопота. Пару дней мучила Квена без остановки и даже пополнила свое гитхаб-портфолио двумя новыми ботами. На следующей неделе буду тестировать, насколько он хорош в веб-разработке.

Ну и, конечно, оставшийся зоопарк:

Модель

Разработчик

Особенности

Llama / Llama3

Meta (Facebook)

Открытые модели, популярны в open-source

Gemini

Google

Бывший Bard, мультимодальный, интеграция с Google

Claude 3

Anthropic

Длинный контекст, безопасность, высокое качество

Mistral / Mixtral

Mistral AI (Франция)

Эффективные open-weight модели

Ernie Bot

Baidu

Сильна в китайском языке

YandexGPT

Яндекс

Российская LLM, интеграция с продуктами Яндекса

Cohere

Cohere

Фокус на бизнес-решения

Falcon

TII (ОАЭ)

Одни из самых мощных открытых моделей

Из всего вышеперечисленного трогала только AI от гугла и яндекса. Полное говнище У них все еще есть точки роста

Вывод простой. Все больше компаний активно занимаются разработкой AI и активно внедряют их в бизнес-процессы. Люди, на самом деле, и не заметили, насколько сильно изменился мир буквально за пару лет популяризации моделей машинного обучения и внедрения их в абсолютно каждую область, которая хотя бы косвенно связана с ИТ, автоматизацией и т.д. Уже сегодня сложно представить работу и жизнь без ИИ. Малолетние одинокие девочки даже заводят отношения с AI-персонажами из своих любимых книг, сериалов и аниме. Так что тем, кто все еще не научился писать промты (читай: четко формулировать запрос, ясно представляя конечный результат, который ожидается на выходе), советую поскорее освоить сей навык.

Важная сводка

Мы разместили cookie-файлы на твоё устройство, чтобы помочь сделать этот форум лучше. Ты можешь корректировать своё управление cookie-файлами, или же продолжить без каких-либо корректировок.

Иконка перчаток с несколькими звуками
Иконка перчаток

Досье

Навигация

Розыск

Розыск

Настройка push-извещений браузера

Chrome (Android)
  1. Нажми на значок замка рядом с адресной строкой.
  2. Нажми Разрешения → Извещения.
  3. Корректируй свои предпочтения.
Chrome (Desktop)
  1. Нажми на значок замка в адресной строке.
  2. Выбери Управление сайта.
  3. Разыщи Изввещения и корректируй свои предпочтения.