Интеграция Google Docs и n8n: документы по шаблону с approval и PDF ¶
Обновлено: 2026-05-30
Импортируйте JSON в n8n, замените credentials, IDs, правила доступа и production-политики под вашу инфраструктуру.
Проблема: AI или CRM могут быстро создать документ, но без шаблона, версионирования и approval команда получает кривые договоры, открытые ссылки и PDF с неправильными реквизитами.
Решение: Google Docs и n8n нужно использовать как управляемый document pipeline: входной контракт, копия шаблона, замена placeholders, review-статус, экспорт PDF и запись ссылки обратно в CRM. Такой подход закрывает не демонстрационный happy path, а реальную production-боль: повторы, права доступа, пустые поля, API-ошибки и ручной контроль там, где автоматизация может навредить.
Проблема: почему простая связка ломает процесс ¶
Интеграция нужна не ради факта подключения сервиса к n8n. Пользователь ищет конкретный ответ: как настроить сценарий так, чтобы данные не дублировались, права не были избыточными, а результат можно было проверить без ручного расследования execution logs.
Для этой страницы основной объект — Google Docs document. Входной контракт должен явно фиксировать template_id, customer_id, placeholders, approver_email, drive_folder_id. Если эти поля приходят нестабильно, автоматизация начинает угадывать, а угадывание в production почти всегда превращается в дубли, потерю данных или лишние уведомления.
Поэтому workflow строится вокруг детерминированных проверок: сначала validation и idempotency, потом запрос к API, потом запись результата и только после этого уведомление человека или downstream-системы.
Архитектура workflow для n8n ¶
| Блок | Задача | Production-проверка |
|---|---|---|
| Webhook / CRM trigger | получает заявку на документ | есть template_id и customer_id |
| Validate fields | проверяет placeholders и обязательные значения | нет пустых реквизитов |
| Copy template | создаёт копию Google Docs в нужной папке | права не наследуются случайно |
| Replace placeholders | заполняет шаблон данными | все {{field}} заменены |
| Approval gate | отправляет ссылку на review | внешняя отправка только после approval |
| Export PDF + update CRM | экспортирует PDF и пишет ссылки обратно | есть doc_id, pdf_file_id, status |
Такой workflow удобно сопровождать: каждая нода отвечает за один слой ответственности, а не смешивает mapping, API-запрос, retry и уведомления в одном Code Node.
Контракт входных данных ¶
{
"template_id": "1TEMPLATE_DOC_ID",
"customer_id": "cust-1042",
"document_type": "commercial_offer",
"title": "Коммерческое предложение Acme",
"approver_email": "manager@example.com",
"drive_folder_id": "1FOLDER_ID",
"fields": {
"client_name": "ООО Акме",
"amount": "129 000 ₽",
"deadline": "2026-06-15",
"manager": "Ирина Петрова"
}
}Payload можно расширять, но нельзя делать обязательные поля “по настроению”. Если источник не передал внешний ID, timezone, владельца или другой ключевой атрибут, workflow должен остановиться с понятной ошибкой до записи во внешний сервис.
Code Node: нормализация, mapping и guard-условия ¶
const src = $json.body ?? $json;
if (!src.template_id) throw new Error('template_id is required');
if (!src.drive_folder_id) throw new Error('drive_folder_id is required');
const fields = src.fields ?? {};
const placeholders = Object.fromEntries(
Object.entries(fields).map(([key, value]) => [`{{${key}}}`, String(value ?? '').trim()])
);
for (const [placeholder, value] of Object.entries(placeholders)) {
if (!value) throw new Error(`Empty value for ${placeholder}`);
}
const documentKey = `docs:${src.document_type}:${src.customer_id}:${src.title}`;
return [{
json: {
action: 'copy_template_replace_placeholders_export_pdf',
idempotency_key: documentKey,
template_id: src.template_id,
drive_folder_id: src.drive_folder_id,
title: String(src.title ?? 'Документ').trim(),
approver_email: src.approver_email,
placeholders,
permissions: { role: 'reader', type: 'user', emailAddress: src.approver_email },
audit: { customer_id: src.customer_id, document_type: src.document_type }
}
}];Этот скрипт n8n не заменяет бизнес-логику внешнего сервиса. Его задача — привести данные к стабильному контракту, сформировать idempotency key и не пропустить опасный payload дальше по цепочке.
Готовый workflow JSON: скачать и импортировать ¶
В архиве страницы есть импортируемый workflow JSON и тестовый payload. После импорта замените credentials, URL, IDs, папки, владельцев, лимиты и правила доступа. Не запускайте сценарий на production-данных, пока не проверены повторы, пустые значения и ошибки API.
{
"name": "Nodbot - Google Docs template document with approval and PDF export",
"nodes": [
{
"name": "Webhook / CRM trigger",
"type": "n8n-node",
"purpose": "получает заявку на документ"
},
{
"name": "Validate fields",
"type": "n8n-node",
"purpose": "проверяет placeholders и обязательные значения"
},
{
"name": "Copy template",
"type": "n8n-node",
"purpose": "создаёт копию Google Docs в нужной папке"
},
{
"name": "Replace placeholders",
"type": "n8n-node",
"purpose": "заполняет шаблон данными"
},
{
"name": "Approval gate",
"type": "n8n-node",
"purpose": "отправляет ссылку на review"
},
{
"name": "Export PDF + update CRM",
"type": "n8n-node",
"purpose": "экспортирует PDF и пишет ссылки обратно"
}
],
"connections": "Webhook / CRM trigger → Validate fields → Copy template → Replace placeholders → Approval gate → Export PDF + update CRM"
}Пошаговая настройка связки ¶
- Создайте master-template в Google Docs и запретите ручное редактирование структуры placeholders.
- Опишите список обязательных полей: клиент, сумма, срок, менеджер, юридические реквизиты.
- В n8n копируйте шаблон в production-папку Google Drive перед заменой переменных.
- Добавьте approval-ветку: документ можно отправлять клиенту только после проверки человеком.
- После approval экспортируйте PDF и сохраняйте doc_id/pdf_file_id в CRM или таблицу документов.
Что проверить после импорта workflow
Откройте каждую ноду, замените credentials и IDs, включите dry-run там, где доступно, затем выполните сценарий на тестовом объекте. Для write-действий добавьте отдельный флаг approval или manual step.
Тесты перед production ¶
Минимальный smoke test:
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/google-docs-template-n8n" -H "Content-Type: application/json" --data @integration-google-docs-n8n-docgen-payload.json- payload без обязательного поля
- placeholder есть в шаблоне, но нет в JSON
- повторный customer_id/title
- approval declined
- ошибка Drive permissions
Отдельно проверьте, что retry n8n не создаёт второй объект во внешнем сервисе. Для критичных действий используйте durable storage: Postgres, CRM custom field, Google Sheet mapping или другой слой с уникальным ключом.
Production-риски ¶
- Шаблон меняют вручную и ломают placeholders.
- Документ расшаривается по ссылке anyone with link.
- AI-черновик уходит клиенту без approval.
- PDF экспортируется до финального review.
- doc_id не записывается в CRM, и повтор создаёт новую копию.
Полезные ссылки и смежные материалы ¶
Внутренняя перелинковка помогает быстро перейти от общего integration-гайда к готовым workflow, а внешние ссылки ведут на официальную документацию API и n8n-нод.
Критерии готовности ¶
- Все placeholders проверяются до создания документа.
- Права доступа минимальны и не открывают документ публично.
- Есть статус draft/review/approved/exported.
- CRM хранит doc_id и pdf_file_id.
- Ошибки Google API и permission denied уходят в alert.