Блог AST-SoftPro
Google Таблицы как CRM: автоматизация через gspread
Google Таблицы как CRM
Google Таблицы — это не просто spreadsheet. При правильной структуре и автоматизации через Python они становятся полноценной CRM-системой: хранение клиентов, трекинг сделок, автоматические уведомления и отчёты.
Библиотека gspread позволяет управлять таблицами программно: читать данные, добавлять строки, обновлять ячейки, форматировать столбцы.
Установка и авторизация
pip install gspread google-auth
Для авторизации нужен сервисный аккаунт Google:
-
Создать проект в Google Cloud Console
-
Включить Google Sheets API
-
Создать сервисный аккаунт и скачать JSON-ключ
-
Поделиться таблицей с email сервисного аккаунта
import gspread
from google.oauth2.service_account import Credentials
SCOPES = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive',
]
creds = Credentials.from_service_account_file(
'service-account.json', scopes=SCOPES
)
gc = gspread.authorize(creds)
# Открытие таблицы
spreadsheet = gc.open('CRM - КЛИЕНТЫ')
worksheet = spreadsheet.sheet1
Структура CRM-таблицы
Рекомендуемая структура:
| A: ID | B: Имя | C: Компания | D: Email | E: Телефон | F: Статус | G: Сумма | H: Дата |
|---|---|---|---|---|---|---|---|
| 1 | Иван Петров | ООО "Техно" | ivan@techno.ru | +79991234567 | Новая | 150000 | 2026-06-15 |
def add_client(name, company, email, phone, amount=0):
"""Добавление нового клиента в CRM."""
from datetime import datetime
# Проверка дубликата по email
existing = worksheet.col_values(4) # Столбец D (email)
if email in existing:
print(f"⚠️ Клиент {email} уже существует")
return False
row_num = len(worksheet.col_values(1)) + 1
worksheet.update(f'A{row_num}:H{row_num}', [[
row_num - 1,
name,
company,
email,
phone,
'Новая',
amount,
datetime.now().strftime('%Y-%m-%d')
]])
print(f"✅ Клиент добавлен: {name} ({company})")
return True
def update_status(email, new_status):
"""Обновление статуса сделки."""
emails = worksheet.col_values(4)
if email in emails:
row_num = emails.index(email) + 1
worksheet.update(f'F{row_num}', [[new_status]])
print(f"✅ Статус обновлён: {email} → {new_status}")
else:
print(f"❌ Клиент не найден: {email}")
# Примеры использования
# add_client('Анна Сидорова', 'IP Сидорова', 'anna@sidorova.ru', '+79991112233', 80000)
# update_status('anna@sidorova.ru', 'В работе')
Автоматические отчёты
def generate_report():
"""Генерация отчёта по CRM."""
data = worksheet.get_all_values()
headers = data[0]
rows = data[1:]
# Статистика по статусам
statuses = {}
total_amount = 0
for row in rows:
if len(row) >= 7:
status = row[5] # Столбец F
amount = int(row[6]) if row[6] else 0
statuses[status] = statuses.get(status, 0) + 1
total_amount += amount
report = "📊 ОТЧЁТ ПО CRM\n\n"
report += f"Всего клиентов: {len(rows)}\n"
report += f"Общая сумма: {total_amount:,} руб.\n\n"
report += "По статусам:\n"
for status, count in statuses.items():
report += f" {status}: {count}\n"
return report
# Отправка отчёта в Telegram
def send_report_to_telegram():
import requests
report = generate_report()
bot_token = "YOUR_BOT_TOKEN"
chat_id = "YOUR_CHAT_ID"
url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
requests.post(url, json={'chat_id': chat_id, 'text': report})
Интеграция с Telegram-ботом
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
import os
bot = Bot(token=os.getenv('BOT_TOKEN'))
dp = Dispatcher()
@dp.message(Command('client'))
async def add_client_from_bot(message: types.Message):
"""Добавление клиента из Telegram."""
parts = message.text.split()
if len(parts) < 3:
await message.answer('Формат: /client Имя Email')
return
name = parts[1]
email = parts[2]
company = parts[3] if len(parts) > 3 else ''
success = add_client(name, company, email, '', 0)
if success:
await message.answer(f"✅ Клиент {name} добавлен в CRM")
else:
await message.answer(f"⚠️ Клиент {email} уже существует")
@dp.message(Command('status'))
async def change_status(message: types.Message):
"""Изменение статуса из Telegram."""
parts = message.text.split()
if len(parts) < 3:
await message.answer('Формат: /status Email Статус')
return
email = parts[1]
status = ' '.join(parts[2:])
update_status(email, status)
await message.answer(f"✅ Статус обновлён: {status}")
async def main():
await dp.start_polling(bot)
if __name__ == '__main__':
import asyncio
asyncio.run(main())
Сравнение Google Таблиц и CRM-систем
| Критерий | Google Таблицы | Специализированная CRM |
|---|---|---|
| Стоимость | Бесплатно | От $10/пользователь/мес |
| Настройка | Python-скрипты | Встроенные инструменты |
| Интеграции | gspread, Apps Script | API, вебхуки |
| Масштабируемость | До 100K строк | Неограниченно |
| Командная работа | Совместное редактирование | Роли и права |
Google Таблицы идеально подходят для малого бизнеса (до 500 клиентов). Когда база растёт — переходите на специализированную CRM.
Заключение
Google Таблицы + gspread — это быстрая альтернатива CRM для малого бизнеса. Ключевые возможности:
-
Добавление клиентов и обновление статусов через Python;
-
Интеграция с Telegram-ботом для удалённого управления;
-
Автоматические отчёты и уведомления;
-
Совместная работа команды в реальном времени.
Начните с простой таблицы, автоматизируйте рутину, масштабируйте по мере роста.