Очистка данных лидов и их нормализация перед записью в Google Sheets
Очистка данных лидов в этом шаблоне рабочего процесса выполняется без моделей: он удаляет пробельные символы по краям полей, приводит адрес электронной почты к единому регистру, проверяет очищенные значения и добавляет строку в Google Sheets. Наблюдавшийся ответ при успешной обработке содержал очищенную запись и серверную отметку времени. В шаблоне нет компонентов ИИ или LLM, и он не вызывает сторонние платные API.
Статус: проверено в рабочей среде 9 октября 2026 года на AI Flowi Workflow 1.9.2 (успешно пройдены 32 из 32 тестов)
Опубликовано · Обновлено . Подготовлено Ai Flowi.
Задача
Получить данные лида в формате JSON через Universal Webhook. JSON Operations с помощью JQ удаляет пробельные символы по краям строк, заменяет последовательности пробельных символов одним пробелом, переводит адрес электронной почты в нижний регистр, удаляет неизвестные поля и добавляет received_at. Verification Router разрешает запись только при корректных значениях очищенных обязательных полей. Append Rows записывает значения как текст, без интерпретации, в режиме RAW. Webhook Response подключён так, чтобы возвращать очищенную запись после завершения добавления строки.
Для кого предназначен шаблон
Для команд, которые получают структурированные обращения с сайта или заявки через контактную форму с лишними пробелами и разным регистром адресов электронной почты. Входные данные уже должны содержать именованные поля; этот шаблон не интерпретирует произвольный текст и не извлекает недостающие значения.
Пример входных данных
Для настройки используйте синтетические данные. Поля name, email и request обязательны и должны содержать текст. Поле phone необязательно. Значение телефона ниже — синтетическая заглушка, а не контактный номер.
{
"name": " Synthetic Lead ",
"email": " LEAD@EXAMPLE.COM ",
"phone": " SYNTHETIC_PHONE ",
"request": " Please\t send details ",
"unknown_field": "discard this"
}
Настройка
- Авторизуйте подключение Google с доступом к закрытой тестовой таблице. Создайте отдельный лист с заголовками в первой строке
name,email,phone,request,received_atименно в этом порядке. - Добавьте Universal Webhook, два узла JSON Operations, Verification Router, Append Rows и два узла Webhook Response. Включите POST, выберите аутентификацию Platform API Key и установите POST Response Mode в значение From Flow. Храните учётные данные отправителя в секрете.
- В обоих узлах JSON Operations выберите JQ Expression и оставьте поля запросов видимыми. Используйте приведённые ниже запросы для очистки и формирования строки и ответа.
- Настройте Append Rows, указав авторизованный Google Account, свой Spreadsheet ID и целевой Range. Для листа с именем Leads используйте
'Leads'!A:E; подставьте фактическое имя своего листа. Установите Value Input Option в значение RAW и отключите Include Object Headers. - Подключите оба входа узла Webhook Response для успешной обработки, как показано ниже. Для успешной обработки задайте 200 OK, а для отклонённых входных данных — 422 Unprocessable Entity; в обоих случаях используйте тип содержимого
application/json. - Отправьте синтетические тестовые запросы на Production Endpoint с заголовком аутентификации платформы и
Content-Type: application/json. Проверьте ответ и все пять ячеек таблицы. Не используйте записи клиентов при тестировании.
Соединения узлов и сопоставление полей
| Выход исходного узла | Вход целевого узла | Назначение |
|---|---|---|
Universal Webhook request_data | JSON Operations для очистки data | Полученный объект запроса; данные лида находятся в .body |
JSON Operations для очистки data_output | Verification Router verification_result | Логический результат проверки и очищенная запись либо ошибки |
Verification Router verified | JSON Operations для строки и ответа data | Принятая запись |
JSON Operations для строки и ответа data_output | Append Rows values | Пять значений ячеек в заданном порядке |
JSON Operations для строки и ответа data_output | Webhook Response для успешной обработки response_definition | Очищенная запись в теле ответа |
Append Rows result | Webhook Response для успешной обработки body_data | Ожидание записи; определение ответа имеет приоритет над результатом Google |
Verification Router rejected | Webhook Response для отклонённых данных body_data | Ошибки проверки без записи в таблицу |
В столбец A записывается очищенное значение name; в B — значение в нижнем регистре email; в C — очищенное значение phone; если поле отсутствует или очищенное значение пусто, ячейка остаётся пустой; в D — очищенное значение request; в E — сформированная отметка времени UTC received_at. Отметка времени формируется один раз и используется и в строке, и в ответе. Отметка времени, переданная отправителем запроса, удаляется.
JQ для очистки и проверки
def clean: if type == "string" then gsub("[[:space:]]+"; " ") | sub("^ +"; "") | sub(" +$"; "") else . end;
def text_ok($max): if type == "string" then length >= 1 and length <= $max else false end;
.body as $b
| if ($b | type) != "object" then
{verified: false, error: "Request body must be a JSON object with name, email and request."}
else
({name: ($b.name | clean), email: ($b.email | clean | if type == "string" then ascii_downcase else . end), request: ($b.request | clean)}
+ (if $b | has("phone") then {phone: ($b.phone | clean)} else {} end)) as $c
| ([
(if $c.name | text_ok(200) then empty else "name must be text between 1 and 200 characters after cleaning" end),
(if $c.email | text_ok(254) then
if $c.email | test("^[^@[:space:]]+@[^@[:space:]]+[.][^@[:space:]]+$") then empty else "email must be a valid address after cleaning" end
else "email must be text between 1 and 254 characters after cleaning" end),
(if $c.request | text_ok(5000) then empty else "request must be text between 1 and 5000 characters after cleaning" end),
(if $c | has("phone") then
if $c.phone | text_ok(64) then empty else "phone must be text between 1 and 64 characters after cleaning when supplied" end
else empty end)
]) as $errors
| if ($errors | length) > 0 then {verified: false, error: "Validation failed", details: $errors}
else {verified: true, record: ($c + {received_at: (now | floor | todateiso8601)})} end
endJQ для строки и определения ответа
{values: [[.record.name, .record.email, (.record.phone // ""), .record.request, .record.received_at]], body: .record, status_code: 200, content_type: "application/json"}Примеры запросов и ответов без конфиденциальных данных
Для приведённых выше входных данных ожидаются показанный ниже ответ с HTTP 200 и одна новая строка. Это пример ожидаемого ответа, а не зафиксированный результат теста. Дата приведена для примера; фактическая отметка времени формируется при обработке запроса.
{
"name": "Synthetic Lead",
"email": "lead@example.com",
"phone": "SYNTHETIC_PHONE",
"request": "Please send details",
"received_at": "2026-10-10T01:00:00Z"
}
Если не передать phone, это поле будет отсутствовать в ответе, а ячейка телефона останется пустой. Для {"name":" ","email":"lead@example.com","request":"Details"} ожидаемое тело ответа HTTP 422 выглядит так:
{
"verified": false,
"error": "Validation failed",
"details": ["name must be text between 1 and 200 characters after cleaning"]
}
Проверка данных и поведение при ошибках
- Проверка выполняется после очистки: name — 1–200 символов, email — 1–254, request — 1–5,000. Адрес электронной почты должен соответствовать базовому формату с точкой в домене и без пробельных символов. Эти проверки не подтверждают существование почтового ящика или право владения им.
- Поле phone необязательно; если оно передано, значение должно быть непустым текстом длиной 1–64 символа. Значения null, числа, объекты и пустые переданные значения отклоняются. Этот шаблон не проверяет, можно ли позвонить по номеру, и не преобразует форматы телефонных номеров.
- Если обязательные поля содержат только пробельные символы, отсутствуют, имеют неверный тип или формат адреса электронной почты некорректен, ожидается ответ 422 без изменений в таблице. Тела запросов в виде массивов, null и скалярных значений также отклоняются.
- Некорректный JSON: при запуске в рабочей среде зафиксирован ответ HTTP 422 с сообщением об ошибке объекта без изменений строк. Тело, похожее на JSON, с типом
text/plainтакже привело к ответу 422 без изменений строк. - Если данные аутентификации платформы отсутствуют или неверны, ожидается ответ 403 до того, как рабочий процесс выполнит запись. Тело этого ответа определяет платформа.
- Ошибка Google Sheets останавливает рабочий процесс. В рассмотренной версии 1.9.2 внутри процесса нет ветки перехвата ошибок; ошибка платформы может содержать Spreadsheet ID и URL Google. Последующий узел ответа не устраняет эту ошибку. Проверьте доступ и удаляйте конфиденциальные данные из ответов об ошибках, прежде чем показывать их конечным пользователям. При превышении времени ожидания результат записи может остаться неизвестным; проверьте таблицу перед повторной попыткой.
Результаты тестирования
Синтетические запросы в рабочей среде 9 октября 2026 года по времени MYT успешно прошли все 32 теста. Контрольное считывание всех данных таблицы зафиксировало 0 строк данных до тестирования и 8 после него. Все ответы совпали с ожидаемыми, а точное сравнение содержимого таблицы подтвердило ожидаемые результаты.
| Тест | Ожидаемый HTTP / изменение числа строк | Фактический HTTP | Строки до → после | Результат |
|---|---|---|---|---|
| T01 корректные данные, без phone | 200 / +1 строка | 200 | 0 → 1 (+1); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T02 удаление пробельных символов по краям, замена их последовательностей одним пробелом, перевод в нижний регистр, phone, удаление неизвестных полей | 200 / +1 строка | 200 | 1 → 2 (+1); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T03 отсутствует email | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T04 числовое значение name | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T05 некорректный JSON | 400 или 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T06 отсутствует ключ | 403 / +0 строк | 403 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T07 неверный ключ | 403 / +0 строк | 403 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T08 name только из пробельных символов | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T09 request только из пробельных символов | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T10 email с пробельными символами внутри | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T11 неверный формат email | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T12 phone со значением null | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T13 числовое значение phone | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T14 пустое значение phone | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T15 вложенная структура request | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T16 тело запроса — массив | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T17 тело запроса — null | 422 / +0 строк | 422 | 2 → 2 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T18 RAW: текст, похожий на формулу | 200 / +1 строка | 200 | 2 → 3 (+1); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T19 name на верхней границе длины | 200 / +1 строка | 200 | 3 → 4 (+1); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T20 name превышает верхнюю границу длины | 422 / +0 строк | 422 | 4 → 4 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T21 request на верхней границе длины | 200 / +1 строка | 200 | 4 → 5 (+1); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T22 request превышает верхнюю границу длины | 422 / +0 строк | 422 | 5 → 5 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T23 дублирующая доставка: первая отправка | 200 / +1 строка | 200 | 5 → 6 (+1); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T24 дублирующая доставка: повторная отправка | 200 / +1 строка | 200 | 6 → 7 (+1); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T25 скалярное тело запроса | 422 / +0 строк | 422 | 7 → 7 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T26 отсутствуют name и request | 422 / +0 строк | 422 | 7 → 7 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T27 числовое значение email | 422 / +0 строк | 422 | 7 → 7 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T28 name со значением null | 422 / +0 строк | 422 | 7 → 7 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T29 пробельные символы Unicode | 200 / +1 строка | 200 | 7 → 8 (+1); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T30 phone превышает верхнюю границу длины | 422 / +0 строк | 422 | 8 → 8 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T31 email превышает верхнюю границу длины | 422 / +0 строк | 422 | 8 → 8 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
| T32 неверный тип содержимого | 422 / +0 строк | 422 | 8 → 8 (+0); точное совпадение содержимого таблицы | ПРОЙДЕН |
Проверка полей ответа: ПРОЙДЕНА во всех 32 тестах. Проверки утечки конфиденциальных значений и необработанных данных Google: в этих тестах до удаления конфиденциальных данных утечки не зафиксированы. Удаление временных данных аутентификации: удалены (HTTP 200). Проверка импортированной копии: не зафиксирована в этих материалах.
Ограничение при повторной доставке: T23 вернул 200 и добавил строку (5 → 6); T24 повторно передал те же данные, вернул 200 и добавил вторую строку (6 → 7). Этот шаблон только добавляет строки и не устраняет дубликаты при доставке.
Скачать
Скачать конфигурацию JQ (JSON)
Этот файл содержит два запроса, порядок столбцов и необходимые настройки. Это набор настроек для описанной выше конфигурации, а не файл импорта рабочего процесса. Файл импорта рабочего процесса без конфиденциальных данных и повторная проверка импорта не представлены в этих материалах. Для этого шаблона не заявлен проверенный файл импорта для скачивания.
Необходимая конфигурация
Вам нужны рабочее пространство AI Flowi Workflow, авторизованное подключение Google Account, доступная таблица, отдельный лист с точными заголовками пяти столбцов, секретные учётные данные отправителя и URL вебхука рабочей среды. Замените имя листа из примера своим. Не включайте сведения о подключении, идентификаторы таблиц и учётные данные в примеры, которыми делитесь. Во время проверки используйте один источник записи, чтобы изменение таблицы можно было связать с одним запросом.
Проверенная версия и дата
Проверенная версия: AI Flowi Workflow 1.9.2. Дата проверки в рабочей среде: 9 октября 2026 года по времени MYT. Эти результаты не подтверждают, что импорт был проверен; данные измерений фактической тарификации запусков узлов также не представлены.
Предположения об использовании и стоимости
Каждый запуск узла расходует 1 Flowi Token. Тарифы: Go от USD8 в месяц при годовой оплате (USD10 помесячно), пять тарифов до Pro 500. Все тарифы указаны на странице тарифов.
Для успешного пути ожидаются шесть запусков узлов: вебхук, очистка, маршрутизатор, формирование строки и ответа, добавление строки и ответ при успешной обработке. При отклонении данных на проверке — четыре. Предполагается, что запрос отклоняется до выполнения графа, если данные аутентификации отсутствуют или неверны либо возникает ошибка строгого разбора JSON. Маршрутизатор учитывается один раз, а неиспользуемая ветка ответа останавливается. Это предположения на основе схемы процесса; фактическое использование узлов не зафиксировано. Для наблюдавшегося случая некорректного JSON с ответом HTTP 422 об ошибке объекта расчёт предусматривает четыре запуска. При ошибке добавления строки в Google до ответа возможны попытки выполнения до пяти узлов; списания за узлы с ошибками не подтверждены.
| Доставки | Предполагаемые запуски узлов / Flowi Tokens | Сравнение с включёнными токенами |
|---|---|---|
| 100 | 600 | Go с помесячной оплатой: USD10; В пределах 5,000 при отсутствии другого использования |
| 1,000 | 6,000 | Plus с помесячной оплатой: USD20; В пределах 10,000 включённых токенов |
| 10,000 | 60,000 | USD170 = 20 + 5 × 30; пять пополнений Plus на 50,000 токенов сверх включённых 10,000 |
При повторной попытке успешный путь выполняется заново, и может быть добавлена ещё одна строка. Списания за узлы с ошибками и учёт расхода токенов для остановленных веток требуют подтверждения. Компоненты ИИ/LLM и сторонние платные API не используются. Требования к доступу Google и квоты сервиса по-прежнему действуют; использование сторонних API и моделей не входит в подписку. По результатам набора тестов с учётом наблюдавшегося случая некорректного JSON с ответом HTTP 422 об ошибке объекта расчёт составляет 8 успешных запросов × 6 + 22 отклонения на проверке × 4 + 2 отклонения аутентификации × 0 = 136 запусков узлов рабочего процесса. Дополнительно учитываются 33 снимка данных, полученных при контрольном считывании: 33 × 1 = 33 запуска, что даёт оценку в 169 Flowi Tokens с учётом контрольного считывания данных. Это оценки на основе схемы процесса, а не фактически измеренное использование.
Изучите тарифы AI Flowi Workflow с учётом числа запусков узлов, повторных попыток и использования внешних API в настроенной вами версии.
Ограничения
В этом шаблоне нет защиты от дубликатов, фильтрации спама, проверки почтовых ящиков или телефонных номеров. Замена последовательностей пробельных символов одним пробелом удаляет переносы строк и отступы. Перевод адреса электронной почты в нижний регистр основан на ASCII; нормализация Unicode и изменение регистра с учётом локали не предусмотрены. Запись в режиме RAW сохраняет в Sheets текст, похожий на формулы; при экспорте в CSV может потребоваться отдельная обработка для безопасного обращения с формулами. T23/T24 подтвердили, что повторная доставка добавляет вторую строку (5 → 6 → 7, оба ответа HTTP 200). В версии 1.9.2 внутри процесса нет ветки обработки ошибок Google; ошибка добавления строки останавливает граф и может раскрыть сведения платформы без фильтрации. Контролируемый сбой Google в этом наборе тестов шаблона не проверялся. Обнаружение таблиц Google, ошибки доступа, параллельное выполнение и частичные сбои остаются эксплуатационными рисками. 32 успешно пройденных теста не подтверждают безопасность параллельного выполнения, восстановление после сбоев, работу импорта или фактический расход, подлежащий оплате.
По теме: Поиск строки в Google Sheets по email.
Следующие шаги
Завершите настройку с закрытой тестовой таблицей, повторите эти тесты в своей конфигурации и проверьте ответы и строки перед использованием реальных лидов. Пример рабочего процесса с зафиксированными результатами приведён в руководстве по передаче данных из вебхука в Google Sheets. Изучите настройку вебхука, настройку подключения Google и каталог компонентов.