Google Sheets → n8n → PostgreSQL → Power BI

Google Sheets → n8n → PostgreSQL → Power BI

Минималистичная ETL-цепочка для малого и среднего бизнеса (обновлено 19 июня 2025 г.)

1. Почему именно эта связка

Лёгкий вход без капитального ремонта. У подавляющего большинства SMB-команд «дедушкой хранилищ» остаётся Google Sheets. Подтягивать туда отчётность удобно: открыл браузер — и готово. Но когда строк переваливает за 50 000, формулы тормозят, а простой импорт в BI каждое утро превращается в ритуал «открой-сохрани-обнови». Связка n8n → PostgreSQL → Power BI убирает ручную суету: нода n8n считывает шитовский диапазон по расписанию, кидает данные в Postgres, а дашборды обновляются автоматически.

Стоимость ≈ 0 руб. на старте.

  • Google Sheets — входит в Google Workspace.
  • n8n — open-source, можно поднять на любом VPS.
  • PostgreSQL — бесплатный СУБД-«танк».
  • Power BI Desktop — бесплатен, а лицензию Pro можно докупить, когда отчёты пойдут в бой. Получается отличная лестница взросления: от «Excel в облаке» до нормального хранилища и серьёзной визуализации без ранних инвестиций.

Типовые сценарии:

  • Финучёт маленького агентства: таблицы расходов/доходов → P\&L-дашборд.
  • E-commerce на маркетплейсах: выгрузка коллег из Bitrix24* в Sheets → расчёт KPI → витрина продаж.
  • Маркетинговые отчёты: дневные спенды из рекламных кабинетов летят в Sheet, а дальше по трубе.

* Да-да, данные из Bitrix24 тоже часто пролетают в Google Sheets первым делом — эту дорожку можно оставить, если REST-лимиты CRM не позволяют качать напрямую в Postgres.


2. Компоненты и роли

Компонент Роль в оркестре Кого ставим «дежурным»
Google Sheets Оперативное вводное «слово» (источник данных) Бухгалтер / маркетолог
n8n Без-кликовый конвейер (ETL-оркестратор) DevOps / аналитик
PostgreSQL Централизованное хранилище, зона интеграций и трансформаций DBA / Data Engineer
Power BI Витрина для людей и совета директоров BI-аналитик
(опция) Apache Superset Веб-дашборд внутри LAN/VPN, если Power BI Pro пока не купили Любой, кто любит open-source

3. Подготовка окружения

3.1 Установки и доступы

Что поставить Где взять
n8n 1.44+ (Docker image) n8n Docs
PostgreSQL 16 Postgres Downloads
Power BI Desktop June 2025 Power BI Release Notes
(опция) Superset 3.0 Superset Installation
Сервис-аккаунт Google с OAuth-ключом Sheets API Google Cloud Console

3.2 Минимальный набор прав

  • Sheets API: https://www.googleapis.com/auth/spreadsheets.readonly
  • n8n-сервер: HTTPS + Basic Auth/VPN, чтобы закрыть орг-данные.
  • PostgreSQL: пользователь etl c правами INSERT, UPDATE на схему stage.

3.3 Docker-композ

version: '3.8'

services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_USER: etl
      POSTGRES_PASSWORD: etl_pwd
      POSTGRES_DB: datamart
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - 5432:5432

  n8n:
    image: n8nio/n8n:1.44
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_DATABASE=datamart
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_USER=etl
      - DB_POSTGRESDB_PASSWORD=etl_pwd
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      - N8N_BASIC_AUTH_PASSWORD=change_me
    ports:
      - 5678:5678
    depends_on:
      - postgres

Запускаем:

docker compose up -d

4. Настройка потоков данных

4.1 n8n: Спарим Google Sheets

  1. CredentialGoogle Sheets OAuth2:

    • Client ID / Secret из Google Cloud.
    • Redirect URI: https://<n8n_host>/rest/oauth2-credential/callback.
  2. Новая WorkflowTrigger: Cron

    • 0 */2 * * * — каждые 2 ч.
  3. Google Sheets → Read:

    • Spreadsheet ID: 1abcXYZ...
    • Range: 'Finance'!A1:Z
  4. Set node (опционально): нормализуем названия столбцов (snake_case).
Читай также:  ClickHouse (реплика из PostgreSQL) → Superset

4.2 PostgreSQL: Быстрый upsert

Добавим PostgreSQL → Execute Query:

CREATE TABLE IF NOT EXISTS stage.google_finance (
    record_date DATE,
    cost_center  TEXT,
    amount       NUMERIC,
    comment      TEXT,
    PRIMARY KEY (record_date, cost_center)
);

INSERT INTO stage.google_finance AS t
(record_date, cost_center, amount, comment)
VALUES(:={{$json["Date"]}}, :={{$json["Department"]}},
       :={{$json["Amount"]}}, :={{$json["Comment"]}})
ON CONFLICT (record_date, cost_center)
DO UPDATE SET
    amount  = EXCLUDED.amount,
    comment = EXCLUDED.comment;

Лайфхак: в n8n строитель параметров понимает {{$json["Имя столбца"]}}, даже если там кириллица.

4.3 Проверка и логирование

  • IF node после вставки: affectedRows == 0? → Slack / Telegram alert.
  • Логи Postgres пишем в jsonlog, чтобы парсить метрики latency.

4.4 Версионирование схемы

Храните CREATE TABLE в миграциях sqitch или Flyway: это первый шаг к GitOps-данным.


5. Трансформации и моделирование

Даже если данных немного, заведите двухзонную модель:

Зона Схема Что хранит
Stage stage «Как есть» из Sheets, без кастрации
DWH / Mart mart Агрегации, джойны, бизнес-правила

5.1 Простая витрина

CREATE MATERIALIZED VIEW mart.fin_monthly AS
SELECT
    date_trunc('month', record_date)::date            AS month,
    cost_center,
    SUM(amount)                                       AS total_spent
FROM stage.google_finance
GROUP BY 1,2;
CREATE UNIQUE INDEX ON mart.fin_monthly (month, cost_center);

Обновляем REFRESH MATERIALIZED VIEW CONCURRENTLY mart.fin_monthly в той же работе n8n.

5.2 Расширенная модель (если есть Bitrix24)

  1. В n8n добавьте Bitrix24 HTTP-node со списком сделок.
  2. Сохраняйте в stage.bitrix_deals.
  3. Джойните с Google Sheets по cost_center → комбинированный ROI отчёт.

6. Визуализация в Power BI и Superset

6.1 Power BI Desktop

  1. Home → Get Data → PostgreSQL

    • Server: localhost:5432, Database: datamart.
    • DirectQuery если данных < 1 M строк, иначе Import.
  2. Выбираем mart.fin_monthly.
  3. Диаграмма Clustered Column:

    • Axis → month, Series → cost_center, Values → total_spent.
  4. Refresh каждые 2 ч через Scheduled Refresh (нужна лицензия Pro).

Проверка: сравните время последней строки в Postgres (поле max(record_date)) с «Last Refresh» в отчёте.

6.2 Apache Superset (опция)

  1. Sources → Databases → +

    • SQLAlchemy URI: postgresql://etl:etl_pwd@postgres:5432/datamart.
  2. Data → Datasets → + → выберите mart.fin_monthly.
  3. Chart → Line Chart, Time Column → month.
  4. Dashboards → «Google Finance KPI».
  5. В Settings → Alerts & Reports настроить email, если total_spent > порог.
Читай также:  Supabase (PostgreSQL + Edge Functions) → Power BI

7. Мониторинг и автоматизация

Что следим Инструмент Как настроить
n8n Jobs built-in Executions + Prometheus exporter docker-label -e N8N_METRICS=true
Postgres health pgMonitor / Grafana scrape pg_stat_activity, pg_stat_replication
Disk usage node-exporter Алёрт при 80 %
Backup pg_dump + cron 03:00 off-site S3, retention 14 дней
Business KPI Superset Alerts e.g. Δ > 20 % к прошлому месяцу

8. Типичные ошибки и лайфхаки

  1. «Wrong range» в Google Sheets-node — Лист переименовали, а Range остался старым. Решение: храните spreadsheetId и sheetId в Environment Variables.
  2. Лочится таблица при REFRESH MATERIALIZED VIEW — Забудьте WITH DATA, используйте CONCURRENTLY + индекс.
  3. n8n падает из-за OOM — Добавьте EXECUTIONS_DATA_PRUNE=true и PRUNE_MAX_AGE=168 (чистка раз в неделю).
  4. Где-то пропал UTF-8 — Убедитесь, что Postgres client_encoding = 'UTF8' и n8n отправляет application/json; charset=utf-8.
  5. Power BI шифрует пароль, но не даёт обновить — Проверьте включён ли Encrypt в строке подключения, для локалхоста иногда помогает ?sslmode=disable.

9. Заключение

Связка Google Sheets → n8n → PostgreSQL → Power BI даёт SMB-командам «выход в большие данные» без больших счетов. Плюсы:

  • Быстрый старт — развёртывание за вечер.
  • Гибкость — любой источник, где есть API, цепляется дополнительной нодой.
  • Прозрачность — Postgres = SQL, а не замкнутый SaaS.

Минусы:

  • Распределённая ответственность: DevOps, DBA и аналитик могут пинг-понговать при падении.
  • Нет real-time стрима: минимальный лаг = частота Cron.
  • Требует поддержки Docker-кластера (обновления, бэкапы).

Когда scale-up?

  • 5 млн строк в Stage → смотрим в ClickHouse или BigQuery.

  • Нужен streaming → переходим на Debezium + Kafka.
  • Нода n8n стала центром вселенной → разбиваем на микросервисы или берём Airflow.

Полезные ссылки

Ура, теперь ваши цифры обновляются, пока вы пьёте утренний раф. Данные живут в Postgres, а отчёты сияют в Power BI без лишнего кода — разве не мечта аналитика?