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

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

교육 안내나 서류 제출 요청처럼 이름만 바뀌는 메일을 아직 한 통씩 복사해서 보내고 있나요? 구글 스프레드시트에 수신자 목록만 있으면 이메일 자동 발송은 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에서 확인하지 않은 앱' 경고가 나오는데, 개발자 칸에 내 주소가 있다면 내가 만든 스크립트입니다. '고급'을 펼쳐 프로젝트 이름(으)로 이동을 누르고, 스프레드시트와 메일 보내기 권한에 체크한 뒤 '계속'을 누릅니다. 남이 공유한 스크립트라면 코드를 읽기 전에는 여기서 멈추세요.

Apps Script 편집기에 작성한 구글 스프레드시트 이메일 자동 발송 스크립트와 실행 로그
sendEmails 함수를 실행한 편집기. 아래 실행 로그에 '실행이 완료됨'과 함께 오늘 남은 발송 가능 수가 찍혀 있다.

3단계: 발송 완료 표시로 중복 발송 막기

실행이 끝나면 시트의 E열에 보낸 행마다 '발송 완료'와 시각이 들어가 있어야 합니다.

스크립트 실행 뒤 발송 상태 열에 발송 완료 시각이 기록된 구글시트 수신자 목록
미리 표시가 있던 2행은 건너뛰고, 3·4행에만 보낸 시각이 새로 찍혔다(이메일 주소는 가림).

예시 시트의 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 트리거 설정: 매일 정해진 시간 자동 실행에 있습니다. 트리거는 수동 실행으로 결과를 충분히 확인한 다음에 거세요.

댓글

이 블로그의 인기 게시물

챗GPT 엑셀 데이터 분석: 파일 올려 요약표 만드는 법

챗GPT 엑셀 프롬프트 모음: 수식·정리·오류 해결 예시

AI 보고서 작성 프롬프트: 주간보고 초안 템플릿