반복업무 자동화

2026.10.29 17:52

구글 앱스 스크립트 입문: 시트 데이터를 메일로 자동 발송

  • 데네브 15일 전 2026.10.29 17:52 일반
  • 34
    0

구글 앱스 스크립트 입문: 시트 데이터를 메일로 자동 발송

지난 글에서는 IMPORTRANGE와 QUERY 함수로 여러 시트의 데이터를 자동으로 모으는 집계표를 만들었습니다. 그런데 집계표가 아무리 잘 만들어져 있어도, 매주 그 내용을 복사해서 팀장님께 메일로 보내는 일은 여전히 사람이 해야 합니다.


이번 글에서는 구글 앱스 스크립트(Google Apps Script)를 사용해 시트 데이터를 정해진 시간에 자동으로 메일로 보내는 방법을 알아보겠습니다. 코딩이 처음이어도 괜찮습니다. 이 글의 코드를 복사해 붙여넣고, 몇 군데만 내 상황에 맞게 바꾸면 됩니다.

1. 구글 앱스 스크립트란?

구글 앱스 스크립트는 구글 시트, 지메일, 드라이브, 캘린더 같은 구글 서비스를 코드로 제어할 수 있는 도구입니다.

  • 별도 설치가 필요 없습니다. 구글 시트 안에서 바로 열 수 있습니다.
  • 무료입니다. 구글 계정만 있으면 쓸 수 있습니다.
  • 내 컴퓨터가 꺼져 있어도 실행됩니다. 구글 서버에서 동작하기 때문에 정해진 시간이 되면 알아서 실행됩니다.
  • 자바스크립트 문법을 씁니다. 처음엔 낯설어도, 이 글에서 쓰는 수준이면 충분히 따라 할 수 있습니다.

엑셀 매크로가 "엑셀 안의 자동화"라면, 앱스 스크립트는 ”구글 서비스 전체를 연결하는 자동화"라고 생각하면 됩니다.

2. 이번 글에서 만들 자동화 2가지

① 주간 매출 보고 자동 발송
지난 글에서 만든 상품별 매출 집계표를 매주 월요일 아침 9시에 표 형태로 메일 발송

② 명단 기반 개별 안내 메일 발송
시트에 정리된 고객 명단을 보고 한 사람씩 이름을 넣은 맞춤 메일을 보내고, 보낸 사람은 "발송완료"로 표시

3. 스크립트 편집기 열기

  1. 메일로 보낼 데이터가 있는 구글 시트를 엽니다.
  2. 상단 메뉴에서 [확장 프로그램] → [Apps Script]를 클릭합니다.
  3. 새 탭에서 스크립트 편집기가 열리고, function myFunction() { }이라는 기본 코드가 보입니다.
  4. 왼쪽 위 "제목 없는 프로젝트"를 클릭해 ”매출보고 자동발송"처럼 알아보기 쉬운 이름으로 바꿔 둡니다.

▶ 이렇게 시트에서 연 스크립트는 그 시트에 연결되어 있어서, 코드에서 "지금 이 시트"를 바로 불러올 수 있습니다.

4. 첫 번째 코드: 나에게 테스트 메일 보내기

바로 본론으로 가기 전에, 메일 발송이 잘 되는지부터 확인해 보겠습니다. 기본 코드를 모두 지우고 아래 코드를 붙여넣으세요.


function testMail() {
  MailApp.sendEmail('내이메일@gmail.com', '앱스 스크립트 테스트', '메일 자동 발송 성공!');
}
  • MailApp.sendEmail(받는 사람, 제목, 본문)이 메일을 보내는 명령입니다.
  • 내이메일@gmail.com 부분을 본인 메일 주소로 바꾸세요.

[저장(디스크 아이콘)]을 누른 뒤, 상단 함수 선택 칸에 testMail이 선택된 것을 확인하고 [실행]을 클릭합니다.

처음 실행 시 권한 승인하기

처음 실행하면 "승인 필요" 창이 뜹니다. 내가 만든 스크립트가 내 계정으로 메일을 보내도 되는지 확인하는 절차입니다.

  1. [권한 검토]를 클릭합니다.
  2. 본인 구글 계정을 선택합니다.
  3. ”Google에서 확인하지 않은 앱"이라는 경고가 나타나면 [고급]을 클릭합니다.
  4. [(프로젝트 이름)(으)로 이동(안전하지 않음)]을 클릭합니다.
  5. 요청하는 권한을 확인하고 [허용]을 누릅니다.

★ "안전하지 않음"이라는 문구는 구글의 정식 심사를 받지 않은 앱이라는 뜻입니다. 내가 직접 작성했거나 내용을 이해한 코드라면 허용해도 괜찮습니다. 반대로 출처를 모르는 스크립트에는 절대 권한을 주지 마세요.

잠시 후 메일함에 "메일 자동 발송 성공!"이라는 메일이 도착하면 준비 완료입니다.


5. 자동화 ①: 주간 매출 집계를 표로 메일 보내기

이제 시트의 집계표를 읽어 HTML 표 형태로 메일 본문에 넣어 보내보겠습니다. 예제에서는 "상품별집계"라는 시트에 아래와 같은 표가 있다고 가정합니다.

7af33c95f7f6ea592b4a3c994d5115e1_1793263209_5924.jpg
 

function sendWeeklyReport() {
  // 1. 시트에서 데이터 가져오기
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('상품별집계');
  const data = sheet.getDataRange().getDisplayValues();

  // 2. 데이터를 HTML 표로 만들기
  let html = '<h3>주간 상품별 매출 집계</h3>';
  html += '<table border="1" cellpadding="8" style="border-collapse:collapse;">';
  data.forEach(function(row, i) {
    const tag = (i === 0) ? 'th' : 'td';   // 첫 행은 머리글
    html += '<tr>';
    row.forEach(function(cell) {
      html += '<' + tag + '>' + cell + '</' + tag + '>';
    });
    html += '</tr>';
  });

  html += '</table>';
  html += '<p>※ 이 메일은 구글 시트에서 자동 발송되었습니다.</p>';

  // 3. 메일 보내기
Utilities.formatDate(new Date(), 'Asia/Seoul', 'yyyy-MM-dd');
  MailApp.sendEmail({
    to: '받는사람@example.com',
    subject: '[자동] 주간 매출 보고 (' + today + ')',
    htmlBody: html
  });

}

 

코드 한 줄씩 이해하기

  • getSheetByName('상품별집계'): 이름이 "상품별집계"인 시트를 찾습니다. 내 시트 이름으로 바꾸세요.
  • getDataRange(): 데이터가 들어 있는 범위 전체를 선택합니다.
  • getDisplayValues(): 화면에 보이는 그대로(쉼표, 날짜 형식 포함) 값을 가져옵니다. getValues()를 쓰면 760,000이 760000처럼 서식 없이 나옵니다.
  • forEach: 행과 칸을 하나씩 돌면서 표의 태그(<tr>, <td>)를 만듭니다.
  • htmlBody: 본문을 일반 글자가 아닌 HTML로 보내라는 뜻입니다. 그래서 표가 표로 보입니다.
  • Utilities.formatDate: 오늘 날짜를 “2026-10-29” 형식으로 만들어 제목에 넣습니다.

받는 사람 주소를 바꾸고(처음엔 본인 주소로 테스트하세요), 함수 선택 칸에서 sendWeeklyReport를 고른 뒤 실행해 보세요. 표가 담긴 메일이 도착합니다.

▶ 여러 명에게 보내려면 to: 'a@example.com,b@example.com'처럼 쉼표로 구분하면 됩니다. 참조는 cc: '주소'를 추가하세요.

6. 정해진 시간에 자동 실행: 트리거 설정

지금까지는 [실행] 버튼을 눌러야 메일이 갔습니다. 트리거를 설정하면 원하는 시간에 알아서 실행됩니다.

  1. 스크립트 편집기 왼쪽 메뉴에서 시계 모양 아이콘 [트리거]를 클릭합니다.
  2. 오른쪽 아래 [트리거 추가]를 클릭합니다.
  3. 다음과 같이 설정합니다.
    • 실행할 함수: sendWeeklyReport
    • 이벤트 소스: 시간 기반
    • 트리거 유형: 주 단위 타이머
    • 요일: 매주 월요일
    • 시간: 오전 9시~10시
  4. [저장]을 누릅니다.

이제 매주 월요일 오전 9~10시 사이에 집계표가 자동으로 발송됩니다. 지난 글의 IMPORTRANGE·QUERY 집계표와 연결하면, 각 지점이 데이터를 입력하기만 하면 집계부터 보고까지 전부 자동으로 이루어집니다.

트리거 실행 시간은 정확히 9시 정각이 아니라 설정한 1시간 범위 안의 어느 시점입니다. 시간대가 맞지 않다면 왼쪽 [프로젝트 설정(톱니바퀴)]에서 시간대가 (GMT+09:00) 서울로 되어 있는지 확인하세요.

7. 자동화 ②: 명단을 보고 한 명씩 맞춤 메일 보내기

이번에는 여러 사람에게 각자 이름과 내용이 다른 메일을 보내보겠습니다. "발송목록" 시트를 아래처럼 만듭니다. 

7af33c95f7f6ea592b4a3c994d5115e1_1793263488_0548.jpg
 

function sendPersonalMails() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('발송목록');
  const data = sheet.getDataRange().getValues();

  // 첫 행(머리글)은 건너뛰고 2행부터
  for (let i = 1; i < data.length; i++) {
    const name = data[i][0];    // A열: 이름
    const email = data[i][1];   // B열: 이메일
    const item = data[i][2];    // C열: 상품
    const status = data[i][3];  // D열: 발송상태

    // 이메일이 없거나 이미 보낸 사람은 건너뛰기
    if (!email || status === '발송완료') continue;

    const subject = '[안내] ' + name + '님, 주문하신 상품이 발송되었습니다';
    const body = name + '님, 안녕하세요.\n\n'
               + '주문하신 [' + item + '] 상품이 오늘 발송되었습니다.\n'
               + '이용해 주셔서 감사합니다.';

   MailApp.sendEmail(email, subject, body);

    // 보낸 사람은 D열에 "발송완료" 표시

    sheet.getRange(i + 1, 4).setValue('발송완료');
  }
} 

핵심 포인트

  • data[i][0]: i번째 행의 첫 번째 칸(A열)이라는 뜻입니다. 칸 번호는 0부터 셉니다.
  • continue: 조건에 맞으면 이번 사람은 건너뛰고 다음 사람으로 넘어갑니다.
  • \n: 메일 본문의 줄바꿈입니다.
  • getRange(i + 1, 4): 시트의 행 번호는 1부터 시작하므로 i + 1행, 4번째 열(D열)에 "발송완료"를 기록합니다.

"발송완료" 표시가 중요한 이유는 스크립트를 실수로 두 번 실행하거나, 명단에 새 사람을 추가하고 다시 실행했을 때 이미 보낸 사람에게 중복 발송되는 것을 막아주기 때문입니다.

8. 시트 메뉴에 버튼 추가하기

매번 스크립트 편집기를 열지 않고 시트에서 바로 실행하고 싶다면, 아래 코드를 같은 스크립트에 추가하세요.


 function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('???? 자동화')
    .addItem('주간 보고 지금 보내기', 'sendWeeklyReport')
    .addItem('명단에 안내 메일 보내기', 'sendPersonalMails')
    .addToUi();
}

저장한 뒤 시트를 새로고침하면 상단 메뉴에 [???? 자동화]가 생깁니다. 스크립트를 모르는 동료도 메뉴만 클릭하면 메일을 보낼 수 있습니다.

9. 꼭 알아야 할 주의사항

  • 하루 발송 한도가 있습니다. 일반 구글 계정은 앱스 스크립트로 보낼 수 있는 메일 수신자 수에 하루 한도가 있습니다(일반 계정 기준 약 100명). 구글 워크스페이스 계정은 한도가 더 높습니다. 한도는 바뀔 수 있으니 대량 발송 전에 구글 공식 문서를 확인하세요.
  • 처음엔 반드시 본인에게 테스트하세요. 명단의 이메일을 모두 본인 주소로 바꿔 한 번 실행해 보고, 내용이 맞는지 확인한 뒤 실제 명단으로 보내세요. 보낸 메일은 취소할 수 없습니다.
  • 보내는 사람은 스크립트를 실행한 계정입니다. 트리거를 설정한 사람의 메일 주소로 발송되므로, 업무용 계정으로 만드는 것이 좋습니다.
  • 개인정보와 스팸에 주의하세요. 고객에게 보내는 메일은 수신 동의를 받은 대상에게만 보내야 합니다. 광고성 메일이라면 관련 법규(정보통신망법의 광고 표시, 수신 거부 안내 등)를 확인하세요.
  • 오류가 나면 실행 기록을 확인하세요. 왼쪽 메뉴 [실행]에서 언제 실행되었고 성공했는지 볼 수 있습니다. 트리거가 실패하면 구글이 오류 알림 메일을 보내주기도 합니다.

10. 자주 만나는 오류


7af33c95f7f6ea592b4a3c994d5115e1_1793263867_0843.jpg
 

▶ 코드가 어렵다면 AI에게 물어보세요

이 글의 코드를 바탕으로 ChatGPT나 Claude에게 이렇게 요청하면 내 상황에 맞게 수정할 수 있습니다.

"아래 구글 앱스 스크립트 코드에서, 매출합계가 50만 원 이상인 상품만 메일에 포함되도록 바꿔줘. (코드 붙여넣기)"

다만 받은 코드는 반드시 본인에게 테스트 발송한 뒤 실제로 사용하세요.

마무리

구글 앱스 스크립트를 쓰면 시트의 데이터를 읽어 → 메일로 만들고 → 정해진 시간에 보내는 과정을 모두 자동화할 수 있습니다. 오늘 만든 자동화를 정리하면 다음과 같습니다.

  1. [확장 프로그램] → [Apps Script]로 편집기 열기
  2. MailApp.sendEmail로 메일 발송, 처음 한 번 권한 승인
  3. getDisplayValues와 htmlBody로 시트 표를 메일 본문에
  4. 트리거로 매주 정해진 시간에 자동 실행
  5. 명단 발송은 "발송완료" 표시로 중복 방지
  • 공유링크 복사

    댓글목록

    등록된 댓글이 없습니다.