구글 시트 GPT 연동: 함수 하나로 자동 요약·분류 (초보용)

수백 줄짜리 설문 응답을 하나하나 읽으며 “긍정/부정”을 손으로 분류하다 보면, 이걸 왜 사람이 하고 있나 싶은 순간이 온다. 구글 시트 GPT 연동을 해두면 그 지겨운 반복을 셀 하나로 넘길 수 있다. B열에 원문을 두고 C열에 =GPT(B2)를 적으면, 요약이든 분류든 번역이든 결과가 바로 채워진다.

여기서 다루는 방식은 유료 확장 프로그램을 설치하는 게 아니다. 구글이 무료로 제공하는 앱스 스크립트에 짧은 코드를 붙여 나만의 커스텀 함수를 만드는 방법이다. 코딩을 해본 적 없어도 복사·붙여넣기 수준이면 충분하다. 대신 API 키 발급과 비용, 보안만 처음에 제대로 잡아두자.

구글 시트 GPT 연동, 준비물부터 확인하자

필요한 건 세 가지다. 구글 계정(구글 시트), OpenAI 계정과 API 키, 그리고 결제 수단. 여기서 초보자가 가장 많이 헷갈리는 지점이 하나 있다. 챗GPT 유료 구독(ChatGPT Plus)과 API 사용료는 완전히 별개의 지갑이다. Plus를 결제하고 있어도 API는 쓴 만큼 따로 과금된다. 반대로 Plus가 없어도 API 키만 있으면 시트에서 함수를 돌릴 수 있다.

API는 사용량 기반이라 요금이 무제한으로 새어 나갈까 겁이 나기 마련인데, OpenAI 대시보드에서 월 사용 한도(usage limit)를 걸어둘 수 있다. 처음에는 몇 달러 수준으로 낮게 잡아두면 실수로 수천 개 셀을 돌려도 한도에서 멈춘다. 이 안전장치부터 켜두고 시작하길 권한다.

API 키 발급하기

  1. OpenAI 플랫폼 사이트(platform.openai.com)에 로그인한다. 챗GPT를 쓰던 계정 그대로 들어가면 된다.
  2. 설정 영역의 API keys 페이지로 이동한다. 계정 개편에 따라 메뉴 위치가 조금씩 다르니 안 보이면 ‘API keys’로 검색하면 빠르다.
  3. Create new secret key를 눌러 키를 만들고, 이름을 알아보기 쉽게(예: sheets-gpt) 적는다.
  4. 생성 직후 딱 한 번만 전체 키가 보인다. sk-로 시작하는 문자열을 복사해 안전한 곳에 임시로 붙여둔다.
  5. Billing 메뉴에서 결제 수단을 등록하고, 사용 한도를 낮게 설정한다.

키는 비밀번호와 같다. 남에게 노출되면 그 사람이 내 돈으로 API를 쓸 수 있으니, 시트 셀이나 채팅에 그대로 붙여넣지 않도록 조심하자. 키를 코드 대신 스크립트 속성에 숨기는 방법은 뒤에서 따로 설명한다.

앱스 스크립트에 GPT 함수 붙이기

이제 시트를 열고 상단 메뉴에서 확장 프로그램 → Apps Script를 클릭한다. 편집기 창이 새 탭으로 뜨는데, 기본으로 들어 있는 function myFunction() {}는 지우고 아래 코드를 통째로 붙여넣는다.

구글 시트 GPT 연동 3단계: API 키 발급, 스크립트, 함수 사용 흐름도
구글 시트 GPT 연동 3단계
function GPT(prompt, instruction) {
  const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  if (!apiKey) return 'API 키를 먼저 설정하세요';

  const sys = instruction || '너는 유능한 업무 보조야. 요청에 간결하게 한국어로 답해.';
  const payload = {
    model: 'gpt-4o-mini',
    messages: [
      { role: 'system', content: sys },
      { role: 'user', content: String(prompt) }
    ],
    temperature: 0.2
  };

  const res = UrlFetchApp.fetch('https://api.openai.com/v1/chat/completions', {
    method: 'post',
    contentType: 'application/json',
    headers: { Authorization: 'Bearer ' + apiKey },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  });

  const data = JSON.parse(res.getContentText());
  if (data.error) return '오류: ' + data.error.message;
  return data.choices[0].message.content.trim();
}

// 최초 1회 권한 승인용. 편집기에서 이 함수를 한 번 실행한다.
function 권한승인() {
  Logger.log(GPT('안녕'));
}

이 예시는 OpenAI의 기존 Chat Completions 방식(/v1/chat/completions)으로 짠 코드다. 지금도 잘 작동하지만, OpenAI는 텍스트 생성에 대해 더 최신인 Responses API(/v1/responses)와 새 모델 계열을 권장하는 쪽으로 안내를 바꿔가고 있다. 그대로 붙여넣어 써도 무방하되, 오래 쓸 코드라면 아래 FAQ의 최신 API 안내를 함께 참고하자.

코드를 보면 키를 PropertiesService에서 꺼내 쓴다. 키를 코드 안에 직접 적지 않고 별도 저장소에 숨겨두는 방식이라, 나중에 스크립트를 남과 공유해도 키가 새지 않는다. 키를 넣는 곳은 편집기 좌측 톱니바퀴 모양의 프로젝트 설정 → 스크립트 속성이다. 속성 추가를 눌러 이름은 OPENAI_API_KEY, 값은 아까 복사해둔 sk- 키를 붙여넣고 저장한다.

여기서 초보자 대부분이 한 번은 막히는 대목이 있다. 셀에 =GPT()를 바로 입력하면 십중팔구 권한 오류부터 뜬다. 커스텀 함수는 셀에서 불릴 때 구글의 권한 승인 창을 띄우지 못하기 때문이다. 그래서 편집기에서 함수를 한 번 직접 실행해 권한을 먼저 승인해줘야 한다. 저장(Ctrl+S 또는 Cmd+S) 후 편집기 상단의 함수 선택 목록에서 권한승인을 고르고 실행(▶) 버튼을 누르면, “이 스크립트가 외부 서비스에 연결하려 한다”는 승인 창이 뜬다. 본인 계정이니 검토 후 허용하면 된다. 이 절차를 한 번 끝내야 시트 셀의 =GPT()가 정상으로 값을 돌려준다.

직접 돌려보니 주의할 점이 두 가지 있었다. 수식을 수백 개 셀에 한꺼번에 채우면 API 요청 속도 제한에 걸려 일부 셀에 오류가 뜬다. 30~50개씩 나눠 채우거나, 결과가 나온 셀은 값으로 붙여넣기(Ctrl+Shift+V) 해서 함수를 없애두는 편이 안전하다. 또 하나, 시트는 셀을 건드릴 때마다 함수를 다시 계산하려 든다. 그때마다 API를 또 호출해 요금이 붙으니 확정된 결과는 반드시 값으로 고정해두자.

요약·분류·번역, 실제 사용 예시

함수 하나로 세 가지 일을 다 시킬 수 있다. 두 번째 인자에 지시문을 넣어 역할만 바꿔주면 그만이다. 아래는 실무에서 바로 쓰는 형태다.

용도 수식 예시 결과
긴 글 요약 =GPT(A2, "한 문장으로 요약해") 핵심만 남긴 한 줄
감정 분류 =GPT(A2, "긍정/부정/중립 중 하나만 답해") 긍정 / 부정 / 중립
카테고리 태깅 =GPT(A2, "배송/품질/가격/기타 중 하나로 분류") 배송
영어 번역 =GPT(A2, "자연스러운 영어로 번역") 번역된 문장

설문 응답이 A열에 쭉 있다고 하자. B2 셀에 =GPT(A2, "긍정/부정/중립 중 하나만 답해")를 넣고 아래로 드래그하면 응답마다 감정 라벨이 붙는다. 지시문에 “하나만 답해”처럼 출력 형식을 못박아 두는 게 요령이다. 그래야 “이 응답은 다소 부정적으로 보입니다” 같은 사족 없이 깔끔한 라벨만 돌아온다.

분류 기준을 여러 개 두고 싶으면 지시문에 후보를 나열하면 된다. 응답 하나에서 카테고리와 감정을 동시에 뽑고 싶을 땐 두 열에 각각 다른 지시문의 함수를 넣어두면 한 번에 정리된다.

구글 폼 응답과 이어붙이기

이 방식이 진짜 힘을 내는 건 구글 폼과 연결했을 때다. 폼 응답이 자동으로 쌓이는 시트에 GPT 함수 열을 미리 만들어두면, 새 응답이 들어올 때마다 요약과 분류가 따라붙는다. 다만 폼이 새 행을 추가하는 위치나 방식에 따라 함수가 자동으로 안 딸려 내려올 때가 있으니, 처음엔 응답 몇 개로 열이 제대로 채워지는지 확인해두면 좋다. 폼과 시트를 연결하는 기본 설정은 별도 글에서 다뤘으니, 아직 안 해봤다면 먼저 그쪽을 참고하자.

비용과 보안, 이것만은 챙기자

비용은 텍스트 양(토큰)에 비례한다. 짧은 설문 응답을 분류하는 정도면 셀 하나당 비용은 아주 작지만, 문서 전체를 요약시키거나 수천 셀을 반복 계산하면 쌓인다. 그래서 앞에서 강조한 두 가지가 핵심이다. OpenAI 대시보드에서 월 한도를 걸어두는 것, 그리고 확정된 결과는 값으로 고정해 재계산을 막는 것.

모델 선택도 비용에 크게 영향을 준다. 예시 코드에서는 가볍고 저렴한 소형 모델을 기본으로 뒀다. 요약·분류·번역 같은 단순 작업은 소형 모델로 충분하고, 훨씬 정교한 추론이 필요할 때만 상위 모델로 바꾸자. 모델 이름과 단가는 OpenAI가 수시로 갱신하니, 코드의 model 값을 바꾸기 전에 공식 가격 페이지를 한 번 확인하는 습관을 들이자.

보안에서 제일 흔한 실수는 API 키를 코드에 그대로 적어두고 시트를 공유하는 것이다. 위 방법처럼 스크립트 속성에 키를 넣으면 이 위험이 사라진다. 여기에 더해, 시트 자체를 “링크가 있는 모든 사용자”로 공개하지 말고 꼭 필요한 사람에게만 열어두는 게 좋다. 키가 유출된 것 같으면 OpenAI 대시보드에서 해당 키를 즉시 폐기하고 새 키를 발급하자.

자주 묻는 질문

챗GPT Plus 구독만 있으면 API 키 없이 쓸 수 있나요?

안 됩니다. 시트에서 함수를 돌리려면 API 키가 반드시 필요하고, API 사용료는 Plus 구독과 별개로 과금됩니다. Plus가 없어도 API 키와 결제 수단만 있으면 함수는 작동합니다.

=GPT() 함수를 넣었는데 오류나 빈 값이 나옵니다.

가장 흔한 원인은 권한 승인을 건너뛴 경우입니다. 앞서 설명한 대로 편집기에서 함수를 한 번 실행해 권한을 승인했는지 먼저 확인하세요. 그다음 스크립트 속성에 OPENAI_API_KEY가 제대로 저장됐는지, 키에 오타나 공백이 섞이지 않았는지 봅니다. 결제 수단이 등록되지 않았거나 사용 한도를 다 쓴 경우에도 오류가 납니다. 셀에 오류 메시지가 그대로 표시되도록 코드를 짰으니, 내용을 보고 원인을 좁히면 됩니다.

셀이 자꾸 다시 계산되면서 요금이 붙지 않을까요?

맞습니다. 시트를 편집할 때마다 함수가 재실행돼 API를 다시 부릅니다. 결과가 확정되면 해당 범위를 복사한 뒤 값으로 붙여넣기(Ctrl+Shift+V)로 함수를 지워두면 불필요한 재호출과 요금을 막을 수 있습니다.

예시 코드가 좀 오래된 방식은 아닌가요?

위 코드는 OpenAI의 Chat Completions 방식(/v1/chat/completions)과 gpt-4o-mini 모델을 씁니다. 지금도 정상 작동하지만, OpenAI는 텍스트 생성에는 더 최신인 Responses API(/v1/responses)와 새 모델 계열을 권장하는 방향으로 안내를 바꿔가고 있습니다. 실제로 도입할 때는 OpenAI 공식 문서에서 현재 권장하는 엔드포인트와 최신 소형 모델 이름을 한 번 확인한 뒤, 코드의 요청 주소와 model 값을 그에 맞춰 두는 편이 안전합니다.

이 방법이 유료 확장 프로그램보다 나은가요?

목적에 따라 다릅니다. 확장 프로그램은 설치만 하면 바로 쓸 수 있지만 구독료가 붙거나 기능이 제한되는 경우가 많습니다. 앱스 스크립트 방식은 초기 설정에 10분쯤 들지만, 지시문을 원하는 대로 바꿀 수 있고 API 실사용료만 내면 돼 장기적으로 유연하고 저렴합니다.

한 번 세팅해두면 이 작은 함수가 반복 업무의 상당 부분을 대신 처리한다. 설문 정리, 리뷰 분류, 초벌 번역처럼 “읽고 판단해서 라벨 붙이기”가 필요한 일이라면 어디든 응용된다. 처음엔 사용 한도를 낮게 걸고 몇 개 셀로 감을 잡은 다음, 익숙해지면 자기 업무에 맞는 지시문으로 다듬어 나가면 된다.

공식 참고: Google Apps Script 공식 문서

관련 글

더 나아가고 싶다면 구글 폼 응답을 시트로 자동 정리하는 방법으로 데이터 수집부터 자동화해두고, 알림이나 후속 처리는 노션 버튼으로 반복 작업 자동화하기와 엮어 나만의 업무 흐름을 완성해보자.

댓글 남기기