웹훅 Google Sheets 연동: 데이터를 어떻게 보내나요?

웹훅 Google Sheets 연동에는 코드가 필요하지 않습니다. 2026년 10월 8일 프로덕션 환경에서 테스트한, 입력 검증 기능이 있고 모델을 사용하지 않는 워크플로를 사용하세요. Universal Webhook → JSON Operations (JQ) → Verification Router를 거쳐 유효한 입력을 Append Rows와 Webhook Response로 전달합니다. 인증된 유효한 요청은 200을 반환하고 행 하나를 추가했습니다. 유효하지 않은 입력은 422를, API 키가 없거나 유효하지 않은 요청은 403을 반환했으며 행을 추가하지 않았습니다. 비공개 정보를 제거한 워크플로를 가져와 다시 테스트했습니다. 테스트한 워크플로를 다운로드하세요. 아래 권장 설정을 따르세요. 앞서 진행한 10월 1일 편집기 테스트와 모델 기반 대안은 각각 적용 범위가 다릅니다. 2026년 10월 9일에는 중복 방지(event_id) 버전을 프로덕션 환경에서 테스트하고 가져온 후 다시 테스트했습니다.

관련 문서: 웹사이트의 잠재 고객 정보를 Google Sheets에 저장하기 및 AI Flowi Workflow의 Google Sheets 연동.

작성: Ai Flowi · 기술 검토: Janice Lee, Ai Flowi 기술 지원.

게시일 · 수정일

Dify에서 이전하시나요? 노드 대응 관계, 인증 정보, 검증 항목을 확인하며 AI Flowi Workflow에서 웹훅 데이터를 Google Sheets로 보내는 워크플로를 다시 구성하세요.

AI Flowi Workflow와 n8n 비교, AI Flowi Workflow와 Dify 비교, Zapier 대안 가이드 또는 Make에서 이전하기 가이드를 참고하세요.

권장 워크플로: 프로덕션 테스트를 거친 입력 검증(2026년 10월 8일)

이 버전은 AI Flowi Workflow 1.9.2가 실행되는 workflow.aiflowi.com의 AI Flowi 프로덕션 워크스페이스에서 테스트했습니다. 합성 데이터와 승인된 Google 연결을 사용해 프로덕션 웹훅으로 실제 HTTP POST 요청을 보냈습니다. 각 요청 후 앱에서 생성한 테스트 시트의 행 수를 다시 읽어 확인했습니다. 이 결과는 아래 권장 버전에 해당합니다. 앞서 진행한 10월 1일 편집기 테스트는 이전 테스트 섹션에 보존되어 있습니다.

시작하기 전에

  • AI Flowi Workflow 워크스페이스에서 승인된 Google 연결이 필요합니다.
  • name, email, request 열이 이 순서로 있는 Google Sheet와 해당 Spreadsheet ID가 필요합니다. 아래 설정에서는 Sheet1을 사용하세요.
  • POST 요청을 보낼 발신자용 Platform API Key가 필요합니다.

추가할 노드

노드 7개를 추가하세요. 굵게 표시된 이름은 화면에 표시되는 정확한 이름입니다. 설명을 통해 JSON Operations 노드 2개와 응답 노드 2개를 구분할 수 있습니다.

  1. Universal Webhook: HTTP POST 요청을 수신합니다.
  2. JSON Operations: JSON을 검사하고 형태를 바꾸는 쿼리인 JQ로 요청을 검증합니다.
  3. Verification Router: 유효한 입력은 Verified로, 유효하지 않은 입력은 Rejected로 보냅니다.
  4. JSON Operations: Verified 분기에서 행을 준비합니다.
  5. Append Rows: Google Sheets에 행을 기록합니다.
  6. Webhook Response: 행을 기록한 후 200을 반환합니다.
  7. Webhook Response: 거부된 입력에 대해 422를 반환합니다.

포트 연결

아래에 표시된 포트를 사용하세요. 두 번째 열은 워크플로 파일에 있는 정확한 출력 및 입력 필드 이름입니다. 마지막 열은 같은 노드가 여러 개일 때 어느 노드를 사용해야 하는지 알려 줍니다.

연결 6개: Source.output → Target.input
표시 이름과 포트출력 → 입력 필드 이름분기 또는 용도
Universal Webhook.JSON → JSON Operations.JSONrequest_data → data검증 단계로 전달
JSON Operations.JSON → Verification Router.Verification Resultdata_output → verification_result검증 결과 전달
Verification Router.Verified → JSON Operations.JSONverified → data행 준비 단계로 전달
JSON Operations.JSON → Append Rows.Rowsdata_output → values준비된 행 전달
Append Rows.Append Result → Webhook Response.Response Bodyresult → body_data200 응답으로 전달
Verification Router.Rejected → Webhook Response.Response Bodyrejected → body_data422 응답으로 전달

테스트한 버전 설정

  1. Universal Webhook의 HTTP Methods에서 POST를 활성화하고, Authentication을 Platform API Key로, POST Response Mode를 From Flow로 설정하세요.
  2. 첫 번째 JSON Operations에서 JQ Expression을 선택하고 아래 검증 쿼리를 붙여 넣으세요. JQ 필드는 표시된 상태로 유지하세요. 숨겨진 필드에 저장한 쿼리는 실행 시 제외됩니다.
(.body) as $b
| if ($b|type) != "object" then {verified: false, error: "Request body must be a JSON object with name, email and request."}
  else ([ (if ($b.name|type) == "string" and ($b.name|length) > 0 then empty else "name is required and must be text" end),
          (if ($b.email|type) == "string" and ($b.email|test("^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$")) then empty else "email is required and must be a valid address" end),
          (if ($b.request|type) == "string" and ($b.request|length) > 0 then empty else "request is required and must be text" end) ]) as $errs
  | if ($errs|length) > 0 then {verified: false, error: "Validation failed", details: $errs}
    else {verified: true, values: [[ $b.name, $b.email, $b.request ]]} end
  end
  1. 검증 출력을 Verification Router의 Verification Result 입력에 연결하세요. Verified는 두 번째 JSON Operations에, Rejected는 거부된 입력용 Webhook Response에 연결하세요.
  2. 두 번째 JSON Operations에서 JQ Expression을 선택하고 {values: .values}를 입력하세요. 이 필드도 표시된 상태로 유지하세요. JSON 출력을 Append Rows의 Rows 입력에 연결하세요.
  3. Append Rows에서 승인된 Google Account를 선택하고, Spreadsheet ID에 시트의 ID를 설정하세요. Range는 Sheet1!A:C로, Value Input Option은 USER_ENTERED로 설정하세요.
  4. Append Result를 성공 응답용 Webhook Response의 Response Body에 연결하고 HTTP Status를 200 OK로 설정하세요. Rejected에 연결된 응답의 HTTP Status는 422 Unprocessable Entity로 설정하세요.
  5. Platform API Key가 담긴 x-api-key 헤더와 {"name":"Webhook Test","email":"test@example.com","request":"Synthetic test"} 같은 JSON 본문으로 Production Endpoint에 POST 요청을 보내세요. HTTP 응답과 시트를 모두 확인하세요. 유효한 요청은 행 하나를 추가해야 하며, email이 없는 요청은 422를 반환하고 시트를 변경하지 않아야 합니다.

기록된 프로덕션 테스트 결과

2026년 10월 8일 원본 플로의 결과입니다. 행 수에는 이전에 사용한 합성 테스트 행이 포함됩니다.

T1–T8: HTTP 상태 및 시트 행에 미친 영향
테스트HTTP 상태행에 미친 영향
T1: 인증된 유효한 요청2003 → 4; 행 하나 추가
T2: 필수 필드 누락(email)4224 → 4; 변경 없음
T3: 유효하지 않은 필드 유형(name이 숫자)4224 → 4; 변경 없음
T3b: 유효하지 않은 email4224 → 4; 변경 없음
T4: 잘못된 형식의 JSON4224 → 4; 변경 없음
T5: API 키 누락4034 → 4; 변경 없음
T6: 유효하지 않은 API 키4034 → 4; 변경 없음
T7: 존재하지 않는 Spreadsheet ID로 인한 스프레드시트 접근 실패4044 → 4; 테스트 시트 변경 없음
T8a: 첫 번째 중복 전달2004 → 5; 행 하나 추가
T8b: 동일한 두 번째 전달2005 → 6; 행 하나 더 추가

비공개 정보를 제거한 파일을 새 플로로 가져오기도 했습니다. 노드 7개와 연결 6개로 구성됩니다. Google 계정과 Spreadsheet ID를 설정한 후, 가져온 사본은 T1에서 200을 반환했습니다(6 → 7행). T2, T3, T3b, T4에서는 새 행 없이 422를, T5와 T6에서는 새 행 없이 403을 반환했습니다. T8a와 T8b는 모두 200을 반환했습니다(7 → 8 → 9행). 가져온 사본에서는 T7을 반복하지 않았습니다. 이 항목은 원본 설계의 실패 테스트로 확인했습니다.

사용 전 알아야 할 제한 사항

  • 중복 방지: v2 워크플로에서 순차 전달에 대해 사용할 수 있습니다. 2026년 10월 9일, 하나의 event_id로 5건을 동시에 전달했을 때 모두 200을 반환하고 시트에 행 3개를 추가로 기록했습니다(15 → 18; 해당 이벤트의 행 0 → 3). 이 워크플로는 동시 실행에 안전하지 않습니다. 발신자가 순차적으로 전달하도록 하거나 후속 처리 단계에서 중복을 제거하세요. 신뢰성 테스트 결과를 참고하세요. 이 단순한 10월 8일 버전은 여전히 동일한 전달이 있을 때마다 행을 추가합니다.
  • 스프레드시트 오류 처리 문제는 해결되지 않았습니다: Google Sheets 오류(예: 잘못된 Spreadsheet ID)가 발생하면 플로가 중단됩니다. 플랫폼은 Google API URL과 Spreadsheet ID를 포함한 원시 컴포넌트 오류와 함께 HTTP 404(또는 500)를 반환합니다. 버전 1.9.2에는 플로 내부의 오류 분기가 없습니다. 실제 운영에 적용하기 전에 Spreadsheet ID와 공유 설정을 확인하고, 엔드포인트 응답을 최종 사용자에게 그대로 노출하지 마세요.
  • HTTP 응답에 실행 ID가 없습니다: 트랜잭션 로그에는 컴포넌트 실행이 기록되지만, 발신자가 받는 응답에는 실행 ID가 포함되지 않습니다.
  • Verification Router를 사용하세요: 이전 빌드에서는 편집기 자동 저장 시 기존 Condition 라우터의 두 번째 출력 연결이 사라졌습니다. 최종 Verification Router 설계에서는 열기와 자동 저장 후에도 연결 6개가 모두 유지되었습니다.
  • JQ를 표시된 상태로 유지하세요: JQ 필드를 숨기면 JSON Query is required and cannot be blank 오류와 함께 HTTP 500이 발생했습니다. JQ Expression을 선택하고 쿼리 필드를 표시된 상태로 유지하세요.
  • 공유 전에 내보내기 파일을 정리하세요: Download로 파일을 내보내도 Google 계정 세부 정보와 Spreadsheet ID는 제거되지 않습니다. 연결 ID, 웹훅 엔드포인트 URL, 사용자·폴더·플로 ID도 남아 있었습니다. 공유 전에 비공개 값을 제거하세요. 아래 공개 다운로드 파일에서는 비공개 정보를 제거했습니다.
  • External Provider 인증은 테스트하지 않았습니다. 기록된 인증 테스트에는 Platform API Key를 사용했습니다.

비용

요금제: 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회당 1토큰, 타사 API 및 모델 사용 요금은 포함되지 않습니다.

테스트한 워크플로 다운로드

중복 방지 기능이 있는 웹훅 → Google Sheets 워크플로 다운로드(ZIP). v2 ZIP에는 ai-flowi-webhook-to-google-sheets-duplicate-protection.json이 포함되어 있습니다. 2026년 10월 9일 프로덕션 환경에서 테스트하고 가져온 후 다시 테스트했습니다. 중복 방지 설정과 제한 사항을 따르세요.

가져온 후 Google Account를 선택하고, YOUR_SPREADSHEET_ID를 사용 중인 Spreadsheet ID로 바꾸세요. FL209라는 탭을 만들고(다운로드 가능한 워크플로에서 사용하는 탭 이름이며, Upsert Row 노드에서 바꿀 수 있습니다), 첫 번째 행의 헤더를 event_id,name,email,request 순서로 지정하세요. 테스트한 설정에 맞게 웹훅 인증을 Platform API Key로 구성하고 POST를 활성화한 다음, POST Response Mode가 From Flow인지 확인하세요. 실제 데이터를 사용하기 전에 {"event_id":"example-event-001","name":"Webhook Test","email":"test@example.com","request":"Synthetic test"} 같은 합성 요청을 보내고 같은 요청을 반복하세요. 처음에는 200과 {"status":"inserted"}가, 다음에는 200과 {"status":"duplicate"}가 반환되고 추가 행이 생기지 않아야 합니다.

중복 방지 기능이 없는 단순한 버전 다운로드(ZIP). 이 v1 ZIP에는 ai-flowi-webhook-to-google-sheets-validated.json이 포함되어 있습니다. 2026년 10월 8일 프로덕션 환경에서 테스트하고 가져온 후 다시 테스트했습니다. 10월 8일 설정을 따르세요. Google Account를 선택하고, Spreadsheet ID와 Sheet1!A:C 범위 및 name,email,request 열을 설정한 다음 웹훅 인증을 구성하세요. 두 다운로드 파일 모두 테스트했습니다.

중복 방지 추가(2026년 10월 9일 테스트)

발신자가 전달을 재시도할 때는 이 v2 워크플로를 사용하세요. 같은 이벤트를 재시도할 때는 동일한 event_id를 보내고, 새 이벤트에는 다른 식별자를 사용하세요. 2026년 10월 9일 프로덕션 환경에서 테스트했으며, 비공개 정보를 제거한 다운로드 파일을 새 플로로 가져와 다시 테스트했습니다. 중복 방지는 순차 전달에 적용됩니다.

추가할 노드

노드 8개를 추가하세요. 굵게 표시된 이름은 화면에 표시되는 정확한 이름입니다. 설명을 통해 JSON Operations 노드 3개와 응답 노드 2개를 구분할 수 있습니다.

  1. Universal Webhook: Platform API Key 인증과 From Flow 응답 모드로 HTTP POST 요청을 수신합니다.
  2. JSON Operations: 아래 JQ로 name, email, request, event_id를 검증합니다.
  3. Verification Router: 유효한 입력은 Verified로, 유효하지 않은 입력은 Rejected로 보냅니다.
  4. JSON Operations: {values: .values}를 사용해 Verified 분기에서 행을 준비합니다.
  5. Upsert Row: event_id를 키로 사용해 행을 삽입하거나 업데이트합니다.
  6. JSON Operations: 성공 결과에서 inserted 또는 duplicate 상태를 추출해 응답을 구성합니다.
  7. Webhook Response: 기록에 성공한 후 200을 반환합니다.
  8. Webhook Response: 거부된 입력에 대해 422를 반환합니다.

포트 연결

연결 7개: Source.output → Target.input
표시 이름과 포트출력 → 입력 필드 이름분기 또는 용도
Universal Webhook.JSON → JSON Operations.JSONrequest_data → data검증 단계로 전달
JSON Operations.JSON → Verification Router.Verification Resultdata_output → verification_result검증 결과 전달
Verification Router.Verified → JSON Operations.JSONverified → data행 준비 단계로 전달
JSON Operations.JSON → Upsert Row.Row Datadata_output → row_data준비된 행 전달
Upsert Row.Result → JSON Operations.JSONresult → data응답 구성 단계로 전달
JSON Operations.JSON → Webhook Response.Response Bodydata_output → body_data200 응답으로 전달
Verification Router.Rejected → Webhook Response.Response Bodyrejected → body_data422 응답으로 전달

입력 검증 및 시트 기록 설정

검증용 JSON Operations에서 JQ Expression을 선택하고 필드를 표시된 상태로 유지한 다음, 아래 v2 검증 쿼리를 그대로 붙여 넣으세요.

(.body) as $b
| if ($b|type) != "object" then {verified: false, error: "Request body must be a JSON object with name, email and request."}
  else ([ (if ($b.name|type) == "string" and ($b.name|length) > 0 then empty else "name is required and must be text" end),
          (if ($b.email|type) == "string" and ($b.email|test("^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$")) then empty else "email is required and must be a valid address" end),
          (if ($b.request|type) == "string" and ($b.request|length) > 0 then empty else "request is required and must be text" end),
          (if ($b.event_id|type) == "string" then (if ($b.event_id|length) >= 1 and ($b.event_id|length) <= 100 then empty else "event_id is required and must be text between 1 and 100 characters" end) else "event_id is required and must be text between 1 and 100 characters" end) ]) as $errs
  | if ($errs|length) > 0 then {verified: false, error: "Validation failed", details: $errs}
    else {verified: true, values: [[ $b.event_id, $b.name, $b.email, $b.request ]]} end
  end

행 준비용 JSON Operations에서 JQ Expression을 선택하고 {values: .values}를 사용하세요. 필드는 표시된 상태로 유지하세요. Upsert Row에서 Google Account를 선택하고 Spreadsheet ID를 입력하세요. Sheet Name은 FL209로, Header Row는 1로, Key Column은 event_id로 설정하세요. Case Sensitive Key Match를 활성화하고 Value Input Option을 RAW로 설정하세요. 탭의 첫 번째 행에는 event_id,name,email,request가 이 순서로 있어야 합니다.

응답 구성용 JSON Operations에서 JQ Expression을 선택하고 필드를 표시된 상태로 유지한 다음 아래 쿼리를 사용하세요.

{status: (if .action == "inserted" then "inserted" elif .action == "updated" then "duplicate" else error("Unexpected upsert action") end)}

이 변환은 성공 응답에서 Spreadsheet ID, 범위 및 모든 Google 필드를 제거합니다. 성공 응답용 Webhook Response는 200 OK로, 거부 응답은 422 Unprocessable Entity로 설정하고, 두 응답 모두 Content Type을 application/json으로 설정하세요. 스프레드시트 오류는 처리하지 않습니다. 이 오류는 응답 노드가 실행되기 전에 플로를 중단시킵니다. 성공 및 거부 응답을 해석하려면 응답 설정과 함께 HTTP 상태 코드를 확인하세요.

중복 방지 워크플로가 표시된 AI Flowi Workflow 편집기: Universal Webhook, JSON Operations 검증, Verification Router, event_id를 키로 사용하는 Upsert Row, 200 또는 422를 반환하는 Webhook Response 노드
AI Flowi Workflow 편집기에 표시된, 테스트를 거친 중복 방지 워크플로(비공개 식별자는 숨김).

식별자, 적용 범위, 보존 기간 및 동작

event_id 키의 중복 방지 범위
항목값
식별자호출자가 제공하는 body.event_id입니다. 1–100자의 텍스트로, A열(event_id)에 그대로 저장됩니다. 대소문자를 구분하며 앞뒤 공백을 제거하지 않습니다.
적용 범위스프레드시트 하나의 워크시트 하나(FL209)입니다. 다른 시트에 있는 동일한 event_id는 별개로 취급됩니다. 해당 시트에 기록하는 모든 발신자가 키 공간을 공유합니다.
보존 기간해당 event_id가 있는 행이 시트에 존재하는 동안 유지됩니다. 만료 기간과 별도의 수신 로그는 없습니다. 행을 삭제하거나 수정하면 같은 키로 다시 삽입할 수 있습니다.
동작첫 전달: 행을 삽입하고 200 {"status":"inserted"}를 반환합니다. 반복 전달: 같은 행을 업데이트하며(마지막 기록이 적용됨), 새 행은 추가하지 않고 200 {"status":"duplicate"}를 반환합니다.

테스트에서 확인된 동시 실행의 한계: 2026년 10월 9일, 하나의 event_id로 5건을 동시에 전달했을 때 모두 200을 반환하고 시트에 행 3개를 추가로 기록했습니다(15 → 18; 해당 이벤트의 행 0 → 3). 이 워크플로는 동시 실행에 안전하지 않습니다. 발신자가 순차적으로 전달하도록 하거나 후속 처리 단계에서 중복을 제거하세요. Upsert Row는 잠금 없이 읽고 쓰며, 기존 중복 행은 병합하지 않습니다. 프로덕션 테스트 결과를 참고하세요.

기록된 결과: 프로덕션 및 가져온 사본

아래 두 실행은 모두 2026년 10월 9일에 완료했습니다. 행 수에는 각 실행에서 이전에 사용한 합성 테스트 행이 포함됩니다. T7은 여전히 미충족입니다. 오류를 처리해 반환하도록 의도한 502 응답이 반환되지 않았으며, 두 플로 모두 행을 변경하지 않고 원시 404 오류를 반환했습니다.

v2 테스트: 원본 프로덕션 플로 및 가져온 사본
테스트예상 결과원본 v2: HTTP / 행 수가져온 사본: HTTP / 행 수판정
T1 유효한 요청200, +1행200 / 0→1200 / 6→7통과
T2 email 누락422, 행 추가 없음422 / 1→1422 / 7→7통과
T3 name이 숫자422, 행 추가 없음422 / 1→1422 / 7→7통과
T3b 유효하지 않은 email422, 행 추가 없음422 / 1→1422 / 7→7통과
T4 잘못된 형식의 JSON422, 행 추가 없음422 / 1→1422 / 7→7통과
T5 API 키 누락403, 행 추가 없음403 / 1→1403 / 7→7통과
T6 유효하지 않은 API 키403, 행 추가 없음403 / 1→1403 / 7→7통과
T7 잘못된 스프레드시트502, 오류 처리용 응답 본문, 행 추가 없음404 원시 오류 / 1→1404 원시 오류 / 7→7미충족 (행 변경 없음)
T8a/T8b 중복 전달inserted 다음 duplicate, +1 다음 0200,200 / 1→2→2200,200 / 7→8→8통과
T9a/T9b 동일한 event_idinserted 다음 duplicate, 정확히 한 행200,200 / 2→3→3200,200 / 8→9→9통과
T10a/T10b 다른 event_id, 동일한 본문두 행200,200 / 3→4→5200,200 / 9→10→11통과
T11 event_id 누락 / null / 숫자 / 빈 문자열 / 101자422, 행 추가 없음422 ×5 / 5→5422 ×5 / 11→11통과
T12 event_id 100자200, +1행200 / 5→6200 / 11→12통과

버전 1.9.2에서는 스프레드시트 오류 처리 문제가 해결되지 않았습니다. 잘못된 Spreadsheet ID 같은 Google Sheets 오류가 발생하면 플로가 중단됩니다. 플랫폼은 Google API URL과 Spreadsheet ID를 포함한 원시 컴포넌트 오류와 함께 HTTP 404(또는 500)를 반환합니다. 이 버전에는 플로 내부의 오류 분기가 없으며, 후속 Webhook Response도 이 실패를 잡아낼 수 없습니다. 실제 운영에 적용하기 전에 Spreadsheet ID와 공유 설정을 확인하고, 엔드포인트 응답을 최종 사용자에게 그대로 노출하지 마세요. 시트 기록에 실패한 경우에는 재시도 여부를 결정하기 전에 기록 실패 대응 런북 예시를 따르세요.

테스트한 중복 방지 버전 다운로드 및 설정.

이전 편집기 테스트(2026년 10월 1일)

아래 재현 화면은 앞서 진행한 3개 노드 편집기 테스트와 샘플 행 하나를 기록한 것입니다. 현재 워크플로를 구성하려면 10월 8일 프로덕션 테스트를 거친 설정을 따르거나 테스트한 워크플로를 다운로드하세요. 이전 편집기 매핑에서는 필드를 검증하지 않았습니다.

Universal Webhook → JSON Operations (JQ) → Append Rows

편집기 테스트, 2026년 10월 1일 – 프로덕션 실행이 아닙니다

검증된 모델 미사용 경로(2026년 10월 1일 테스트)

  1. Universal Webhook

    POST를 활성화하고 빌더 테스트 본문에 가상 데이터를 입력하세요(테스트 이름은 여기서 가렸습니다).

    {"name":"<test name>","email":"test@example.com","request":"Workflow demo"}

    편집기의 테스트 컨트롤을 사용하세요. 이 테스트에서는 프로덕션 엔드포인트에 HTTP 요청을 보내지 않았습니다.

  2. JSON Operations (JQ)

    웹훅 JSON을 연결하고 JQ Expression을 선택한 다음 아래 쿼리를 사용하세요.

    {values: [[.body.name, .body.email, .body.request]]}

    리스트만 반환하지 말고 이 객체를 반환하세요. 컴포넌트가 리스트 결과를 {"result": ...}로 감싸기 때문에 이 테스트에서는 Append Rows에서 실패했습니다. values가 있는 객체는 감싸지지 않고 그대로 전달됩니다.

  3. Append Rows (Google Sheets)

    JSON Operations 출력을 Rows에 연결하세요. 승인된 Google 연결과 앱에서 생성한 테스트 시트를 선택하고 Spreadsheet ID를 설정하세요. Range에는 Sheet1!A:C 같은 범위를 사용하고 USER_ENTERED를 설정하세요. 편집기에서 실행한 후 시트를 확인하세요.

  4. Sheet1!A1:C1

    기록된 결과(테스트 이름은 여기서 가렸습니다)는 Sheet1!A1:C1의 행 하나였습니다.

    <test name> | test@example.com | Workflow demo
    AI Flowi Workflow 테스트 실행으로 기록된 행 하나가 표시된 Google Sheet: 합성 테스트 이름, test@example.com, Workflow demo
    2026년 10월 1일 편집기 테스트의 실제 출력: 앱에서 생성한 Google Sheet에 기록된 행 하나.

이 테스트로 확인된 범위는 샘플 본문을 사용한 편집기 실행과 앱에서 생성한 시트에 한정됩니다. 플랫폼 API 키를 이용한 프로덕션 엔드포인트 전달, 앱에서 생성하지 않은 시트, 필드 검증은 시험하지 않았습니다. 프로덕션 엔드포인트를 공유하기 전에 웹훅 인증 지침을 따르세요. 예시에 인증 정보와 비공개 페이로드를 넣지 마세요.

모든 재현 단계, 입력, 출력 및 제한 사항의 출처: 검증된 모델 미사용 경로

모델을 사용하지 않은 결과는 모델 기반 구성의 실제 실행 성공을 입증하지 않습니다. 출처: 예상 결과

이 테스트로 확인된 범위는 샘플 본문을 사용한 편집기 실행과 앱에서 생성한 시트에 한정됩니다. 플랫폼 API 키를 이용한 프로덕션 엔드포인트 전달, 앱에서 생성하지 않은 시트, 필드 검증은 시험하지 않았습니다. 프로덕션 엔드포인트를 공유하기 전에 웹훅 인증 지침을 따르세요. 예시에 인증 정보와 비공개 페이로드를 넣지 마세요.

AI Flowi Workflow 테스트 실행으로 기록된 행 하나가 표시된 Google Sheet: 합성 테스트 이름, test@example.com, Workflow demo
2026년 10월 1일 편집기 테스트의 실제 출력: 앱에서 생성한 Google Sheet에 기록된 행 하나.

모델 기반 대안 구성: 사전 준비

수신한 텍스트를 모델이 해석해야 할 때 이 대안을 사용하세요. 10월 8일 프로덕션 테스트는 이 모델 기반 구성을 다루지 않았습니다. 해당 결과는 위의 입력 검증 기능이 있고 모델을 사용하지 않는 워크플로에 적용됩니다.

  • AI Flowi Workflow 편집기 접근 권한과 데이터 크기가 작은 샘플 웹훅 요청을 보낼 발신자가 필요합니다.
  • 설정된 언어 모델과 대상 스프레드시트에 접근할 수 있는 Google 계정 연결이 필요합니다.
  • Spreadsheet ID, 대상 Range, 각 행에 넣을 필드가 필요합니다. 공유하는 예시에 인증 정보와 비공개 페이로드를 넣지 마세요.

모델 기반 구성 단계

  1. Universal Webhook(input_output.UniversalWebhook)을 추가하세요. 권장 웹훅 설정의 POST 및 Platform API Key 설정을 사용하세요. JSON 출력은 수신한 요청 데이터입니다. 아래 모델 기반 분기에 연결하세요.
  2. Type Convert(processing.TypeConverterComponent)를 추가하세요. Universal Webhook.JSON을 Type Convert.Input에 연결하고 Output Type을 Message로 설정하세요.
  3. Structured Output(llm_operations.StructuredOutput)을 추가하세요. Type Convert.Message Output을 Structured Output.Input Message에 연결하세요. 설정된 LanguageModel을 Language Model에 연결하세요.
  4. 시트에 필요한 필드에 맞게 Output Schema와 Format Instructions를 정의하세요. 필수 입력 항목입니다. 다음 연결에는 Structured Output의 JSON 출력을 사용하세요.
  5. Append Rows(google_sheets.GoogleSheetsAppendRows)를 추가하세요. Structured Output.Structured Output(JSON)을 Append Rows.Rows에 연결하세요. 이 입력은 Data 또는 JSON을 받습니다. 권장 Sheets 설정의 Google Account, Spreadsheet ID, Range, Value Input Option 설정을 사용하세요.
  6. 데이터 크기가 작은 샘플 요청을 보내세요. Append Rows를 실행하기 전에 웹훅 JSON, 변환된 Message, 구조화된 JSON을 확인하세요. 그런 다음 대상 시트에서 새 행을 확인하세요.

AI 단계를 사용해야 할 때

수신한 텍스트에서 정보를 추출하거나 텍스트를 분류하는 등 해석이 필요할 때 AI 단계를 사용하세요. 웹훅이 이미 필요한 필드를 제공한다면 입력 검증 기능이 있고 모델을 사용하지 않는 권장 워크플로를 사용하세요. 수신 텍스트에 레이블이 필요하다면 AI 단계를 선택하기 전에 텍스트 분류에 대해 읽어 보세요.

예상 결과

권장 워크플로의 경우, 2026년 10월 8일 프로덕션 테스트와 가져온 사본의 재테스트에서 인증된 유효한 요청(200)은 행 하나를 추가했으며, 유효하지 않은 입력(422)이나 API 키가 없거나 유효하지 않은 요청(403)은 새 행을 추가하지 않았습니다. 2026년 9월 30일에는 스프레드시트 생성은 성공했지만 원시 웹훅 JSON을 Append Rows에 직접 매핑하는 데 실패했습니다. 전체 요청 객체는 행이 아니기 때문입니다. 2026년 10월 1일에는 샘플 웹훅 본문을 사용한 편집기 테스트에서 AI 모델 없이 Universal Webhook → JSON Operations (JQ) → Append Rows를 통해 앱에서 생성한 Google Sheet에 행 하나를 기록했습니다. 이 10월 1일 편집기 테스트는 프로덕션 엔드포인트 전달, 앱에서 생성하지 않은 시트, 필드 검증을 시험하지 않았습니다. 모델 기반 구성은 타입이 지정된 연결을 설명합니다. 실제 행 기록 여부는 여전히 엔드포인트 요청, 모델 출력, 스키마, Google 연결 및 시트 설정에 따라 달라집니다. 이전 편집기 테스트와 10월 8일 모델 미사용 프로덕션 테스트 모두 모델 기반 구성의 실제 실행 성공을 입증하지 않습니다.

관련 자료: 웹훅 필드 매핑 도구: Google Sheets용.

자주 발생하는 오류

  • 웹훅 데이터가 나타나지 않음: 발신자의 요청 메서드와 Universal Webhook에서 복사한 엔드포인트를 확인하세요. 웹훅 트리거를 참고하세요.
  • Structured Output에 필드가 없음: Sheets를 테스트하기 전에 변환된 Message와 필수 스키마 및 지침을 확인하세요.
  • Append Rows 실패: Google 연결, Spreadsheet ID, Range, Rows에 보낸 JSON을 확인하세요. Google 연결 지침과 자주 발생하는 오류를 참고하세요.

웹훅 트리거 · Google 연결 · 워크플로 기초