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

На манжете пальто болтается красная пуговица. Когда тянешься за ключами, она цепляется за край кармана и напоминает о себе. Она держится на последней нитке и авторитете пальто. В списке появилось дело: пришить её. Позже нитка закреплена, пальто можно надевать, а делу пора поменять статус. Оно осталось тем же самым, хотя теперь отмечено другим словом. Вторую пуговицу по случаю завершения первой мы не заводили.

В таблице эту связь удержит постоянный номер. Для нашей пробы возьмём demo-1. Сначала он придёт со статусом new, затем — с done. Номер помогает узнать дело, слово рядом сообщает, что с ним сейчас. Автоматизация должна узнать прежнюю запись и изменить её, сохранив остальные строки.

Google Sheets в n8n: куда пойдут два события

Соберём три узла: Webhook → Edit Fields → Google Sheets. Первый принимает сообщение, второй достаёт два нужных поля, третий записывает их в лист.

Три узла: Webhook, Edit Fields и Google Sheets с операцией Append or Update Row.

Схема последовательной обработки. request_id остаётся прежним, status меняется с new на done.

Google Sheets в n8n будет получать подготовленные значения двух полей. Для этого пути у вас уже должны быть свой доступный n8n, разрешение создавать workflow, учебный лист Google и готовое подключение к нему в n8n. Подключение в интерфейсе называется credentials — сохранённые данные доступа, через которые программа обращается к вашему листу. Устанавливать сервер и заводить новые ключи в этой статье не будем.

Названия ниже сверены для n8n 2.46.4, Webhook 2.2 и Google Sheets 4.7. В другой версии сравните названия операции и доступные поля. Основной смысл остаётся видимым: взять номер дела, найти такую строку и записать статус.

Подготовьте лист, в котором легко заметить изменение

В своём отдельном учебном листе заполните первую строку двумя заголовками: в A1 — request_id, в B1 — status. Не объединяйте ячейки и не добавляйте над ними название внутри таблицы.

Для проверки соседней записи добавьте строку demo-other / keep. Это контроль: два наших события её касаться не должны. Строки demo-1 перед первой пробой в этом новом листе ещё нет.

request_id status
demo-other keep

Запомните имя документа и вкладки листа. В n8n это два разных выбора: сначала весь документ Google Sheets, потом нужный лист внутри него. Например, документ можно назвать «Проба статусов», вкладку — «Дела».

Номер demo-1 обозначает одно и то же дело на всех этапах. Слово new означает «новое», done — «готово». Мы выбрали эти короткие значения для примера. У них нет специальной магической силы: программа переносит те строки, которые вы передали.

Webhook примет сообщение с двумя полями

В новой схеме добавьте Webhook и выберите метод POST. Настройте ответ When Last Node Finishes, чтобы запрос дожидался последнего узла; в Response Data выберите First Entry JSON. Скопировать адрес и включить тестовое ожидание нужно будет перед отправкой.

Наши сообщения будут обычным JSON, то есть текстом с названными полями. В отдельной папке на компьютере сохраните два файла. Первый назовите event-new.json:

{"request_id":"demo-1","status":"new"}

Второй — event-done.json:

{"request_id":"demo-1","status":"done"}

В Блокноте при сохранении выберите тип «Все файлы» и кодировку UTF-8, чтобы имена не превратились в .json.txt. В этих сообщениях только вымышленные значения, никакие рабочие данные не нужны.

Когда Webhook получает такой запрос с типом application/json, полезные поля находятся внутри body. Поэтому следующий узел сначала извлечёт body.request_id и body.status.

Edit Fields вынесет значения на видное место

Добавьте после Webhook узел Edit Fields. В режиме Manual Mapping задайте два поля типа String — текст:

Имя поля Значение в режиме Expression
request_id {{ $json.body.request_id }}
status {{ $json.body.status }}

Значение вводится именно как выражение. Так узел возьмёт содержимое входного поля, вместо того чтобы записать в таблицу сами фигурные скобки. В имени нового поля пишем request_id, без body..

Edit Fields переносит body.request_id в request_id и body.status в status; сопоставление строки идёт по request_id.

Схема полей. Слева показано место во входном сообщении, справа — имена, с которыми удобно работать следующему узлу.

После первого запуска на выходе Edit Fields проверьте два значения: request_id равен demo-1, status равен new. После второго изменится только статус. Если здесь пустое значение, до записи в лист ещё рано: посмотрите на фактический вход Webhook и путь к полю.

Режимы ручного задания полей и выражений описаны в справке Edit Fields. Для нашего примера достаточно двух текстовых полей; дополнительный код не нужен.

Одна операция Google Sheets и ручное сопоставление

После Edit Fields добавьте Google Sheets. Выберите своё готовое подключение, ресурс Sheet Within Document и операцию Append or Update Row. В Document укажите учебный документ, в Sheet — подготовленный лист.

В режиме сопоставления колонок выберите Map Each Column Manually. Колонкой, по которой ищется совпадение, назначьте request_id. Статус для поиска не подходит: новых дел может быть несколько, а при завершении само слово меняется. Нам нужен признак, который остаётся тем же. Затем вручную задайте значения для обеих колонок:

Колонка листа Значение из Edit Fields
request_id {{ $json.request_id }}
status {{ $json.status }}

Оба значения тоже вводятся в режиме Expression. Не вписывайте в поле статуса постоянное слово new: во втором событии туда должно прийти done.

Операция ищет совпадающую запись и обновляет её; когда совпадения нет, добавляет новую. Такое поведение описано в первичной справке Google Sheets для n8n. Отдельная операция Append Row просто добавляет строки, поэтому для нашей задачи выбираем полное название Append or Update Row.

Если заголовки колонок не появились, проверьте документ, вкладку и первую строку листа. Имена должны точно совпадать с request_id и status, без случайного пробела после слова. Сначала настройте эти два соответствия; остальные возможности узла пока можно оставить в стороне.

Перед отправкой можно позвать помощника

Если выражения или меню ещё непривычны, откройте DeepSeek и опишите свой конкретный шаг:

У меня уже есть свой n8n и учебный лист Google с колонками request_id и status. Собираю Webhook → Edit Fields → Google Sheets. Хочу, чтобы два последовательных события demo-1/new и demo-1/done оставили одну строку со статусом done. Сейчас остановился здесь: [опишите место]. Сначала уточни мою систему и версию. Давай по одному действию: что открыть, куда вставить значение, что должно получиться. Жди моего ответа. Если названия отличаются, сверь официальную справку, когда доступен поиск.

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

Обычный чат не узнаёт сам, появилась ли строка. После действия напишите результат: «В Edit Fields вижу demo-1 и new» или «В поле лежит текст с фигурными скобками». Это разные ситуации, и помощнику будет понятно, какой шаг объяснить дальше.

Отправьте new, дождитесь строки, затем отправьте done

На Windows откройте PowerShell через меню «Пуск». Скопируйте из Проводника полный путь к папке с двумя JSON-файлами и перейдите в неё:

cd 'ПОЛНЫЙ_ПУТЬ_К_ПАПКЕ'

После Enter приглашение PowerShell должно указывать эту папку. Команда dir event-*.json покажет оба подготовленных файла.

В Webhook выберите Test URL, скопируйте адрес и нажмите Listen for test event. Затем выполните в PowerShell строку ниже, заменив <TEST_URL> своим тестовым адресом:

curl.exe -X POST -H 'Content-Type: application/json' --data-binary '@event-new.json' '<TEST_URL>'

Дождитесь завершения схемы и откройте учебный лист. Нужна новая строка demo-1 / new. Контрольная demo-other / keep должна остаться прежней. Заодно посмотрите на выход Edit Fields: там уже должны быть извлечённые значения без вложенного body.

Снова включите Listen for test event, чтобы принять следующую пробу, и отправьте второй файл:

curl.exe -X POST -H 'Content-Type: application/json' --data-binary '@event-done.json' '<TEST_URL>'

Теперь найдите все строки с demo-1. Их должна быть ровно одна, со статусом done. Затем проверьте контрольную запись целиком. Успех нашей строки и сохранность соседней — две отдельные части проверки. Если появились две, проверьте выбранную операцию и колонку сопоставления. Если статус остался new, сравните второе событие, выход Edit Fields и выражение в колонке status.

Ожидаемое состояние после двух последовательных событий: одна строка demo-1 меняет new на done, контрольная demo-other остаётся keep.

Образец для сверки с вашим листом. Это два состояния одной записи, а не две одновременно добавленные строки.

Рабочий адрес проверяется отдельным проходом

После удачной пробы сохраните схему и нажмите Publish. Переключитесь на Production URL и повторите два запроса последовательно с этим адресом: сначала файл event-new.json, после проверки листа — event-done.json.

В листе уже есть наша запись, поэтому первый рабочий запрос изменит её обратно на new, второй вернёт done. Число строк с demo-1 должно остаться равным одному. Контрольную запись снова сравните с исходной.

Выполнения рабочего адреса смотрите во вкладке Executions. Так можно связать конкретный вход со временем выполнения и результатом записи. Один зелёный узел сам по себе не показывает, что вы выбрали нужный лист; окончательный ответ находится в ячейках.

Эта проба проверяет два последовательных события в подготовленном листе с уникальным номером дела. Для одновременно поступающих запросов и других условий понадобится отдельная проверка поведения. В сегодняшнем опыте отправляйте второе событие после завершения первого.

Что сохранить после проверки

Сохраните состояние строки и два входных JSON-файла, чтобы потом воспроизвести пример. В меню workflow выберите Download и отдельно сохраните JSON схемы. Перед передачей экспорта другому человеку уберите рабочие адреса и чувствительные сведения о подключениях, если они попали в файл.

Полезно коротко записать, что вы увидели: после первого события появился demo-1/new; после второго остался один demo-1/done; demo-other/keep не изменился. Эти наблюдения понятнее общего слова «работает».

Если хотите сначала увереннее освоить сам импорт и изменение схем, пригодится разбор примера автоматизации n8n. Когда же собственные события уже проходят, можно выбирать следующее действие над сохранённой записью. Для нового дела назначьте другой постоянный номер. Если каждый раз придумывать новый номер для прежнего дела, строка будет считаться новой; если отдать один номер двум разным делам, потеряется различие между ними.

В клубе «Первопроходцы» можно осваивать ИИ на своих задачах, задавать вопросы и дорабатывать проектные работы с личной проверкой Никиты Малова. Своя среда и внешние услуги в участие не входят. Дополнительно доступна бесплатная практика по ботам.

Несколько вопросов о поиске строки

Почему нельзя искать совпадение по status?

Одинаковый статус бывает у разных дел и меняется по ходу работы. Постоянный request_id нужен, чтобы узнать именно прежнюю запись.

Как заметить, что пострадала соседняя строка?

Сравните demo-other/keep целиком с исходником. Правильный demo-1/done ещё не подтверждает сохранность остальных записей.

Можно отправить оба события одновременно?

Этот пример проверяет последовательную обработку: сначала дождитесь результата new, потом отправьте done. Поведение одновременных запросов требует отдельного разбора.

Пуговица держится, в списке стоит done. Игла вернулась в подушечку, как меч в ножны после маленького подвига. Можно закрыть список дел и открыть рассказ, который ждал своего вечера.