Записувати витрати, ідеї чи короткі службові нотатки прямо в таблицю з телефону — це один із тих дрібних процесів, які майже всі ненавидять. Маленькі клітинки, незручний мобільний інтерфейс, ручне перемикання між колонками. У результаті облік відкладається “на потім”, а потім або забувається, або перетворюється на хаос.

Смартфон із Telegram, що синхронізує нотатки з Google Sheets; сучасна 3D-ілюстрація з м’якими тінями, центрований об’єкт
Смартфон із Telegram, що синхронізує нотатки з Google Sheets; сучасна 3D-ілюстрація з м’якими тінями, центрований об’єкт

Саме тут добре працює формат “бот-посередник”. Ви пишете повідомлення так, ніби кидаєте його другові в Telegram, а далі система сама витягує сенс, визначає категорію, суму і записує все в Google Таблицю. Для користувача це виглядає майже магічно: написали “Купив каву за 60 грн” — і запис уже в обліку. Але під капотом там не магія, а дуже приземлена автоматизація на Node.js, Telegram Bot API, OpenAI і Google Sheets API.

У чому тут реальна користь, а не просто “вау-ефект”

Цінність такого бота не в тому, що він “розмовляє з вами людською мовою”. Це приємний інтерфейс, але бізнес-користь глибша. Ви знімаєте тертя між думкою й фіксацією даних. Не відкриваєте таблицю, не думаєте, в яку колонку що ставити, не губите дрібні витрати й ідеї.

Такий сценарій добре підходить для:

  • обліку особистих і командних витрат;
  • збору ідей для контенту;
  • швидких операційних нотаток;
  • фіксації дрібних покупок, задач і спостережень у полі.

Якщо вам уже близька логіка інтеграції Google Sheets з Telegram та Slack, цей бот — природне продовження тієї ж ідеї: месенджер стає людським інтерфейсом до таблиці.

Як працює “магія” насправді

Пайплайн тут дуже простий:

  1. Telegram-бот отримує текстове повідомлення.
  2. Node.js-сервіс передає текст у модель.
  3. ШІ повертає структурований JSON: категорію, суму, опис.
  4. Скрипт дописує новий рядок у Google Sheets.
  5. Бот відповідає користувачу, що запис збережено.

Тут важливий не сам факт використання LLM, а спосіб її застосування. Ми не просимо модель “подумати красиво”. Ми ставимо вузьке завдання: повернути чисту структуру для таблиці. Саме тому такий підхід працює стабільніше й краще масштабується на реальні мікропроцеси.

Створили: BotFather, таблицю і доступ до Sheets API

BotFather, таблиця і Sheets API
BotFather, таблиця і Sheets API

Перший крок — створити бота через @BotFather і отримати токен. Другий — підготувати Google Таблицю, куди будуть летіти дані. Третій — увімкнути Google Sheets API і видати застосунку доступ.

Для тестового запуску це простіше, ніж здається. Але тут є одна чесна ремарка: Google quickstart для Node.js використовує спрощену модель автентифікації, яку сама Google рекомендує саме для тестового середовища. Для продакшн-сценарію краще окремо продумати, як ви зберігаєте ключі, токени й доступ до таблиць.

Написали: простий Node.js-скрипт, який з’єднує Telegram, OpenAI і Sheets

Нижче — компактний приклад, який показує саму ідею. Він слухає повідомлення, просить модель повернути JSON і додає рядок у таблицю.

import TelegramBot from "node-telegram-bot-api";
import OpenAI from "openai";
import { google } from "googleapis";

const bot = new TelegramBot(process.env.TELEGRAM_BOT_TOKEN, { polling: true });
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const auth = new google.auth.GoogleAuth({
  keyFile: "./credentials.json",
  scopes: ["https://www.googleapis.com/auth/spreadsheets"],
});

const sheets = google.sheets({ version: "v4", auth });

bot.on("message", async (msg) => {
  try {
    const text = msg.text || "";

    const aiResponse = await openai.chat.completions.create({
      model: "gpt-4o-mini",
      response_format: { type: "json_object" },
      messages: [
        {
          role: "system",
          content:
            "Перетвори повідомлення на JSON: {category, amount, description}. Якщо суми немає — amount = 0. Не додавай пояснень поза JSON.",
        },
        {
          role: "user",
          content: text,
        },
      ],
      temperature: 0.1,
    });

    const data = JSON.parse(aiResponse.choices[0].message.content);

    await sheets.spreadsheets.values.append({
      spreadsheetId: process.env.SPREADSHEET_ID,
      range: "Лист1!A:D",
      valueInputOption: "USER_ENTERED",
      requestBody: {
        values: [[new Date().toISOString(), data.category, data.amount, data.description]],
      },
    });

    await bot.sendMessage(msg.chat.id, "✅ Записано в таблицю!");
  } catch (error) {
    console.error(error);
    await bot.sendMessage(msg.chat.id, "Сталася помилка. Перевір логіку парсингу або доступ до таблиці.");
  }
});

Будьте обачні, використовуючи код.

Що тут важливо пояснити словами

Сильна сторона цього сценарію — не в коді як такому, а в промпті. Саме від нього залежить, чи бот поверне придатну структуру, а не “розумну відповідь у вільній формі”. Вам треба чітко сказати моделі:

  • яку роль вона виконує;
  • який формат має повернути;
  • що робити, якщо суми немає;
  • що не можна додавати текст поза JSON.

Це вже схоже не на чат, а на мікросервіс, який виконує вузьку NLP-задачу. За тим самим принципом, до речі, працюють і складніші сценарії на кшталт мікросервісів на Node.js для Google Workspace, тільки там замість особистих нотаток можуть бути вебхуки, листи, документи чи дані з кількох систем одразу.

Приклад промпту, який краще тримає структуру

Щоб бот поводився передбачувано, системне повідомлення краще робити не “дружнім”, а операційним. Наприклад так:

Ти асистент для обліку коротких нотаток у Google Sheets.
Поверни тільки JSON без пояснень.
Формат:
{
  "category": "string",
  "amount": number,
  "description": "string"
}
Правила:
- якщо суми немає, став 0;
- якщо це ідея, category = "Ідеї";
- якщо це витрата на їжу, category = "Харчування";
- description має бути коротким і зрозумілим.

Після такого промпту фраза на кшталт Обід 250 грн уже перетворюється не просто на текст, а на нормальний запис для таблиці.

Чим це краще за ручний ввід у Google Sheets

Ручний ввід проти автоматизації з AI
Ручний ввід проти автоматизації з AI

Бо ви не працюєте з таблицею напряму. Ви працюєте з інтерфейсом, який для людини природний: коротке повідомлення в чаті. А таблиця лишається системою зберігання, а не місцем, де ви мучитеся з дрібною рутиною.

Особливо це відчутно, коли потрібно швидко зафіксувати дані “на ходу”: покупку, думку, тему для статті, коротку задачу. У цьому місці Telegram-бот виграє не у складної CRM, а саме у незручного мобільного вводу.

Де тут межа і коли вже потрібен інший рівень

Такий бот ідеальний як легкий особистий або командний асистент. Але якщо сценарій стає складнішим — з історією користувачів, кількома таблицями, ролями, чергами, багатокроковою логікою, перевіркою дублювань або обробкою вкладень — тоді варто переходити до більш системної архітектури.

У такому випадку Telegram стає лише одним із каналів, а справжня логіка вже живе в окремому сервісі. Якщо далі вам треба не просто записувати нотатки, а будувати складніший автоматизований контур, варто дивитися в бік сценаріїв на кшталт голосового Telegram-бота для нотаток у Google Sheets або навіть більш важких пайплайнів, де LLM не просто парсить текст, а приймає участь у класифікації й маршрутизації даних.

А як щодо хостингу

Хмарні сервіси та цифрові можливості
Хмарні сервіси та цифрові можливості

Хороша новина в тому, що для такого бота не потрібен “дорогий DevOps”. Для старту вистачає простого середовища, яке може тримати Node.js-процес, environment variables і вихід у мережу. Для тестів або невеликих особистих сценаріїв підійдуть і легкі хмарні платформи. Але тут важливо формулювати чесно: не кожен сервіс дає повноцінний безстроковий free-план для постійно працюючого бота. Наприклад, у Render є безкоштовні web services для тестування, а Railway зараз більше про trial-модель із кредитами, ніж про “вічно безкоштовний” бекенд.

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

Практичний підсумок

Уся сила цього сценарію в автономності. Ви один раз налаштовуєте бота — і далі він працює на вас 24/7. Не просить відкрити таблицю. Не змушує боротися з мобільним інтерфейсом. Не змушує кожного разу “зібратися”, щоб щось занести в облік.

І це хороший приклад того, як корисна автоматизація починається не з великого бюджету, а з маленького вузького сценарію, де є постійне тертя. Ви просто пишете повідомлення, а система вже сама розкладає його по поличках.