본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 26. 09:41

GAS × Gemini API로 매일 아침 이메일을 자동으로 3줄 요약하기

요약

Google Apps Script(GAS)와 Gemini API를 활용하여 매일 아침 읽지 않은 이메일을 3줄로 요약해 보내주는 자동화 시스템 구축 방법을 소개합니다. 별도의 서버 설치 없이 브라우저만으로 구현 가능한 효율적인 워크플로우를 다룹니다.

핵심 포인트

  • GAS와 Gemini API를 조합한 이메일 요약 자동화 구현
  • Google AI Studio를 통한 Gemini API 키 발급 및 활용
  • 스크립트 속성(Script Properties)을 이용한 API 키 보안 관리
  • 트리거(Trigger) 설정을 통한 정기적 자동 실행 방법

아침 첫 이메일, 전부 읽기 너무 힘들지 않으신가요

출근해서 (혹은 PC를 켜고), 우선 읽지 않은 이메일 더미를 위에서부터 순서대로 열어 나간다.

다 읽고 나면 30분이 지나 있고, 정작 중요한 업무는 아직 시작도 하지 않은 상태——.

이것은 요컨대 「매일 아침, 모르는 봉투를 100통 열어서 내용을 대충 훑어보는 역할」을 스스로 하고 있는 상태입니다. 본래 이 역할은 유능한 비서가 있다면 "오늘의 중요한 메일은 이 3건입니다, 요점은 이렇습니다"라고 전달해 주어야 합니다.

이 기사에서는 그 「비서」를 직접 고용하겠습니다. 고용할 대상은 두 명입니다.

Google Apps Script (GAS): Google 안에 살고 있는, 무료로 고용할 수 있는 작은 로봇 -
Gemini API: 문장을 읽고 요약해 주는, 똑똑한 파트너

이 두 명을 조합하여, 「매일 아침 7시, 읽지 않은 메일을 읽고 3줄로 요약하여 자신에게 정리해서 보내기」를 자동화합니다. 서버도 앱 설치도 필요 없습니다. 브라우저만으로 완결됩니다.

전체상을 「회사의 아침 조회」에 비유하면

구조를 회사의 아침 조회에 비유하면 등장인물은 다음과 같습니다.

GmailApp: 메일함 담당자. "읽지 않은 메일을 가져와"라고 하면 가져옴 -
Gemini: 요약 담당. 전달받은 문장을 "3줄로"라고 부탁하면 돌려줌 -
GAS 본체: 진행자. 담당자로부터 원고를 받아 요약 담당에게 전달하고, 완성본을 자신에게 보냄 -
트리거 (Trigger): 알람 시계. 매일 아침 정해진 시간에 "아침 조회 시작"이라며 진행자를 깨움

즉 해야 할 일은 진행자 (GAS)의 대본을 쓰고, 알람 시계 (트리거)를 설정하는 것뿐입니다. 어려워 보이지만 대본은 40줄 정도입니다.

준비 1: Gemini API 키를 무료로 받기

Google AI Studio에 Google 계정으로 로그인하여 「Create API key (API 키 생성)」를 누르면, AIza...로 시작하는 문자열을 받을 수 있습니다. 이것이 Gemini를 호출할 때의 「암호」입니다.

무료 할당량(Free tier)이 마련되어 있으므로 개인적으로 테스트하는 범위라면 기본적으로 돈이 들지 않습니다. 단, 무료 할당량의 요청 제한이나 요금은 개정될 수 있으므로 정확한 수치는 반드시 공식 요금 페이지에서 확인하십시오 (본 기사 작성 시점의 구체적인 단가는 확인 필요).

준비 2: GAS 프로젝트 만들기

script.google.com을 열고 「새 프로젝트」를 클릭합니다. 이것만으로 코드를 작성하고 실행할 수 있는 화면이 나타납니다. 설치는 아무것도 필요 없습니다.

다음으로 받은 API 키를 안전한 금고에 보관합니다. 왼쪽 메뉴의 톱니바퀴 (프로젝트 설정) → 「스크립트 속성 (Script Properties)」 → 「속성 추가」에서,

  • 속성 (Property):
    GEMINI_API_KEY

  • 값 (Value):
    방금 받은
    AIza...

를 입력하고 저장합니다. 이렇게 하면 코드 본문에 키를 직접 쓰지 않아도 됩니다.

최소 작동 예시: 우선 Gemini가 한마디 하게 만들기

갑자기 전부 만들면 어디서 실패했는지 알 수 없게 됩니다. 우선은 「Gemini가 응답하는가」만을 확인하는 최소한의 코드부터 시작합니다. 에디터에 다음을 붙여넣으세요.

function callGemini(prompt) {
// 금고 (스크립트 속성)에서 API 키를 가져옴
const apiKey = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
...

한 줄씩 요점을 보충하겠습니다.

PropertiesService...getProperty('GEMINI_API_KEY'): 금고에서 키를 꺼냄. 코드에 직접 쓰지 않기 위한 장치 -
url: Gemini의 창구. gemini-1.5-flash가 2024년 기준 현행 모델 (공식 퀵스타트에서 확인) -
payload: 보낼 문장을 Gemini가 받을 수 있는 「상자 형태」로 다시 담는 과정 -
UrlFetchApp.fetch: GAS에서 인터넷으로 편지를 보내는 명령. 이것이 GAS의 심장부 -
json.candidates[0]...: 응답은 중첩(nest) 구조가 깊음. candidates (후보)의 0번째 안에 있는 본문을 추출함

함수를 test로 전환하고 「실행」을 누르면, 처음 한 번만 Google 권한 확인 창이 뜹니다. 이것은 「이 스크립트가 인터넷에 접속하거나 Gmail을 만져도 되는지」에 대한 허가입니다. 허가했을 때 실행 로그에 「안녕하세요」가 나오면 성공입니다.

실전: 읽지 않은 메일을 요약하여 나에게 보내기

최소 단위의 예제가 작동했다면, 드디어 실전입니다. Gmail에서 읽지 않은 메일을 가져와, 한 통씩 Gemini에게 요약을 시킨 뒤, 한데 모아 나에게 보냅니다.

function summarizeMorningMails() {
// 최근 1일간의 읽지 않은 메일을 최대 10건만 가져옴 (너무 많이 가져오는 것 방지)
const threads = GmailApp.search('is:unread newer_than:1d', 0, 10);
...

포인트를 자세히 살펴보겠습니다.

GmailApp.search('is:unread newer_than:1d', 0, 10)

: 검색창에 입력하는 것과 동일한 조건으로 가져옵니다. 0, 10은 "처음부터 10건까지"를 의미합니다.

.slice(0, 1000)

: 본문을 앞부분 1,000자에서 자릅니다. 긴 문장을 통째로 보내면 속도가 느려지고 비용이 높아지므로, 처음에는 짧게 설정하는 것이 안전합니다.

callGemini(...)

: 방금 만든 함수를 재사용합니다. 부품을 조합하는 감각입니다.

GmailApp.sendEmail(...)

: 자신의 주소로 요약본을 전송합니다.

summarizeMorningMails를 실행하여 자신에게 요약 메일이 도착하면 완성입니다.

자동화: 매일 아침 7시에 자동으로 실행하기

마지막으로 알람 시계를 설정합니다. 왼쪽 메뉴의 시계 아이콘(트리거) → 「트리거 추가」를 클릭합니다.

  • 실행할 함수: summarizeMorningMails
  • 이벤트 소스: 시간 기반
  • 유형: 날짜 기반 타이머
  • 시간: 오전 7시 ~ 8시

저장하면, 이제 PC를 켜두지 않아도 매일 아침 Gemini가 요약본을 보내줍니다.

작동하지 않을 때 확인하는 방법

제대로 작동하지 않을 때 무턱대고 코드를 수정하는 것이 가장 위험합니다. 다음 순서에 따라 원인을 분리해 보세요.

먼저 에러 위치를 확인하기: 실행 후, 에디터 하단의 「실행 로그」나 「실행 수」 화면에 빨간색 에러가 뜹니다. 우선 그것을 읽으세요. 영어로 되어 있더라도 마지막 줄에 원인이 적혀 있는 경우가 많습니다.

최소 단위로 되돌려 분리하기: 실전 코드가 작동하지 않는다면, 먼저 test(최소 단위 예제)로 돌아가 callGemini 단독으로 작동하는지 확인합니다. 여기가 작동한다면 Gemini 측은 문제가 없다는 뜻이며, 즉 원인은 Gmail 측이나 트리거 측으로 좁혀집니다. 최소 단위로 되돌려 분리하는 것이 철칙입니다.

반환된 내용 들여다보기: Logger.log(response.getContentText())를 일시적으로 추가하면 Gemini의 가공되지 않은 응답을 볼 수 있습니다. error라고 적혀 있다면, 그 message가 정답입니다.

환경(설정) 의심하기: 코드가 맞는데도 안 된다면, 스크립트 속성(Script Property)의 이름이 GEMINI_API_KEY와 토씨 하나 틀리지 않고 일치하는지, 키를 복사할 때 실수하지 않았는지 다시 확인합니다.

자주 발생하는 에러 읽기 예시:

400 / API key not valid: 키가 틀렸거나 속성 이름의 철자 오류

403 / permission: Gmail 권한을 허용하지 않음. 한 번 수동으로 실행하여 다시 승인할 것

429 / quota: 무료 할당량 초과. 시간을 조금 두거나 건수를 줄일 것

Cannot read properties of undefined: candidates가 비어 있음. 대부분 보낸 문장이 비어 있거나, 안전 필터(Safety Filter)에 의해 차단된 경우

자주 하는 실수 · 낭비되는 작업 · 하지 말아야 할 것

마지막으로 초보자가 빠지기 쉬운 함정들을 정리합니다.

처음부터 전부 다 쓰지 말 것: 최소 단위 예제로 "호출할 수 있는지"를 먼저 확인한 뒤 실전으로 넘어갑니다. 이것이 결국 가장 빠릅니다.

읽지 않은 메일 전체 · 본문 전체를 보내지 말 것: 매일 아침 100통의 긴 문장을 던지면 속도도 느려지고 무료 할당량도 금방 소진됩니다. 우선은 10건, 1,000자 정도로 충분합니다.

요약 결과를 맹신하지 말 것: AI의 요약은 편리하지만, 중요한 계약 내용, 금액, 날짜는 반드시 원문을 열어 확인해야 합니다. 요약은 "메일을 열어볼 순서를 정하기 위한 지도" 정도로 생각하세요.

모델 이름을 마음대로 옛날 것으로 바꾸지 말 것: 인터넷의 오래된 글에는 gemini-pro 등의 구형 명칭이 남아 있습니다. 작동하지 않을 때는 공식 현재 모델명(gemini-1.5-flash 등)을 확인하세요.

낭비되기 쉬운 작업: 에러를 읽지 않고 코드를 여기저기 수정하는 것. 90%는 로그에 답이 적혀 있습니다.

요약

우리가 한 일은 단 두 개의 부품을 조립한 것뿐입니다.

callGemini: 문장을 전달하면 요약을 돌려주는 "파트너"

summarizeMorningMails: 매일 아침 메일을 가져와 요약하고 보내는 "관리자"

:읽지 않은 메일을 모아 파트너에게 전달하고, 자신에게 전달하는 "진행자"

여기에 알람 시계(Trigger)를 더하면, 매일 아침 메일 분류가 자동화됩니다. 동일한 callGemini는 스프레드시트의 감상문을 분류하거나, 문의 메일의 답장 초안을 작성하는 등 얼마든지 응용이 가능합니다.

"자동화"라고 하면 어렵게 느껴질 수 있지만, 정체는 작은 부품들을 조합하여 알람 시계를 맞추는 것입니다. 우선 최소한의 예제를 한 번 실행하는 것부터, 옆에서 함께 시작해 봅시다.

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0