Обновление статуса строки в Google Sheets

Обновление статуса строки в Google Sheets: получите идентификатор события и статус через вебхук, проверьте входные данные, найдите существующую строку Google Sheets и запишите статус в ячейку статуса этой строки. Если идентификатор не найден, ответ отправляется по отдельной ветке без записи. Этот шаблон не использует модель ИИ.

Статус: проверено в рабочей среде 9 октября 2026 на AI Flowi Workflow 1.9.2 (успешно пройдены 34 из 34 проверок)

Автор: Ai Flowi · Опубликовано . Обновлено 9 октября 2026. Дата проверки в рабочей среде: 9 октября 2026 (MYT).

Задача

Примите HTTP POST с аутентификацией и телом {event_id,status}. Найдите точное совпадение с учётом регистра для event_id в существующей строке. В ходе проверок возвращался HTTP 200 с {"status":"updated"} после записи её статуса, а при отсутствии строки — HTTP 404 с {"status":"not-found"}. Ветка для отсутствующей строки не содержит компонента записи.

Для кого предназначен сценарий

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

Пример входных данных

{"event_id":"demo-event-001","status":"complete"}

Оба поля должны быть строками длиной от 1 до 100 кодовых точек Unicode и содержать хотя бы один непробельный символ. Пробельные символы сохраняются. Идентификаторы чувствительны к регистру: 001 отличается от 1. Лишние поля запроса отбрасываются при проверке.

Настройка

  1. Используйте закрытую тестовую таблицу с синтетическими данными и подключение Google с предоставленным доступом.
  2. Создайте вкладку YOUR_TAB. Укажите в A1 event_id, в B1 — status, а в C1 — note для проверки. Добавьте записи до отправки обновления. При обычном использовании храните идентификаторы как обычный текст, заполняйте текстовые ячейки и обеспечьте уникальность идентификаторов.
  3. В Universal Webhook выберите метод POST, аутентификацию Platform API Key и режим ответа From Flow. Храните ключ отправителя в секрете.
  4. В Search Row задайте Key Column event_id, Header Row 1, включите Case Sensitive Key Match и задайте Sheet Name YOUR_TAB. В Update Range выберите RAW и отключите Include Object Headers.
  5. Соедините узлы, как показано ниже. Оставьте видимыми выбранную операцию JSON Operations и поля JQ. Настройте вход JSON узла Combine на приём списка. Во время обработки запроса не перемещайте, не сортируйте, не вставляйте и не удаляйте строки листа.
  6. Повторите описанные проверки на закрытой вкладке. После каждого запроса проверьте ответы и весь лист, прежде чем использовать рабочий процесс с реальными записями.

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

Граф содержит 13 узлов: Universal Webhook; JSON Operations для проверки данных; Verification Router для корректных входных данных; Search Row; JSON Operations с Combine; JSON Operations для оценки результата поиска; Verification Router для найденных строк; Data to Message; Update Range; JSON Operations для успешного результата; и три узла Webhook Response для ответов 200, 404 и 422.

Источник.выход → Приёмник.вход
Выход источникаВход приёмникаСопоставление
Universal Webhook.request_dataValidation.dataПрочитать .body; при корректных входных данных выдать только verified, event_id и status.
Validation.data_outputValid router.verification_resultИспользовать логическое значение verified верхнего уровня.
Valid router.verifiedSearch Row.row_dataНайти event_id; этот компонент не выполняет запись.
Valid router.verifiedCombine.dataСохранить входные status и event_id.
Search Row.resultCombine.dataДобавить found, key_value и row_number к сохранённым входным данным.
Combine.data_outputLookup JSON Operations.dataТребовать логическое значение found; при совпадении подготовить row_number и values:[[status]].
Lookup.data_outputFound router.verification_resultverified — результат поиска; при отсутствии строки передаётся определение ответа.
Found router.verifiedData to Message.dataШаблон: 'YOUR_TAB'!B{row_number}.
Data to Message.textUpdate Range.range_nameMessage передаёт точный диапазон ячейки статуса.
Found router.verifiedUpdate Range.valuesИспользовать обёртку values с одним значением статуса.
Update Range.resultSuccess JSON Operations.dataТребовать updatedCells == 1; оставить только {status:"updated"}.
Success.data_output200 response.body_dataHTTP 200 application/json.
Found router.rejected404 response.response_definition{status_code:404,body:{status:"not-found"}}; без записи.
Valid router.rejected422 response.body_dataВернуть ошибку проверки данных; без поиска и записи.

Узел Combine получает два объекта JSON с разными именами полей. Преобразование результата поиска проверяет номер строки и ключ найденного совпадения перед выбором ветки. Поиск использует заголовок event_id; запись использует столбец статуса B. Если вы измените порядок столбцов, обновите и шаблон диапазона. Update Range изменяет одну ячейку, сохраняя идентификатор события, примечания и другие ячейки вне этого диапазона без изменений.

Настройки JSON Operations

Для проверки данных, поиска и успешного результата выберите JQ Expression. Выберите Combine только в узле Combine с двумя входами. Оставьте выбранные поля видимыми.

По теме: Запись строки статуса по расписанию в Google Sheets.

Запрос для проверки данных

def valid_text: if type == "string" then length >= 1 and length <= 100 and test("\\S") else false end;
.body as $b | if ($b|type) != "object" then
{verified:false,error:"Request body must be a JSON object with event_id and status."}
else [ (if ($b.event_id|valid_text) then empty else "event_id must be non-blank text between 1 and 100 characters" end),
       (if ($b.status|valid_text) then empty else "status must be non-blank text between 1 and 100 characters" end) ] as $errors
| if ($errors|length) > 0 then {verified:false,error:"Validation failed",details:$errors}
else {verified:true,event_id:$b.event_id,status:$b.status} end end

Запрос для поиска

if (.found|type) != "boolean" then error("Unexpected search result")
elif .found == false then {verified:false,status_code:404,body:{status:"not-found"}}
elif (.row_number|type) != "number" then error("Invalid matched row")
elif .row_number < 2 or (.row_number|floor) != .row_number or .key_value != .event_id then error("Invalid matched row")
else {verified:true,row_number:.row_number,values:[[.status]]} end

Запрос для успешного результата

if .updatedCells == 1 then {status:"updated"} else error("Unexpected update result") end

Примеры запросов и ответов без конфиденциальных данных

Эти примеры ответов соответствовали проверкам с синтетическими данными в рабочей среде.

POST <production-webhook-url>
Content-Type: application/json
x-api-key: <private-platform-api-key>

{"event_id":"demo-event-001","status":"complete"}

Ожидаемый ответ: HTTP 200
{"status":"updated"}
{"event_id":"demo-event-absent","status":"complete"}

Ожидаемый ответ: HTTP 404; лист без изменений
{"status":"not-found"}
{"event_id":"demo-event-001"}

Ожидаемый ответ: HTTP 422; лист без изменений
{"verified":false,"error":"Validation failed","details":["status must be non-blank text between 1 and 100 characters"]}

Проверка данных и поведение при сбоях

В проверках в рабочей среде отсутствующие поля, значения null, неверные типы, пустые строки, строки только из пробельных символов и строки длиннее 100 кодовых точек Unicode приводили к ответу 422 до поиска или записи. Тела запросов, не являющиеся объектами, и некорректный JSON в этих проверках приводили к ответу 422 с {"verified":false,"error":"Request body must be a JSON object with event_id and status."}. Отсутствующий или неверный ключ платформы приводил к ответу 403; точное тело ответа при ошибке аутентификации определяется платформой.

Только успешный результат Search Row с found:false приводит к ответу not-found. Ошибки доступа к Google прерывают рабочий процесс и могут привести к выводу необработанного сообщения об ошибке платформы. Ни один настроенный компонент не перехватывает эти исключения. Неожиданная структура результата поиска или результат обновления, отличный от одной обновлённой ячейки, вызывают ошибку вместо сообщения об успешном обновлении.

Результаты проверок

Все 34 HTTP-проверки в рабочей среде пройдены успешно с повторным чтением всей вкладки. На протяжении проверок лист содержал семь строк данных. При успешном обновлении менялась только ячейка статуса первого совпадения; если поиск не находил строку или входные данные отклонялись, все значения оставались без изменений. Повторный идентичный запрос не менял значения. Удаление временного API-ключа подтверждено.

Результаты в рабочей среде — 9 октября 2026 MYT
ПроверкаРезультат HTTPИзменения на листеИтог
T1 — Корректный запрос для существующей строки2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T2a — Отсутствует status4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T2b — Отсутствует event_id4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T3a — Числовой status4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T3b — Числовой event_id4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T4 — Некорректный JSON4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T5 — Отсутствует API-ключ4037 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T6 — Неверный API-ключ4037 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T7 — event_id не найден4047 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T8a — Повтор идентичного обновления2007 -> 7 строк данных. Повторное обновление; значения без изменений.Успешно
T8b — Повторное изменение статуса2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T9a — Несовпадение регистра4047 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T9b — Несовпадение из-за начального пробела4047 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T9c — Текстовый идентификатор с начальным нулём2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T10 — Лишнее поле игнорируется2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T11a — status равен null4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T11b — Пустой status4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T11c — status только из пробельных символов4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T11d — event_id равен null4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T11e — Пустой event_id4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T11f — event_id только из пробельных символов4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T12a — status длиной 100 символов2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T12b — status длиной 101 символ4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T12c — Заранее добавленный идентификатор длиной 100 символов2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T12d — Идентификатор длиной 101 символ4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T13a — Массив в теле запроса4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T13b — null в теле запроса4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T13c — Строка в теле запроса4227 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T14 — Похожий на формулу статус с RAW2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T15 — Пробельные символы сохраняются2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T16 — Дублирующийся ключ: обновляется только первое совпадение2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T17a — Заранее добавленный идентификатор с пробельными символами2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно
T17b — Несовпадение из-за неудалённых пробельных символов4047 -> 7 строк данных. Все значения без изменений; запись не выполнялась.Успешно
T18 — Предельная длина статуса в кодовых точках Unicode2007 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений.Успешно

Проверенная версия платформы: AI Flowi Workflow 1.9.2. Дата проверки: 9 октября 2026 (MYT). Наблюдаемое число запусков узлов для каждой ветки: Не измерялось. Импорт и повторная проверка: по данным предоставленных материалов, не выполнялись.

Скачать

Файл для импорта рабочего процесса: Недоступен; проверка импортированной копии не проводилась. Добавляйте общедоступный файл для импорта только после экспорта без конфиденциальных данных и проверки импортированной копии. Настройки узлов описаны выше.

Необходимые настройки

  • Ваше подключение Google с предоставленным доступом и Spreadsheet ID в обоих компонентах Sheets.
  • Вкладка YOUR_TAB, заголовок event_id в строке 1 и статус в столбце B.
  • Заранее созданные текстовые идентификаторы и неизменное расположение строк во время выполнения.
  • URL вебхука рабочей среды и Platform API Key на стороне отправителя.
  • Настройка Combine с двумя входами, выбор ветки по результату поиска и отдельные ответы 200, 404 и 422.

Проверенная версия и дата

Проверенная версия: AI Flowi Workflow 1.9.2. Дата проверки: 9 октября 2026 (MYT). Предоставленные подтверждающие материалы охватывают этот граф в рабочей среде и синтетические тестовые данные; они не подтверждают результаты для импортированной копии.

Допущения по использованию и стоимости

Тарифы: Go от USD8 в месяц при годовой оплате (USD10 помесячно), Plus от USD16 (USD20 помесячно), Pro 100 от USD80 (USD100 помесячно), Pro 200 от USD160 (USD200 помесячно) и Pro 500 от USD400 (USD500 помесячно), от 5,000 до 250,000 Flowi Tokens в месяц с возможностью пополнения; 1 токен за каждый запуск узла; использование сторонних API и моделей не включено.

В этой схеме нет компонентов ИИ или LLM и платных сторонних API. Необходимы аккаунт Google и доступ к листу; действуют квоты сервиса. Следующие оценки предполагают один запуск каждого узла, через который проходит запрос, одну выбранную ветку маршрутизатора, отсутствие повторных попыток и отдельного процесса проверки повторным чтением. Учёт расхода в рабочей среде ещё предстоит выполнить.

Оценки по схеме, а не фактические списания
ВеткаУзлов на запрос100 запросов1,000 запросов10,000 запросов
Строка обновлена111,10011,000110,000
Строка отсутствует88008,00080,000
Данные отклонены при проверке44004,00040,000
Аутентификация отклонена до запуска графаОжидается 0Ожидается 0Ожидается 0Ожидается 0

Каждое контрольное чтение добавляет один запуск узла. При повторной доставке рабочий процесс выполняется заново; даже идентичный статус приводит к записи. Неудачные попытки и повторные попытки могут расходовать дополнительные токены. Использование сторонних API и моделей не включено в тариф.

Ограничения

  • Поиск и запись выполняются отдельными вызовами. Сортировка, вставка или удаление строк между ними могут привести к тому, что сохранённый номер строки будет указывать на другую строку. Сохраняйте расположение строк неизменным; если нужны одновременные изменения структуры, используйте хранилище данных с поддержкой транзакций.
  • Поиск выбирает первую совпавшую строку. Дублирующиеся идентификаторы сохраняются; при обычном использовании идентификаторы должны быть уникальными.
  • Одновременные записи статуса могут перезаписывать друг друга. Обнаружение конфликтов и правила переходов между статусами отсутствуют.
  • Статус должен оставаться в столбце B. RAW сохраняет похожий на формулу текст статуса буквально; этот текст не выполняется как формула.
  • Для сбоев Google не настроен ответ внутри рабочего процесса, очищенный от конфиденциальных данных. Запись может завершиться успешно, даже если ответ потерян; проверьте лист перед повторной попыткой доставки с неопределённым результатом.
  • 34 проверки в рабочей среде пройдены успешно; учёт запусков узлов и запуск импортированной копии без конфиденциальных данных остаются непроверенными. Повторное чтение сравнивает значения, а не форматирование листа или права доступа.

Следующие шаги

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

По теме: Поиск строки в Google Sheets по email.