구글 스프레드시트 이메일 자동 발송 만들기
이 글의 목차
- 목차

교육 안내나 서류 제출 요청처럼 이름만 바뀌는 메일을 아직 한 통씩 복사해서 보내고 있나요? 구글 스프레드시트에 수신자 목록만 있으면 이메일 자동 발송은 Apps Script 함수 하나로 만들 수 있습니다. 시트의 각 행을 읽어 메일을 보내고, 보낸 행에는 '발송 완료'를 찍어 같은 사람에게 두 번 가지 않게 하는 데까지 차례로 따라가 보겠습니다.
Apps Script 편집기를 처음 연다면 구글 앱스 스크립트 사용법: 첫 자동화 따라하기에서 화면 구성부터 보고 오면 이해가 빠릅니다.
1단계: 수신자 목록 시트는 다섯 열이면 된다
새 스프레드시트를 만들고 아래쪽 시트 탭 이름을 수신자로 바꿉니다. 스크립트가 탭 이름으로 시트를 찾기 때문에 이름이 다르면 실행이 멈춥니다. 1행은 머리글, 2행부터 한 사람씩 적습니다.
- A 이름 / B 이메일 / C 교육명 / D 교육일 / E 발송 상태
- E열은 비워 둡니다. 스크립트가 보낸 뒤 이 칸을 채웁니다. 이미 보낸 사람이 있다면 E열에 아무 글자나 미리 적어 두면 건너뜁니다.
- 교육일은 '2026-11-12 (목)'처럼 글자로 적습니다. 날짜 서식 셀은 날짜 값으로 읽혀 제목에 긴 영문 날짜가 들어갈 수 있습니다.
처음에는 B열 주소를 모두 내 메일 주소로 채워 시험합니다. 문구가 틀려도 나에게만 옵니다.
2단계: 시트 데이터로 메일 보내는 발송 스크립트
시트 메뉴 확장 프로그램 → Apps Script를 누르면 이 시트에 연결된 편집기가 새 탭으로 열립니다. Code.gs에 있던 기본 함수를 지우고 아래 코드를 붙여 넣은 뒤 저장(Ctrl+S, 맥은 Cmd+S)합니다.
// 수신자 시트의 각 행으로 안내 메일을 보내고, 보낸 행에 표시를 남긴다
function sendEmails() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('수신자');
const data = sheet.getDataRange().getValues(); // 1행은 머리글
for (let i = 1; i < data.length; i++) {
const [name, email, course, date, status] = data[i];
if (!email || status) continue; // 주소가 없거나 이미 보낸 행은 건너뜀
const subject = `[교육 안내] ${course} (${date})`;
const body = `${name}님, 안녕하세요.\n\n` +
`${date}에 진행하는 '${course}' 교육을 안내드립니다.\n` +
`장소와 준비물은 사내 공지를 확인해 주세요.\n\n인사팀 드림`;
MailApp.sendEmail(email, subject, body);
const stamp = Utilities.formatDate(new Date(), 'Asia/Seoul', 'MM/dd HH:mm');
sheet.getRange(i + 1, 5).setValue('발송 완료 ' + stamp); // E열
SpreadsheetApp.flush();
}
Logger.log('오늘 남은 발송 가능 수: ' + MailApp.getRemainingDailyQuota());
}
손볼 곳은 제목(subject)과 본문(body)입니다. ${name} 같은 자리에 각 행의 값이 들어가고, 열을 더 만들었다면 7번째 줄 대괄호 안에 이름을 순서대로 추가합니다.
발송에는 MailApp을 씁니다. 공식 문서 설명대로 MailApp은 메일 보내기만 하고 받은편지함에는 접근하지 못하므로, 받은 메일을 읽을 일이 없다면 이쪽이 알맞습니다(Apps Script MailApp 레퍼런스).
처음 실행할 때 나오는 권한 화면
함수 목록에서 sendEmails가 선택된 것을 확인하고 '실행'을 누르면 '승인 필요' 창이 뜹니다. '권한 검토'를 누르면 'Google에서 확인하지 않은 앱' 경고가 나오는데, 개발자 칸에 내 주소가 있다면 내가 만든 스크립트입니다. '고급'을 펼쳐 프로젝트 이름(으)로 이동을 누르고, 스프레드시트와 메일 보내기 권한에 체크한 뒤 '계속'을 누릅니다. 남이 공유한 스크립트라면 코드를 읽기 전에는 여기서 멈추세요.

3단계: 발송 완료 표시로 중복 발송 막기
실행이 끝나면 시트의 E열에 보낸 행마다 '발송 완료'와 시각이 들어가 있어야 합니다.

예시 시트의 2행은 실행 전부터 '발송 완료 10/30'이 적혀 있어 건너뛰었고, 비어 있던 3·4행에만 메일이 나갔습니다. 이 구조 덕분에 두 경우가 안전해집니다.
- 실행 버튼을 실수로 두 번 눌렀을 때: 두 번째 실행에서는 E열이 모두 차 있어 아무것도 보내지 않습니다.
- 중간에 오류로 멈췄을 때: 한 통 보낼 때마다 바로 표시를 남기므로, 원인을 고치고 다시 실행하면 표시가 없는 행부터 이어서 보냅니다.
같은 사람에게 다시 보낼 때는 그 행의 E열만 지우고 실행합니다.
손으로 보낼 때와 스크립트로 보낼 때, 결과물 차이
| 비교 항목 | 메일을 한 통씩 복사해 보낼 때 | 시트 + 발송 스크립트 |
|---|---|---|
| 이름·교육명 넣기 | 복사한 본문에 앞사람 이름이 남는 실수가 생기기 쉬움 | 각 행 값이 자동으로 들어감. 대신 시트 오타가 그대로 나감 |
| 보낸 사람 구분 | 보낸편지함을 뒤져 확인 | E열 '발송 완료'로 한눈에 보임 |
| 재발송·누락 | 누구에게 안 보냈는지 따로 메모해야 함 | E열이 빈 행만 골라 보냄 |
| 검수할 것 | 매번 본문 전체 | 처음 한 번 내 주소로 시험 발송한 메일, 그리고 시트의 주소 열 |
4단계: 하루 발송 한도부터 확인하자
구글 스프레드시트 이메일 자동 발송에서 가장 많이 걸리는 곳이 하루 한도입니다. Google 공식 문서 Quotas for Google Services에 따르면 MailApp 등으로 보낼 수 있는 수신자 수는 gmail.com 같은 일반 계정이 하루 100명, Google Workspace 계정이 하루 1,500명입니다. 메일 통수가 아니라 받는 사람 수 기준이라 한 통에 세 명을 넣으면 세 명으로 세고, 한도는 첫 요청 후 24시간이 지나면 다시 채워집니다. 값은 예고 없이 바뀔 수 있다고 적혀 있으니 큰 발송 전에는 다시 확인하세요.
스크립트 마지막 줄의 MailApp.getRemainingDailyQuota()가 남은 수를 실행 로그에 보여 줍니다. 한도를 넘으면 오류로 멈추지만, 발송 완료 표시 덕분에 다음 날 다시 실행하면 남은 사람부터 이어집니다.
보내기 전 점검, 그리고 매일 자동으로 돌리고 싶다면
- 수신자 목록 시트의 공유 설정. 이름과 메일 주소가 담긴 개인정보이므로 편집 권한은 필요한 사람에게만 줍니다.
- 시험 발송은 내 주소로. 받은 메일에서 이름, 날짜, 줄바꿈이 제대로 들어갔는지 봅니다.
- 주소 열의 공백과 오타. 주소가 잘못된 행에서 실행이 멈출 수 있으니 오류가 나면 그 행부터 확인합니다.
매일 정해진 시간에 보내고 싶다면 편집기 왼쪽 '트리거' 메뉴에서 sendEmails를 시간 기반으로 걸면 됩니다. E열이 빈 새 행에만 메일이 나가고, 설정 순서는 Apps Script 트리거 설정: 매일 정해진 시간 자동 실행에 있습니다. 트리거는 수동 실행으로 결과를 충분히 확인한 다음에 거세요.
댓글
댓글 쓰기