Обновление статуса строки в 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. Лишние поля запроса отбрасываются при проверке.
Настройка
- Используйте закрытую тестовую таблицу с синтетическими данными и подключение Google с предоставленным доступом.
- Создайте вкладку
YOUR_TAB. Укажите в A1event_id, в B1 —status, а в C1 —noteдля проверки. Добавьте записи до отправки обновления. При обычном использовании храните идентификаторы как обычный текст, заполняйте текстовые ячейки и обеспечьте уникальность идентификаторов. - В Universal Webhook выберите метод POST, аутентификацию Platform API Key и режим ответа From Flow. Храните ключ отправителя в секрете.
- В Search Row задайте Key Column
event_id, Header Row1, включите Case Sensitive Key Match и задайте Sheet NameYOUR_TAB. В Update Range выберитеRAWи отключите Include Object Headers. - Соедините узлы, как показано ниже. Оставьте видимыми выбранную операцию JSON Operations и поля JQ. Настройте вход JSON узла Combine на приём списка. Во время обработки запроса не перемещайте, не сортируйте, не вставляйте и не удаляйте строки листа.
- Повторите описанные проверки на закрытой вкладке. После каждого запроса проверьте ответы и весь лист, прежде чем использовать рабочий процесс с реальными записями.
Соединения узлов и сопоставление полей
Граф содержит 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_data | Validation.data | Прочитать .body; при корректных входных данных выдать только verified, event_id и status. |
Validation.data_output | Valid router.verification_result | Использовать логическое значение verified верхнего уровня. |
Valid router.verified | Search Row.row_data | Найти event_id; этот компонент не выполняет запись. |
Valid router.verified | Combine.data | Сохранить входные status и event_id. |
Search Row.result | Combine.data | Добавить found, key_value и row_number к сохранённым входным данным. |
Combine.data_output | Lookup JSON Operations.data | Требовать логическое значение found; при совпадении подготовить row_number и values:[[status]]. |
Lookup.data_output | Found router.verification_result | verified — результат поиска; при отсутствии строки передаётся определение ответа. |
Found router.verified | Data to Message.data | Шаблон: 'YOUR_TAB'!B{row_number}. |
Data to Message.text | Update Range.range_name | Message передаёт точный диапазон ячейки статуса. |
Found router.verified | Update Range.values | Использовать обёртку values с одним значением статуса. |
Update Range.result | Success JSON Operations.data | Требовать updatedCells == 1; оставить только {status:"updated"}. |
Success.data_output | 200 response.body_data | HTTP 200 application/json. |
Found router.rejected | 404 response.response_definition | {status_code:404,body:{status:"not-found"}}; без записи. |
Valid router.rejected | 422 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-ключа подтверждено.
| Проверка | Результат HTTP | Изменения на листе | Итог |
|---|---|---|---|
| T1 — Корректный запрос для существующей строки | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T2a — Отсутствует status | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T2b — Отсутствует event_id | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T3a — Числовой status | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T3b — Числовой event_id | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T4 — Некорректный JSON | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T5 — Отсутствует API-ключ | 403 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T6 — Неверный API-ключ | 403 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T7 — event_id не найден | 404 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T8a — Повтор идентичного обновления | 200 | 7 -> 7 строк данных. Повторное обновление; значения без изменений. | Успешно |
| T8b — Повторное изменение статуса | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T9a — Несовпадение регистра | 404 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T9b — Несовпадение из-за начального пробела | 404 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T9c — Текстовый идентификатор с начальным нулём | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T10 — Лишнее поле игнорируется | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T11a — status равен null | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T11b — Пустой status | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T11c — status только из пробельных символов | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T11d — event_id равен null | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T11e — Пустой event_id | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T11f — event_id только из пробельных символов | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T12a — status длиной 100 символов | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T12b — status длиной 101 символ | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T12c — Заранее добавленный идентификатор длиной 100 символов | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T12d — Идентификатор длиной 101 символ | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T13a — Массив в теле запроса | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T13b — null в теле запроса | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T13c — Строка в теле запроса | 422 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T14 — Похожий на формулу статус с RAW | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T15 — Пробельные символы сохраняются | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T16 — Дублирующийся ключ: обновляется только первое совпадение | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T17a — Заранее добавленный идентификатор с пробельными символами | 200 | 7 -> 7 строк данных. Обновлена только ячейка статуса первого совпадения; остальные ячейки без изменений. | Успешно |
| T17b — Несовпадение из-за неудалённых пробельных символов | 404 | 7 -> 7 строк данных. Все значения без изменений; запись не выполнялась. | Успешно |
| T18 — Предельная длина статуса в кодовых точках Unicode | 200 | 7 -> 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 запросов |
|---|---|---|---|---|
| Строка обновлена | 11 | 1,100 | 11,000 | 110,000 |
| Строка отсутствует | 8 | 800 | 8,000 | 80,000 |
| Данные отклонены при проверке | 4 | 400 | 4,000 | 40,000 |
| Аутентификация отклонена до запуска графа | Ожидается 0 | Ожидается 0 | Ожидается 0 | Ожидается 0 |
Каждое контрольное чтение добавляет один запуск узла. При повторной доставке рабочий процесс выполняется заново; даже идентичный статус приводит к записи. Неудачные попытки и повторные попытки могут расходовать дополнительные токены. Использование сторонних API и моделей не включено в тариф.
Ограничения
- Поиск и запись выполняются отдельными вызовами. Сортировка, вставка или удаление строк между ними могут привести к тому, что сохранённый номер строки будет указывать на другую строку. Сохраняйте расположение строк неизменным; если нужны одновременные изменения структуры, используйте хранилище данных с поддержкой транзакций.
- Поиск выбирает первую совпавшую строку. Дублирующиеся идентификаторы сохраняются; при обычном использовании идентификаторы должны быть уникальными.
- Одновременные записи статуса могут перезаписывать друг друга. Обнаружение конфликтов и правила переходов между статусами отсутствуют.
- Статус должен оставаться в столбце B. RAW сохраняет похожий на формулу текст статуса буквально; этот текст не выполняется как формула.
- Для сбоев Google не настроен ответ внутри рабочего процесса, очищенный от конфиденциальных данных. Запись может завершиться успешно, даже если ответ потерян; проверьте лист перед повторной попыткой доставки с неопределённым результатом.
- 34 проверки в рабочей среде пройдены успешно; учёт запусков узлов и запуск импортированной копии без конфиденциальных данных остаются непроверенными. Повторное чтение сравнивает значения, а не форматирование листа или права доступа.
Следующие шаги
Повторите каждую проверку в своей закрытой конфигурации и проверьте полное содержимое строк. Проверьте поведение при одновременных изменениях строк и необработанных ошибках Google. Добавьте файл для импорта без конфиденциальных данных после проверки импортированной копии. См. Universal Webhook, настройку подключения Google и распространённые ошибки. Дополнительные сведения о настройке вебхука и подключения Google см. в руководстве по передаче данных из вебхука в Google Sheets.
По теме: Поиск строки в Google Sheets по email.