구글 Sheets + Apps Script로 AI 자동 번역 시트 만들기

매일 아침 쏟아지는 200개의 해외 리뷰, 구글 번역기를 버리고 AI를 택한 이유

글로벌 이커머스 쇼핑몰 마케터로서 매일 아침 가장 먼저 마주하는 일은 북미, 일본, 남미 등에서 온 200개가 넘는 고객 리뷰를 한국어로 옮기는 작업입니다. 처음엔 구글 시트의 =GOOGLETRANSLATE() 함수에 의존해 간편하게 처리했는데, 이게 얼마나 허술한지 깨닫는 데는 그리 오랜 시간이 걸리지 않았습니다. 예를 들어, 영미권 MZ세대가 남긴 “This product is absolute fire!”를 “이 제품은 절대적인 불입니다”라고 번역해버리는 걸 발견했을 때, 도저히 이걸 그대로 팀에 보고할 수 없다는 생각이 들었죠.

기계 번역은 슬랭이나 문맥을 이해하지 못한다는 점에서 한계가 명확했습니다. 그래서 챗GPT를 띄워놓고 엑셀과 브라우저 사이를 계속 왔다 갔다 하면서 수동으로 복사-붙여넣기를 반복했습니다. 이 과정에서 오전 내내 2시간이라는 귀한 시간이 순식간에 사라졌고, 이걸 뭐라고 표현해야 할지 모르겠지만 엄청난 비효율을 체감했습니다. ‘이 AI의 뛰어난 문맥 이해 능력을, 구글 시트 셀 안에서 바로 불러낼 수는 없을까?’라는 질문이 머릿속을 떠나지 않았어요.

비전공자인 제가 구글 앱스 스크립트(Apps Script)를 들여다보면서 난생처음 코딩에 발을 들였습니다. 의외로 15분도 채 안 돼 세팅을 끝냈고, 결과는 상상 이상이었습니다. 매일 2시간씩 허비하던 번역 작업이 한순간에 자동화되었고, 그 덕에 업무 효율이 확실히 달라졌습니다.


목차


1. 나만의 초정밀 번역기 구축을 위한 필수 도구 세팅

이 자동화 프로젝트에서 가장 마음에 드는 부분은 복잡한 프로그램 설치 없이, 웹 브라우저만으로 모든 걸 끝낼 수 있다는 점입니다. 구글 시트라는 캔버스 위에 OpenAI의 AI 기능을 얹는 방식이라, 별도의 환경 구성에 시간을 쏟지 않아도 됩니다.

  • 사용 환경: 크롬(Chrome) 브라우저와 구글 계정 필수
  • 작업 공간: Google Sheets (구글 스프레드시트)
  • 핵심 도구: Google Apps Script (구글 시트 내장 자바스크립트 에디터)
  • 연동 API: OpenAI API Key — 저는 gpt-4o-mini 모델을 썼는데, 속도와 비용 면에서 꽤 만족스러웠습니다. 최소 5달러 이상 충전된 유료 계정이 있어야 하니 이 점 미리 챙겨야 합니다.

2. 실전 가이드: 앱스 스크립트로 AI 번역 함수 만들기 (전체 코드)

구글 시트에서 =AITRANSLATE(A2, "한국어")를 입력하면 바로 챗GPT가 번역 결과를 반환하게 하는 사용자 정의 함수를 만들어보겠습니다. 이 과정에서 제가 느낀 점은, 단순히 코드를 붙여넣는 것보다 API 키 관리에서 신경 쓸 부분이 꽤 많다는 점입니다.

1단계: Apps Script 에디터 실행하기

먼저, 새 구글 스프레드시트를 열고 상단 메뉴에서 [확장 프로그램] – [Apps Script]를 선택하세요. 그러면 별도의 탭으로 에디터 창이 뜹니다. 기본 제공되는 function myFunction() {} 부분은 지워야 하는데, 그냥 둬도 작동은 하지만 깔끔한 관리 차원에서 없애는 편이 좋습니다. 저는 이 부분에서 처음에 헷갈려서 함수가 중복된 적이 있었습니다.

2단계: 챗GPT 연동 자바스크립트 코드 작성

아래 코드를 그대로 복사해 붙여넣으세요. 이 스크립트는 구글 서버에서 OpenAI 서버로 텍스트를 보내 번역 결과를 받아옵니다. 단, API 키를 반드시 본인의 것으로 바꿔야 하며, 키를 공개하면 안 된다는 점을 꼭 명심해야 합니다. 저는 테스트 중에 키를 노출해버려서 급하게 재발급받았던 경험이 있습니다.

/**
ChatGPT를 이용해 텍스트를 문맥에 맞게 완벽히 번역합니다.

@param {string} text 번역할 원본 텍스트 셀

@param {string} target_language 번역할 언어 (예: "한국어", "English", "日本語")

@return 번역된 텍스트

@customfunction
*/
function AITRANSLATE(text, target_language) {
// 빈 셀을 참조할 경우 오류를 방지합니다.
if (!text) return "";

// 1. 발급받은 OpenAI API 키를 여기에 입력하세요. (따옴표 유지)
const API_KEY = "sk-proj-여기에_여러분의_실제_API_키를_붙여넣으세요";
const url = "https://api.openai.com/v1/chat/completions";

// 2. 프롬프트 엔지니어링: AI에게 전문 번역가 역할을 부여합니다.
const payload = {
model: "gpt-4o-mini", // 속도가 가장 빠르고 저렴한 모델
messages: [
{
role: "system",
content: `You are a highly skilled native translator. Translate the following text perfectly into ${target_language}. Capture the nuances, idioms, and slang naturally. ONLY output the translated text, without any additional explanations or quotes.`
},
{
role: "user",
content: String(text)
}
],
temperature: 0.3 // 번역의 일관성을 위해 창의성(온도)을 낮게 설정합니다.
};

const options = {
method: "post",
contentType: "application/json",
headers: {
Authorization: "Bearer " + API_KEY
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};

// 3. API 통신 및 결과값 반환
try {
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());

// 에러 발생 시 원인을 출력합니다.
if (json.error) {
  return "API 에러: " + json.error.message;
}

// 정상 번역된 텍스트의 앞뒤 공백을 제거하고 반환합니다.
return json.choices[0].message.content.trim();
} catch (e) {
return "통신 오류: " + e.toString();
}
}

코드를 붙여넣고 나면 Ctrl + S 또는 Cmd + S로 저장하세요. 저 같은 경우, 저장을 깜빡하고 함수가 작동하지 않아 한참 원인 찾느라 시간을 허비한 적이 있습니다. 그리고 모바일에서는 이 함수 호출 시 메뉴가 꼬이는 현상이 종종 있어서 데스크톱에서 작업하는 게 훨씬 편리했습니다.

3단계: 구글 시트에서 직접 함수 사용해 보기

스프레드시트 화면으로 돌아가 A2 셀에 “This product is absolute fire! I’ll definitely buy it again.”이라는 영어 문장을 입력한 뒤, B2 셀에 =AITRANSLATE(A2, "한국어")를 넣었습니다. 그러자 Loading...이라는 문구가 잠깐 보이다가 2~3초 후에 “이 제품 진짜 대박이에요! 무조건 재구매할 겁니다.”라는 자연스러운 한국어 번역이 나왔습니다. 이 정도 번역 퀄리티면 딱 필요한 문맥과 분위기를 살려줘서, 평범한 직역 번역과는 차원이 다릅니다.

💡 여기서 주의할 점: API 키 유출 방지

Apps Script 코드에 API 키를 직접 박아 넣는 방식은 혼자 쓸 때는 편하지만, 이걸 팀원과 편집자 권한으로 공유하면 문제의 소지가 큽니다. 편집자는 스크립트 편집기 접근권한까지 얻기 때문에 여러분의 API 키를 훤히 들여다볼 수 있습니다. 저는 이 사실을 간과했다가 한참 후에야 위험성을 깨달았습니다. 그래서 공유 시에는 꼭 뷰어 권한만 주거나, 스크립트 속성(Script Properties)을 써서 키를 숨기는 추가 작업을 하는 편입니다. 이 부분을 무시하면 금전적 손해가 발생할 수 있으니 반드시 신경 써야 합니다.

비교 항목 기본 =GOOGLETRANSLATE() 개발한 =AITRANSLATE()
번역 품질 및 문맥 직역 위주 (가끔 뜻이 왜곡됨) 자연스러움 (관용구, 슬랭 완벽 소화)
속도 즉시 (0.1초) API 호출 대기 (약 1.5 ~ 3초 소요)
비용 완전 무료 종량제 과금 (그러나 한 건당 0.1원 미만)

3. 내가 직접 겪은 치명적인 시트 오류 2가지와 완벽 해결법

코드를 작성하고 나면 끝이 아니라, 실제 업무에 투입할 때 예상치 못한 문제들이 튀어나옵니다. 저도 함수가 신기해서 500개 리뷰를 한꺼번에 번역하려고 B열 첫 셀을 더블클릭해 아래까지 자동 채우기를 했는데, 결과는 참담했습니다.

첫 번째 문제는 Error code 429 - Too Many Requests였습니다. 500개의 API 요청이 순간적으로 몰리자 서버가 비정상 트래픽으로 인식해 접속을 차단해 버린 겁니다. 이 때문에 API 호출이 막히면서 #ERROR!가 뜨고 말았습니다. 지금 돌이켜 생각해도 한꺼번에 너무 욕심을 부렸습니다. 이후에는 한 번에 20~30개씩만 수식을 내려서 천천히 요청을 쏘도록 방식을 바꿨습니다. 구글 서버와 OpenAI API 모두 무조건 빠른 게 능사는 아니라는 점을 뼈저리게 느꼈습니다.

두 번째 문제는 Exceeded maximum execution time 타임아웃 오류였습니다. 초기에는 더 좋은 결과를 기대하며 무거운 gpt-4o 모델을 썼는데, 긴 리뷰 텍스트가 들어가면 구글 앱스 스크립트가 30초 이상 걸리는 작업을 강제로 멈췄습니다. 제가 긴 텍스트를 넣을 때마다 오류가 뜨니 업무가 마비되는 건 시간문제였습니다. 이 문제를 해결하려고 코드를 전면 수정해 모델을 가볍고 빠른 gpt-4o-mini로 바꿨는데, 이게 신의 한 수였습니다. 타임아웃 오류가 사라졌고 번역 품질은 크게 떨어지지 않으면서 속도는 3배 이상 빨라졌습니다. 무조건 최신이나 가장 무거운 모델이 답은 아니라는 교훈을 얻었습니다.

4. 자동화 도입 후 뼈저리게 체감한 업무 시간과 퀄리티 변화

사내 드라이브에 AI 번역 시트를 고정한 지 한 달이 지났다. 매일 아침 이 시트 덕분에 업무 방식이 완전히 달라졌다. 원래는 챗GPT 웹사이트에 들어가서 복사-붙여넣기로 리뷰를 번역하다 보니, 2시간씩 잡아먹던 작업이 이제는 구글 시트에서 수식 하나만 드래그하면 끝난다. 정확히 1분 30초 걸려서 업무가 마무리된다.

번역 품질도 눈에 띄게 좋아졌다. 프롬프트에 ‘슬랭을 자연스럽게 살려라’고 명시해 두니, 예를 들어 ‘This is a rip-off(이거 완전 바가지네)’ 같은 현지 은어까지 똑 부러지게 한국어 문맥에 맞춘다. 덕분에 팀원들이 해외 시장 반응을 더 날카롭게 파악할 수 있게 됐다. 다만 모바일 환경에서는 구글 시트가 가끔 메뉴 조작이 꼬여서 번거로운 점이 있었다. 특히 드래그 범위를 넓게 잡으면 일시적으로 렉이 걸려서 번역 진행이 지연된 적이 여러 번 있었다.

가성비 면에서도 놀라움을 감출 수 없다. 한 달간 수천 건 리뷰를 번역했는데, OpenAI의 gpt-4o-mini 모델을 써서 API 요금은 0.8달러(약 1,100원)밖에 나오지 않았다. 인건비로 따지면 몇 천 배 효율적이라고 봐도 과언이 아니다. 다만, API 호출량이 많아지면서 가끔 429 에러가 발생해 작업이 멈춘 적도 있어, 이를 줄이기 위해 한꺼번에 너무 많은 셀을 처리하지 않는 게 필수라는 교훈도 얻었다.

5. 핵심 3줄 요약 및 이런 분들께 강력히 추천합니다

이번에 완성한 구글 시트 AI 번역기의 핵심을 세 문장으로 정리해본다.

  1. 앱스 스크립트의 UrlFetchApp 기능을 이용하면 구글 시트 안에서 ChatGPT를 함수처럼 바로 호출할 수 있다.
  2. 구글 시트의 30초 실행 제한 때문에, 응답 속도가 빠른 gpt-4o-mini 모델을 쓰는 게 반드시 필요하다.
  3. API Rate Limit(429 에러)을 피하려면 수백 개 셀을 한 번에 드래그하지 말고 20~30개 단위로 나눠서 적용해야 한다.

이 방법은 해외 고객 피드백을 매일 확인해야 하는 이커머스 CS 담당자, 대량 다국어 제품 상세페이지를 다루는 글로벌 마케터, 해외 원서나 기사를 엑셀로 정리하는 대학원생들에게 특히 적합하다. 단 15분 투자한 코드 세팅이 반복되는 단순 번역 작업의 시간을 확실히 줄여준다. 다만, 회사나 기관의 극비 문서를 번역할 때는 API 전송 과정에서 외부 서버를 경유하니 사내 보안 정책을 반드시 꼼꼼히 확인해야 한다.

{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "구글 시트의 기본 함수인 =GOOGLETRANSLATE()와 무엇이 다른가요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "구글의 기본 번역 함수는 문장을 단어 단위로 직역하는 경향이 강해 은어나 관용구를 오역하는 경우가 많습니다. 반면 AI 번역 함수(=AITRANSLATE)는 ChatGPT의 문맥 파악 능력을 사용하여 원어민이 말하는 것 같은 자연스러운 의역과 뉘앙스 처리가 가능합니다."
}
}, {
"@type": "Question",
"name": "커스텀 함수를 쓸 때 'Loading...' 또는 '로딩 중...' 상태에서 멈춰버립니다.",
"acceptedAnswer": {
"@type": "Answer",
"text": "구글 시트의 사용자 정의 함수는 실행 제한 시간이 최대 30초입니다. OpenAI 서버 응답이 지연되거나 텍스트가 너무 길어서 30초를 넘기면 에러가 발생하며 멈춥니다. 코드 내의 모델을 gpt-4o-mini로 변경하여 속도를 높이거나, 텍스트 분량을 나눠서 진행해야 합니다."
}
}, {
"@type": "Question",
"name": "번역 말고 요약이나 키워드 추출용으로도 쓸 수 있나요?",
"acceptedAnswer": {
"@type": "Answer",
"text": "물론입니다! 코드의 2단계에 있는 'role: system'의 content 부분(프롬프트)을 '주어진 텍스트를 3줄로 요약해' 또는 '이 문장에서 핵심 해시태그 3개만 뽑아줘'로 변경하고 함수 이름을 =AISUMMARY 등으로 바꾸면 완전히 새로운 AI 자동화 시트가 완성됩니다."
}
}]
}