본문 바로가기
AppSheet

구글 앱스크립트 8차시 - 이메일 자동화와 트리거

by 에버리치60 2025. 12. 20.

구글 앱스크립트 8차시 - 이메일 자동화와 트리거

8차시: 이메일 자동화와 트리거

Gmail 연동과 시간 기반 자동 실행 배우기

📚 학습 목표
  • GmailApp을 사용하여 이메일 자동 발송하기
  • HTML 형식의 이메일 작성하기
  • 트리거(Trigger)로 스크립트 자동 실행 설정하기
  • 실전 예제: 자동 일일 보고서 이메일 발송 시스템

📧 이메일 발송 기초

1 GmailApp의 개념
GmailApp은 구글 앱스크립트에서 Gmail을 제어할 수 있는 서비스입니다. 이메일 발송, 수신, 검색 등의 작업을 자동화할 수 있습니다.
주요 기능:
sendEmail(): 이메일 보내기
getInboxThreads(): 받은 편지함 가져오기
search(): 이메일 검색하기
createDraft(): 임시 보관함에 저장

🚀 실습 1: 기본 이메일 발송

2 간단한 텍스트 이메일 보내기
가장 기본적인 이메일을 보내봅시다:
function 기본이메일발송() {
  // 자기 자신에게 테스트 이메일 보내기
  let 받는사람 = Session.getActiveUser().getEmail();
  let 제목 = "구글 앱스크립트 테스트 이메일";
  let 내용 = "안녕하세요!\n\n이것은 구글 앱스크립트로 보낸 첫 번째 이메일입니다.\n\n감사합니다.";
  
  GmailApp.sendEmail(받는사람, 제목, 내용);
  
  Logger.log("이메일이 발송되었습니다: " + 받는사람);
  SpreadsheetApp.getActiveSpreadsheet().toast(
    "이메일이 발송되었습니다!", 
    "완료", 
    3
  );
}
실행 후 자신의 Gmail 받은편지함을 확인하세요!
3 옵션이 포함된 이메일
참조, 숨은참조, 답장 주소 등을 설정할 수 있습니다:
function 고급이메일발송() {
  let 받는사람 = Session.getActiveUser().getEmail();
  let 제목 = "옵션이 포함된 이메일";
  let 내용 = "이메일 본문 내용입니다.";
  
  // 고급 옵션 설정
  let 옵션 = {
    cc: "cc@example.com",           // 참조 (실제 이메일로 변경)
    bcc: "bcc@example.com",          // 숨은참조 (실제 이메일로 변경)
    replyTo: 받는사람,               // 답장 받을 주소
    name: "자동화봇",                // 발신자 이름
    noReply: false                   // 답장 가능
  };
  
  GmailApp.sendEmail(받는사람, 제목, 내용, 옵션);
  
  Logger.log("고급 이메일이 발송되었습니다.");
}
실제 사용 시 cc, bcc는 실제 이메일 주소로 변경하세요.
4 HTML 형식 이메일 보내기
디자인이 적용된 이메일을 보낼 수 있습니다:
function HTML이메일발송() {
  let 받는사람 = Session.getActiveUser().getEmail();
  let 제목 = "📊 매출 보고서";
  
  // HTML 내용 작성
  let HTML내용 = `
    
                                                      
                

                
                
                
        
      
                

                
                











                
                
      
        

📊 월간 매출 보고서

안녕하세요,

이번 달 매출 현황을 보고드립니다.

항목 금액
온라인 매출 5,000,000원
오프라인 매출 3,500,000원
총 매출 8,500,000원

상세 보고서 보기

`; let 텍스트내용 = "월간 매출 보고서입니다. HTML을 지원하는 이메일 클라이언트에서 확인하세요."; GmailApp.sendEmail(받는사람, 제목, 텍스트내용, { htmlBody: HTML내용 }); Logger.log("HTML 이메일이 발송되었습니다."); }
실행하면 깔끔하게 디자인된 이메일이 발송됩니다!
5 스프레드시트 데이터로 이메일 발송
시트의 데이터를 읽어서 여러 사람에게 이메일을 보냅니다:
function 일괄이메일발송() {
  let sheet = SpreadsheetApp.getActiveSheet();
  
  // 먼저 테스트 데이터 준비
  sheet.clear();
  let 데이터 = [
    ["이름", "이메일", "점수"],
    ["홍길동", Session.getActiveUser().getEmail(), 85],
    ["김철수", Session.getActiveUser().getEmail(), 92],
    ["이영희", Session.getActiveUser().getEmail(), 78]
  ];
  sheet.getRange(1, 1, 4, 3).setValues(데이터);
  
  // 2행부터 마지막 행까지 읽기 (제목 제외)
  let 마지막행 = sheet.getLastRow();
  let 발송개수 = 0;
  
  for (let i = 2; i <= 마지막행; i++) {
    let 이름 = sheet.getRange(i, 1).getValue();
    let 이메일 = sheet.getRange(i, 2).getValue();
    let 점수 = sheet.getRange(i, 3).getValue();
    
    // 개인화된 이메일 내용
    let 제목 = "[성적 통지] " + 이름 + "님의 시험 결과";
    let 내용 = 이름 + "님, 안녕하세요.\n\n" +
              "시험 결과를 알려드립니다.\n" +
              "점수: " + 점수 + "점\n\n" +
              "수고하셨습니다.";
    
    // 이메일 발송
    try {
      GmailApp.sendEmail(이메일, 제목, 내용);
      발송개수++;
      Logger.log(이름 + "에게 이메일 발송 완료");
    } catch (e) {
      Logger.log(이름 + " 발송 실패: " + e.message);
    }
    
    // 너무 빠르게 발송하지 않도록 잠시 대기
    Utilities.sleep(1000); // 1초 대기
  }
  
  SpreadsheetApp.getActiveSpreadsheet().toast(
    발송개수 + "명에게 이메일 발송 완료!", 
    "완료", 
    5
  );
}
실행하면 리스트의 모든 사람에게 개인화된 이메일이 발송됩니다!

⏰ 트리거(자동 실행) 설정하기

6 트리거의 개념과 종류
트리거는 특정 시간이나 이벤트가 발생할 때 함수를 자동으로 실행하는 기능입니다.
트리거 종류:
시간 기반: 특정 시간에 실행 (매일 오전 9시 등)
스프레드시트 열기: onOpen() - 파일을 열 때
스프레드시트 편집: onEdit() - 셀을 수정할 때
폼 제출: onFormSubmit() - 양식 제출 시
트리거 설정 방법:
1. 스크립트 편집기에서 왼쪽 메뉴의 시계 아이콘(⏰) 클릭
2. 오른쪽 하단 "+ 트리거 추가" 버튼 클릭
3. 실행할 함수와 시간 설정 후 저장
7 편집 이벤트 트리거
셀을 편집할 때 자동으로 실행되는 함수를 만듭니다:
/**
 * 셀이 편집될 때 자동 실행
 */
function onEdit(e) {
  let sheet = e.source.getActiveSheet();
  let 편집된행 = e.range.getRow();
  let 편집된열 = e.range.getColumn();
  let 새로운값 = e.value;
  
  // A열(1열)이 편집되면 B열에 시간 기록
  if (편집된열 === 1 && 편집된행 > 1) {
    let 지금 = new Date();
    let 시간 = Utilities.formatDate(지금, "Asia/Seoul", "yyyy-MM-dd HH:mm:ss");
    sheet.getRange(편집된행, 2).setValue(시간);
    sheet.getRange(편집된행, 2).setFontColor("#666666");
  }
  
  // C열(3열)에 점수를 입력하면 자동으로 등급 표시
  if (편집된열 === 3 && 편집된행 > 1) {
    let 점수 = parseFloat(새로운값);
    let 등급 = "";
    let 색상 = "";
    
    if (점수 >= 90) {
      등급 = "A";
      색상 = "#c8e6c9";
    } else if (점수 >= 80) {
      등급 = "B";
      색상 = "#fff9c4";
    } else if (점수 >= 70) {
      등급 = "C";
      색상 = "#ffecb3";
    } else {
      등급 = "D";
      색상 = "#ffcdd2";
    }
    
    sheet.getRange(편집된행, 4).setValue(등급);
    sheet.getRange(편집된행, 4).setBackground(색상);
  }
}
이 함수는 자동으로 실행됩니다. A열을 수정하면 B열에 시간이, C열에 점수를 입력하면 D열에 등급이 자동 표시됩니다!

🎯 실습 2: 자동 일일 보고서 시스템

8 자동 일일 보고서 이메일 발송
매일 정해진 시간에 자동으로 보고서를 이메일로 보냅니다:
/**
 * 일일 보고서 자동 발송 (트리거로 실행)
 */
function 자동일일보고서() {
  let sheet = SpreadsheetApp.getActiveSheet();
  
  // 보고서 데이터 수집
  let 마지막행 = sheet.getLastRow();
  if (마지막행 < 2) {
    Logger.log("데이터가 없습니다.");
    return;
  }
  
  // 데이터 읽기
  let 데이터 = sheet.getRange(2, 1, 마지막행 - 1, 3).getValues();
  let 오늘 = new Date();
  let 오늘문자열 = Utilities.formatDate(오늘, "Asia/Seoul", "yyyy년 MM월 dd일");
  
  // HTML 보고서 생성
  let HTML = `
    
                                                      
                

                
                
                
        
      
                

                
                











                
                
                                      
                
                
        

📊 일일 업무 보고서

${오늘문자열}

오늘의 데이터

`; let 총점수 = 0; for (let i = 0; i < 데이터.length; i++) { let 행 = 데이터[i]; HTML += ` `; 총점수 += parseFloat(행[2]) || 0; } let 평균점수 = (총점수 / 데이터.length).toFixed(1); HTML += `
이름 시간 점수
${행[0]} ${행[1]} ${행[2]}

📈 통계 요약

총 데이터 수: ${데이터.length}건

평균 점수: ${평균점수}점

총점: ${총점수}점

`; // 이메일 발송 let 받는사람 = Session.getActiveUser().getEmail(); let 제목 = "📊 [자동발송] " + 오늘문자열 + " 일일 보고서"; let 텍스트 = "일일 보고서입니다. HTML 형식으로 확인하세요."; try { GmailApp.sendEmail(받는사람, 제목, 텍스트, { htmlBody: HTML, name: "업무 자동화 시스템" }); Logger.log("일일 보고서가 발송되었습니다: " + 받는사람); } catch (e) { Logger.log("이메일 발송 실패: " + e.message); } } /** * 트리거 설정 함수 (한 번만 실행) */ function 트리거설정() { // 기존 트리거 삭제 let 기존트리거 = ScriptApp.getProjectTriggers(); for (let i = 0; i < 기존트리거.length; i++) { ScriptApp.deleteTrigger(기존트리거[i]); } // 매일 오전 9시에 실행되는 트리거 생성 ScriptApp.newTrigger('자동일일보고서') .timeBased() .atHour(9) .everyDays(1) .create(); Logger.log("트리거가 설정되었습니다. 매일 오전 9시에 보고서가 발송됩니다."); SpreadsheetApp.getActiveSpreadsheet().toast( "트리거 설정 완료! 매일 오전 9시에 보고서가 발송됩니다.", "완료", 5 ); }
1. 먼저 트리거설정() 함수를 실행하세요
2. 매일 오전 9시에 자동으로 보고서가 발송됩니다
3. 테스트하려면 자동일일보고서() 함수를 직접 실행하세요
💡 이메일 발송 팁
  • 일일 발송 제한: Gmail은 하루 100통(무료) 또는 1500통(G Suite) 제한이 있습니다
  • 대량 발송 시: Utilities.sleep()으로 발송 간격을 두세요
  • HTML 이메일: 인라인 스타일을 사용하면 호환성이 좋습니다
  • 테스트: 처음엔 자신에게만 보내서 테스트하세요
⚠️ 주의사항
  • 트리거는 계정당 실행 시간 제한이 있습니다 (하루 6시간)
  • onEdit()은 수동 편집에만 작동하며, 스크립트로 수정 시엔 작동하지 않습니다
  • 시간 기반 트리거는 정확한 시간이 아닌 ±15분 정도 오차가 있습니다
  • 이메일 발송 실패 시 오류 로그를 확인하세요
🎯 8차시 정리
이번 시간에는 Gmail을 통한 이메일 자동 발송과 트리거를 사용한 자동 실행을 배웠습니다.
HTML 형식의 이메일로 전문적인 보고서를 보낼 수 있고, 트리거로 완전 자동화가 가능합니다.
다음 차시에서는 구글 드라이브 연동과 외부 API 활용 방법을 배워보겠습니다.