Очистка данных лидов и их нормализация перед записью в 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"
}

Настройка

  1. Авторизуйте подключение Google с доступом к закрытой тестовой таблице. Создайте отдельный лист с заголовками в первой строке name,email,phone,request,received_at именно в этом порядке.
  2. Добавьте Universal Webhook, два узла JSON Operations, Verification Router, Append Rows и два узла Webhook Response. Включите POST, выберите аутентификацию Platform API Key и установите POST Response Mode в значение From Flow. Храните учётные данные отправителя в секрете.
  3. В обоих узлах JSON Operations выберите JQ Expression и оставьте поля запросов видимыми. Используйте приведённые ниже запросы для очистки и формирования строки и ответа.
  4. Настройте Append Rows, указав авторизованный Google Account, свой Spreadsheet ID и целевой Range. Для листа с именем Leads используйте 'Leads'!A:E; подставьте фактическое имя своего листа. Установите Value Input Option в значение RAW и отключите Include Object Headers.
  5. Подключите оба входа узла Webhook Response для успешной обработки, как показано ниже. Для успешной обработки задайте 200 OK, а для отклонённых входных данных — 422 Unprocessable Entity; в обоих случаях используйте тип содержимого application/json.
  6. Отправьте синтетические тестовые запросы на Production Endpoint с заголовком аутентификации платформы и Content-Type: application/json. Проверьте ответ и все пять ячеек таблицы. Не используйте записи клиентов при тестировании.

Соединения узлов и сопоставление полей

Семь соединений; названия позволяют различать узлы одного типа
Выход исходного узлаВход целевого узлаНазначение
Universal Webhook request_dataJSON Operations для очистки dataПолученный объект запроса; данные лида находятся в .body
JSON Operations для очистки data_outputVerification Router verification_resultЛогический результат проверки и очищенная запись либо ошибки
Verification Router verifiedJSON Operations для строки и ответа dataПринятая запись
JSON Operations для строки и ответа data_outputAppend Rows valuesПять значений ячеек в заданном порядке
JSON Operations для строки и ответа data_outputWebhook Response для успешной обработки response_definitionОчищенная запись в теле ответа
Append Rows resultWebhook Response для успешной обработки body_dataОжидание записи; определение ответа имеет приоритет над результатом Google
Verification Router rejectedWebhook 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
  end
JQ для строки и определения ответа
{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 после него. Все ответы совпали с ожидаемыми, а точное сравнение содержимого таблицы подтвердило ожидаемые результаты.

32 отдельно зафиксированных теста в рабочей среде
ТестОжидаемый HTTP / изменение числа строкФактический HTTPСтроки до → послеРезультат
T01 корректные данные, без phone200 / +1 строка2000 → 1 (+1); точное совпадение содержимого таблицыПРОЙДЕН
T02 удаление пробельных символов по краям, замена их последовательностей одним пробелом, перевод в нижний регистр, phone, удаление неизвестных полей200 / +1 строка2001 → 2 (+1); точное совпадение содержимого таблицыПРОЙДЕН
T03 отсутствует email422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T04 числовое значение name422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T05 некорректный JSON400 или 422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T06 отсутствует ключ403 / +0 строк4032 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T07 неверный ключ403 / +0 строк4032 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T08 name только из пробельных символов422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T09 request только из пробельных символов422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T10 email с пробельными символами внутри422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T11 неверный формат email422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T12 phone со значением null422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T13 числовое значение phone422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T14 пустое значение phone422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T15 вложенная структура request422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T16 тело запроса — массив422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T17 тело запроса — null422 / +0 строк4222 → 2 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T18 RAW: текст, похожий на формулу200 / +1 строка2002 → 3 (+1); точное совпадение содержимого таблицыПРОЙДЕН
T19 name на верхней границе длины200 / +1 строка2003 → 4 (+1); точное совпадение содержимого таблицыПРОЙДЕН
T20 name превышает верхнюю границу длины422 / +0 строк4224 → 4 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T21 request на верхней границе длины200 / +1 строка2004 → 5 (+1); точное совпадение содержимого таблицыПРОЙДЕН
T22 request превышает верхнюю границу длины422 / +0 строк4225 → 5 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T23 дублирующая доставка: первая отправка200 / +1 строка2005 → 6 (+1); точное совпадение содержимого таблицыПРОЙДЕН
T24 дублирующая доставка: повторная отправка200 / +1 строка2006 → 7 (+1); точное совпадение содержимого таблицыПРОЙДЕН
T25 скалярное тело запроса422 / +0 строк4227 → 7 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T26 отсутствуют name и request422 / +0 строк4227 → 7 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T27 числовое значение email422 / +0 строк4227 → 7 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T28 name со значением null422 / +0 строк4227 → 7 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T29 пробельные символы Unicode200 / +1 строка2007 → 8 (+1); точное совпадение содержимого таблицыПРОЙДЕН
T30 phone превышает верхнюю границу длины422 / +0 строк4228 → 8 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T31 email превышает верхнюю границу длины422 / +0 строк4228 → 8 (+0); точное совпадение содержимого таблицыПРОЙДЕН
T32 неверный тип содержимого422 / +0 строк4228 → 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Сравнение с включёнными токенами
100600Go с помесячной оплатой: USD10; В пределах 5,000 при отсутствии другого использования
1,0006,000Plus с помесячной оплатой: USD20; В пределах 10,000 включённых токенов
10,00060,000USD170 = 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 и каталог компонентов.