Google Sheets → n8n → PostgreSQL → Power BI: загрузка данных

Google Sheets → n8n → PostgreSQL → Power BI: загрузка данных

Обновлено 2 сентября 2026 года.

Эта связка подходит, когда сотрудники ведут небольшую рабочую таблицу в Google Sheets, а отчёт должен объединять её с другими источниками. n8n читает строки и запускает загрузку, PostgreSQL хранит подготовленные данные, Power BI показывает результат. Ниже — учебная схема для таблицы расходов; сроки внедрения и скорость зависят от объёма, формул, сети и расписания.

Сначала определите ключ строки

Добавьте в таблицу неизменяемый record_id. Номер строки не подходит: сортировка и удаление меняют его. Дата и подразделение также не всегда уникальны — в один день возможны несколько расходов. Для примера нужны поля record_id, record_date, cost_center и amount. Суммы храним в одной согласованной валюте, дату передаём в формате YYYY-MM-DD.

Для небольшого листа начните с полного чтения диапазона. Если позже перейдёте к чтению изменений, отдельно решите, как обнаруживать удаления. Перезапись существующих записей по ключу сама по себе удаления из Google Sheets не переносит.

Настройте загрузку в n8n

  1. Создайте учётные данные Google Sheets и выдайте доступ только к нужному документу. OAuth и сервисная учётная запись — разные способы подключения; выбирайте поддерживаемый вашим узлом.
  2. Соедините Schedule Trigger, Google Sheets, проверку полей и Postgres. Пустые идентификаторы, повторные ключи и нечисловые суммы отправляйте в отдельную ветку ошибок.
  3. Создайте схему и таблицу отдельной миграцией. Учётной записи загрузчика выдайте необходимые права на таблицу и схему, а читателю Power BI — только чтение.
CREATE SCHEMA IF NOT EXISTS stage;
CREATE TABLE stage.google_finance (
  record_id text PRIMARY KEY,
  record_date date NOT NULL,
  cost_center text NOT NULL,
  amount numeric(18,2) NOT NULL,
  loaded_at timestamptz NOT NULL DEFAULT now()
);

В операции Execute Query используйте параметры, а значения передавайте через Query Parameters в том же порядке. Это поддерживаемый механизм узла Postgres; подстановка текста ячейки внутрь SQL не нужна.

INSERT INTO stage.google_finance
  (record_id, record_date, cost_center, amount)
VALUES ($1, $2::date, $3, $4::numeric)
ON CONFLICT (record_id) DO UPDATE SET
  record_date = EXCLUDED.record_date,
  cost_center = EXCLUDED.cost_center,
  amount = EXCLUDED.amount,
  loaded_at = now();

Пример выражения для Query Parameters:

{{ [$json.record_id, $json.record_date, $json.cost_center, $json.amount] }}

Не теряйте изменения и удаления

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

Читай также:  Сквозная аналитика на PostgreSQL: Метрика, Директ и Битрикс24

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

Подключите Power BI и проверьте итог

Создайте SQL-представление с нужными полями и подключитесь через коннектор PostgreSQL. Для небольшого набора разумно начать с Import. После публикации настройте доступ Power BI Service к источнику и расписание обновления; при частной сети понадобится подходящий шлюз. Запуск n8n не обновляет импортированную модель автоматически.

Проверьте четыре случая: новая строка, изменение суммы, повтор запуска и удаление строки. Сравните количество записей и сумму за одинаковый период в Sheets, PostgreSQL и отчёте.

В бюджет включите сервер, резервное копирование и совместный доступ к отчётам. У n8n есть ограничения лицензии; бесплатный Power BI Desktop не означает бесплатную публикацию для любой аудитории. Данные Битрикс24 можно загружать отдельно через BI Data Connector: промежуточная таблица не отменяет ограничения исходного API.