매일 쏟아지는 이메일 속에서 중요한 첨부파일을 관리하는 건 정말 번거로운 일이죠. 특히 '세금계산서', '계약서'처럼 꼭 보관해야 하는 파일들은 나중에 찾으려면 한숨부터 나오더라고요. 저도 예전에는 중요한 메일에 별표 표시를 해두고, 나중에 하나씩 파일을 내려받아 폴더에 정리하곤 했는데요. 솔직히 말해서, 너무 귀찮고 시간도 많이 걸렸어요. 깜빡하고 놓치는 경우도 부지기수였고요. 😥
그래서 오늘은 저와 같은 고민을 하셨을 분들을 위해, Gmail의 특정 라벨이 붙은 이메일의 첨부파일을 알아서 Google Drive 폴더에 착착 저장해 주는 '자동화 시스템'을 만드는 방법을 소개해드리려고 해요. 코딩을 전혀 몰라도 괜찮아요! 제가 드리는 코드를 복사해서 붙여 넣기만 하면 되니까, 차근차근 따라와 보세요. 😊

자동화의 핵심, Gmail 라벨과 필터 이해하기 🏷️
자동화의 첫걸음은 이메일을 '분류'하는 것에서 시작해요. 이때 필요한 게 바로 Gmail의 라벨과 필터 기능입니다.
라벨(Label)은 이메일에 붙이는 '꼬리표' 같은 거예요. 예를 들어 '세금계산서', '프로젝트 A', '여행' 같은 라벨을 만들어두면, 관련 이메일을 한눈에 모아볼 수 있죠. 폴더와 비슷하지만, 하나의 이메일에 여러 개의 라벨을 붙일 수 있다는 점이 더 유연하고 강력해요.
필터(Filter)는 특정 규칙에 맞는 이메일이 들어왔을 때, 라벨을 자동으로 붙여주는 기능이에요. 예를 들어, '국세청'에서 온 이메일에는 '세금계산서' 라벨을 자동으로 붙이도록 설정할 수 있죠. 이 두 가지를 조합하면, 우리는 자동화의 기반을 마련하게 되는 셈이에요!
자동화를 시작하기 전에, 어떤 이메일의 첨부파일을 저장할지 미리 생각해보고 관련 라벨과 필터를 설정해두는 것이 중요해요. 예를 들어, '거래처A'에서 온 모든 메일의 첨부파일을 저장하고 싶다면, '거래처A'라는 이름의 라벨을 만들고, 해당 이메일 주소로 오는 메일에 이 라벨이 자동으로 붙도록 필터를 만들어두세요.
Google Apps Script로 날개 달기 🚀
이제 본격적으로 자동화 시스템을 구축할 시간이에요. 우리는 'Google Apps Script'라는 도구를 사용할 거예요. 이름이 좀 어려워 보이지만, 구글 서비스들을 연결하고 자동화시켜 주는 '마법의 접착제' 정도로 생각하시면 쉬워요. JavaScript 기반이지만, 코드를 직접 짤 필요는 없답니다.
아래 순서대로만 따라오시면 됩니다.
- Google Drive에서 Apps Script 시작하기: 먼저 Google Drive에 접속해서, [새로 만들기] > [더보기] > [Google Apps Script]를 클릭해 새 프로젝트를 엽니다.
- 코드 붙여넣기: 열리는 코드 편집기 창에 기존에 있던 코드는 모두 지우고, 아래에 있는 코드를 전체 복사해서 붙여넣으세요.
- 설정값 수정하기: 코드 상단의 `// --- 설정 ---` 부분에 있는 3가지 항목을 자신의 환경에 맞게 수정해야 해요.
- `SOURCE_LABEL_NAME`: 첨부파일을 가져올 Gmail 라벨 이름을 정확하게 입력하세요. (예: "세금계산서")
- `DESTINATION_FOLDER_NAME`: 첨부파일을 저장할 Google Drive 폴더 이름을 입력하세요. 이 이름의 폴더가 없으면 자동으로 생성돼요. (예: "이메일 첨부파일/세금계산서")
- `PROCESSED_LABEL_NAME`: 처리가 완료된 이메일에 붙일 라벨 이름이에요. 중복 저장을 막기 위한 것이니, 원하는 이름으로 설정하세요. (예: "자동저장_완료")
- 프로젝트 저장 및 권한 승인: 상단 디스크 모양 아이콘을 눌러 프로젝트를 저장하고, `실행` 버튼을 눌러 `processGmailAttachments` 함수를 최초 1회 실행하세요. 중간에 '권한 검토' 팝업이 뜨면, 자신의 구글 계정을 선택하고 '고급' > '(안전하지 않음)으로 이동'을 클릭하여 권한을 허용해주세요. (우리가 직접 만든 스크립트라 뜨는 메시지이니 안심하셔도 됩니다.)
- 트리거 설정으로 자동화 완성하기: 왼쪽 메뉴에서 시계 모양의 '트리거'를 클릭하고, 오른쪽 하단의 '트리거 추가' 버튼을 누르세요. 그리고 다음과 같이 설정합니다.
- 실행할 함수 선택: `processGmailAttachments`
- 이벤트 소스 선택: `시간 기반`
- 시간 기반 트리거 유형 선택: `시간 기반 타이머` (또는 `분 기반 타이머`)
- 시간 간격 선택: `매 1시간마다` (원하는 주기로 설정 가능)
라벨과 폴더 이름은 코드에 입력한 값과 정확히 일치해야 해요. 띄어쓰기 하나라도 다르면 스크립트가 제대로 작동하지 않을 수 있습니다. 또한, 처음 권한을 승인할 때 나타나는 경고 메시지는 구글이 외부 앱의 무분별한 접근을 막기 위한 기본 조치이니, 내용을 확인하고 '허용'을 눌러주셔야 정상적으로 작동합니다.
⚙️ Gmail 첨부파일 자동 저장 스크립트 ⚙️
function processGmailAttachments() {
// --- 설정 ---
const SOURCE_LABEL_NAME = "세금계산서"; // 첨부파일을 가져올 Gmail 라벨 이름
const DESTINATION_FOLDER_NAME = "이메일 첨부파일/세금계산서"; // 저장할 구글 드라이브 폴더 경로
const PROCESSED_LABEL_NAME = "자동저장_완료"; // 작업 완료 후 붙일 라벨 이름
// --- 설정 끝 ---
// 1. 라벨 및 폴더 가져오기 (없으면 생성)
const sourceLabel = getOrCreateLabel(SOURCE_LABEL_NAME);
const processedLabel = getOrCreateLabel(PROCESSED_LABEL_NAME);
const destinationFolder = getOrCreateFolder(DESTINATION_FOLDER_NAME);
// 2. 처리할 이메일 스레드 검색
const query = `label:${SOURCE_LABEL_NAME} -label:${PROCESSED_LABEL_NAME} has:attachment`;
const threads = GmailApp.search(query);
if (threads.length === 0) {
Logger.log("처리할 새 이메일이 없습니다.");
return;
}
// 3. 각 이메일 스레드 및 메시지 처리
for (const thread of threads) {
const messages = thread.getMessages();
for (const message of messages) {
const attachments = message.getAttachments();
for (const attachment of attachments) {
try {
// 파일 이름 중복 방지 처리
let fileName = attachment.getName();
let file = destinationFolder.getFilesByName(fileName);
let count = 0;
while (file.hasNext()) {
count++;
const parts = fileName.split('.');
const extension = parts.pop();
const name = parts.join('.');
fileName = `${name}_${count}.${extension}`;
file = destinationFolder.getFilesByName(fileName);
}
destinationFolder.createFile(attachment.copyBlob()).setName(fileName);
Logger.log(`'${fileName}' 파일을 '${destinationFolder.getName()}' 폴더에 저장했습니다.`);
} catch (e) {
Logger.log(`파일 저장 중 오류 발생: ${e.toString()}`);
}
}
}
// 4. 처리 완료 라벨 추가
thread.addLabel(processedLabel);
Logger.log(`'${thread.getFirstMessageSubject()}' 스레드 처리를 완료하고 '${PROCESSED_LABEL_NAME}' 라벨을 추가했습니다.`);
}
}
// 폴더 경로를 받아 폴더를 생성하거나 반환하는 함수
function getOrCreateFolder(path) {
let folder = DriveApp.getRootFolder();
const folderNames = path.split('/');
for (const folderName of folderNames) {
const folders = folder.getFoldersByName(folderName);
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = folder.createFolder(folderName);
}
}
return folder;
}
// 라벨 이름을 받아 라벨을 생성하거나 반환하는 함수
function getOrCreateLabel(labelName) {
let label = GmailApp.getUserLabelByName(labelName);
if (!label) {
label = GmailApp.createLabel(labelName);
}
return label;
}
첨부파일 자동화 핵심 요약
자주 묻는 질문 ❓
이제 여러분의 이메일함과 클라우드 스토리지는 훨씬 더 깔끔하고 효율적으로 관리될 거예요. 단순 반복 업무는 똑똑한 스크립트에게 맡기고, 우리는 더 중요한 일에 집중하자고요! 이 방법이 여러분의 디지털 라이프에 작은 도움이 되었으면 좋겠습니다. 더 궁금한 점이 있다면 언제든지 댓글로 물어봐 주세요~ 😊
📚 실전 워크플로우 & 자동화 심화 시리즈
- "코딩없이 Notion API 활용: Make/Zapier로 나만의 자동화 만들기"
- "귀찮은 이메일 첨부파일 다운로드, 이제 자동화하세요!(Gmail & 구글드라이브 연동)"
- "구글 폼과 Looker Studio 연동: 클릭 한번으로 끝내는 보고서 자동화 비법"
- "브런치/블로그 글, SNS에 자동으로 공유하는 가장 쉬운방법(IFTT,RSS활용)"
- "엑셀 파워 쿼리 하나로 보고서 지옥 탈출! (복사 붙여넣기 이제 그만)"
- "단한번의 클릭으로 집중모드 ON! Flic & 스마트싱스 버튼 뽀모도로 자동화 완벽 가이드"
- "스마트홈 버튼으로 PC까지 제어? IFTTT와 Power Automate 연동 가이드"
- "아이폰 NFC 태그 자동화, '단축어' 하나로 삶의 질 200% 올리는 방법"
- "웹훅(Webhook)이란? API 폴링과의 차이점부터 실전 활용까지 총정리"
- "잘 만든 자동화는 왜 멈출까? 실패 원인과 오류 처리 완벽 가이드"
'돈 버는 도구들' 카테고리의 다른 글
| 실전 워크플로우 & 자동화 심화 4 - 브런치/블로그 글, SNS에 자동으로 공유하는 가장 쉬운 방법 (IFTTT, RSS 활용) (9) | 2025.07.29 |
|---|---|
| 실전 워크플로우 & 자동화 심화 3 - 구글 폼과 Looker Studio 연동: 클릭 한 번으로 끝내는 보고서 자동화 비법 (4) | 2025.07.28 |
| 실전 워크플로우 & 자동화 심화 1 - 코딩 없이 Notion API 활용: Make/Zapier로 나만의 자동화 만들기 (3) | 2025.07.27 |
| 2026년, 당신의 회사는 이렇게 변합니다: 공간 컴퓨팅과 AI 에이전트가 이끄는 업무 혁신 (10) | 2025.07.27 |
| 아이패드 굿노트 필기, 이 글 하나로 끝! (feat. 노타빌리티 비교) (5) | 2025.07.25 |