ChatGPT·Google Sheets 자동화 설계: 입력과 결과 열 나누기

시트의 문의를 AI로 요약할 때 먼저 정해야 할 것은 모델 이름보다 어느 입력의 결과를 어느 행에 쓸 것인가입니다. 입력과 결과를 같은 칸에 두거나 행 번호만 기억하면, 정렬·수정·재실행 뒤에 다른 문의의 요약이 들어갈 수 있습니다.

이 글은 Google Sheets에 있는 가상 문의 한 건을 요약하는 열 설계와 데이터 매핑 워크시트입니다. Make·n8n에서 OpenAI API를 연결하기 전 준비 단계이며, 실제 시트 연결·API 호출·쓰기·동시 실행을 검증한 튜토리얼은 아닙니다. 아래 예시 결과는 설명을 위해 작성한 것이며 모델 출력이 아닙니다.

첫 버전은 한 행의 요약까지만

처음 목표는 “대기 상태의 가상 문의 한 건을 읽고, 요약을 별도 열에 기록한 뒤 사람이 확인한다”로 제한합니다. 분류·답장·자동 발송을 동시에 넣으면 오류가 입력, 모델, 쓰기 단계 중 어디서 생겼는지 구분하기 어렵습니다.

ChatGPT에 직접 붙여 넣어 결과를 확인하는 수동 연습과, 자동화 도구가 OpenAI API를 호출하는 연결은 구분하세요. 이 글에서는 계정 연결이나 API 키 발급을 진행하지 않습니다. 사용할 API·연결 기능의 지원 범위와 비용을 실제 설정 전에 별도로 확인해야 합니다.

입력·기계 결과·사람 결정을 다른 열로

아래 이름은 독자가 정해서 쓰는 예시 열 이름이며, 도구에서 자동으로 만들어 주는 기본 필드가 아닙니다. 입력 변경은 원문 관리자가, 결과 쓰기는 자동화가, 승인 결정은 검토자가 맡도록 책임도 구분하세요.

열가상 예시누가 기록하는가·용도
record_idDEMO-001원문 관리자. 정렬해도 유지되는 고유 ID
input_version1원문 관리자. 처리할 내용이 바뀌면 증가
source_text다음 주 교육에 사용할 자료의 목차를 보내 주세요.원문 관리자. 필요한 가상 입력만
processing_statuspending자동화. pending / running / result_ready / input_error / api_error / write_error / stale
result_summary처음에는 비워 둠자동화. 원문을 지우지 않고 별도 저장
result_input_version처음에는 비워 둠자동화. 어느 입력 버전의 결과인지 기록
review_statuswaiting검토자. waiting / approved / needs_changes / rejected
run_id실행별 식별자자동화. 오류 기록과 결과 연결
processed_at실제 처리 시각자동화. 원문 작성 시각과 구별
error_code처음에는 비워 둠자동화. 민감한 원문 대신 짧은 실패 이유

record_id는 같은 사건의 재처리에도 유지합니다. 반면 run_id는 실행마다 달라집니다. 실행별 새 ID를 중복 판정 키로 쓰면 같은 문의인지 알 수 없습니다. 행 번호는 화면상의 위치를 찾는 보조 값으로만 쓰고, 쓰기 직전 대상 행의 record_id가 일치하는지 확인하는 설계가 필요합니다.

processing_status와 review_status를 분리하면 “생성은 끝났지만 아직 승인되지 않음”을 표현할 수 있습니다. AI에게 두 상태를 결정하게 하거나 사람의 수정본을 다시 덮어쓰게 하지 마세요.

모델에 보낼 것과 보내지 않을 것

이번 과제에서 모델이 필요한 것은 요약할 문장과 요약 규칙입니다. 행 전체, 다른 문의, 승인 기록, API 키를 보낼 이유는 없습니다. 결과를 어느 행에 쓸지에 대한 ID와 입력 버전은 자동화 내부의 작업 문맥으로 보존하고, 모델이 다시 적어 준 ID를 그대로 믿어 쓰기 대상을 결정하지 마세요.

구분예시
모델 입력source_text와 “요청·조건만 한 문장으로 요약, 원문에 없는 기한·완료 행동을 만들지 않기” 규칙
자동화 내부에서 유지record_id, 처리 시작 당시 input_version, run_id
제외다른 행, 비밀키, 불필요한 개인 식별 정보, 검토자의 승인 상태

고객 원문은 민감한 정보가 섞일 수 있으므로 첫 연습에는 직접 만든 가상 문장만 쓰세요. API 키는 시트 셀이나 메모에 보관하지 않고 사용 도구의 연결·비밀값 관리 기능으로 다룹니다. 실제 계정 권한과 보관 정책은 연결 전에 확인해야 합니다.

예시 입력과 결과를 연결해 보기

다음은 API 응답 전문이나 실행 설정이 아니라, 필요한 결과 형태를 설명하는 가상 결과입니다.

원문: 다음 주 교육에 사용할 자료의 목차를 보내 주세요.

{
  "summary": "다음 주 교육용 자료의 목차 전달을 요청함",
  "missing_context": false
}

summary는 result_summary에, 자동화가 보존한 입력 버전 1은 result_input_version에 연결합니다. missing_context는 요약에 필요한 정보가 부족하다는 모델의 제안이지 발송 승인이나 정확성 보증이 아닙니다. 결과를 검토 대기로 두는 규칙은 자동화 쪽에서 정합니다.

OpenAI의 Structured Outputs를 지원하는 모델·설정은 JSON Schema에 맞춘 결과 구조를 받는 데 사용할 수 있습니다. 하지만 내용 오류와 거절 응답은 별도 처리가 필요합니다. 공식 구조화 출력 문서 이 글의 JSON 예시를 프롬프트에 적는 것만으로 API의 구조화 출력 설정이 켜지는 것은 아닙니다.

처리 중 원문이 바뀌면 기존 결과를 쓰지 않기

  1. DEMO-001의 input_version=1을 읽고 작업 문맥에 보존합니다.
  2. 요약을 기다리는 동안 원문이 “자료의 전체 파일은 필요 없고 목차만 필요”로 바뀌어 버전이 2가 됩니다.
  3. 결과 쓰기 전에 ID와 현재 버전을 다시 확인합니다.
  4. 버전이 다르면 버전 1의 결과를 현재 결과 열에 확정하지 않고 stale로 분리해 새 입력에 대한 처리를 검토합니다.

이 절차는 오래된 결과를 식별하기 위한 설계입니다. 조회와 쓰기 사이에 또 변경될 수 있으므로, 단순한 여러 모듈 연결만으로 경쟁 상태가 해결되지는 않습니다. 첫 시험에서는 대상 한 건을 수동으로 처리하고 편집을 제한하되, 운영 단계의 동시성 보장을 대신한 것으로 보지 마세요.

“처리 중” 상태는 잠금 장치가 아닙니다

두 실행이 동시에 pending을 읽으면 둘 다 모델을 호출할 수 있습니다. 상태를 running으로 쓰는 것만으로 유일한 실행권을 얻었다고 가정하면 안 됩니다. 저장소의 원자적 처리 또는 별도 작업 큐 등 사용하는 환경에서 실제 지원하는 방식을 확인해야 합니다. 순차 중복 확인을 실제로 시험한 Make Data Store 키 실습도 동시 실행 보장은 별도로 설명합니다.

API 호출은 성공했는데 시트 기록이 실패한 경우에도 무조건 모델부터 다시 호출하지 마세요. 기존 결과를 안전하게 보존했다면 현재 입력 버전과 대조한 뒤 쓰기만 복구할 수 있는지 판단합니다. 성공한 시트 쓰기의 응답만 놓친 경우에는 먼저 현재 결과를 조회해 중복 저장 여부를 확인해야 합니다.

구현 후 확인할 5개 테스트 행

아래는 예상 동작이며 실제 실행 결과는 아직 없습니다. 동일 ID 중복 등 일부 사례는 한 행만으로 재현되지 않으므로 표시한 조건을 함께 준비하세요.

조건예상 동작
정상 원문·유일 ID·pending원문 유지, 결과 별도 기록, review_status=waiting
빈 source_text모델 호출 전 input_error
같은 record_id가 두 행에 있음쓰기 대상 모호로 중단, 임의 첫 행 선택 금지
처리 도중 input_version 변경오래된 결과를 현재 결과로 확정하지 않음
쓰기 실패 후 재시도기존 결과와 현재 버전 확인, 불필요한 재호출·덮어쓰기 방지

먼저 이 표를 바탕으로 입력 열과 결과 열을 수동으로 채워 보세요. 그다음 연결할 도구에서 동일한 시험을 수행하고 실제 입력·출력·오류를 기록해야 구현 검증이 됩니다. 분류 자체의 품질은 가상 문의 평가표, 검토자의 승인 효력은 버전별 승인 설계에서 따로 다룹니다.

2026-09-16 개편. 일반적인 AI 자동화 소개를 행 ID·입력 버전·결과 매핑·실패 복구 워크시트로 바꿨습니다. 실제 Google Sheets 쓰기나 OpenAI API 호출은 수행하지 않았습니다.

플로우워크 HQ에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기