
8차시: 이메일 자동화와 트리거
Gmail 연동과 시간 기반 자동 실행 배우기
📚 학습 목표
- GmailApp을 사용하여 이메일 자동 발송하기
- HTML 형식의 이메일 작성하기
- 트리거(Trigger)로 스크립트 자동 실행 설정하기
- 실전 예제: 자동 일일 보고서 이메일 발송 시스템
📧 이메일 발송 기초
1
GmailApp의 개념
GmailApp은 구글 앱스크립트에서 Gmail을 제어할 수 있는 서비스입니다. 이메일 발송, 수신, 검색 등의 작업을 자동화할 수 있습니다.
주요 기능:
• sendEmail(): 이메일 보내기
• getInboxThreads(): 받은 편지함 가져오기
• search(): 이메일 검색하기
• createDraft(): 임시 보관함에 저장
• sendEmail(): 이메일 보내기
• getInboxThreads(): 받은 편지함 가져오기
• search(): 이메일 검색하기
• createDraft(): 임시 보관함에 저장
🚀 실습 1: 기본 이메일 발송
2
간단한 텍스트 이메일 보내기
가장 기본적인 이메일을 보내봅시다:
실행 후 자신의 Gmail 받은편지함을 확인하세요!
function 기본이메일발송() {
// 자기 자신에게 테스트 이메일 보내기
let 받는사람 = Session.getActiveUser().getEmail();
let 제목 = "구글 앱스크립트 테스트 이메일";
let 내용 = "안녕하세요!\n\n이것은 구글 앱스크립트로 보낸 첫 번째 이메일입니다.\n\n감사합니다.";
GmailApp.sendEmail(받는사람, 제목, 내용);
Logger.log("이메일이 발송되었습니다: " + 받는사람);
SpreadsheetApp.getActiveSpreadsheet().toast(
"이메일이 발송되었습니다!",
"완료",
3
);
}
3
옵션이 포함된 이메일
참조, 숨은참조, 답장 주소 등을 설정할 수 있습니다:
실제 사용 시 cc, bcc는 실제 이메일 주소로 변경하세요.
function 고급이메일발송() {
let 받는사람 = Session.getActiveUser().getEmail();
let 제목 = "옵션이 포함된 이메일";
let 내용 = "이메일 본문 내용입니다.";
// 고급 옵션 설정
let 옵션 = {
cc: "cc@example.com", // 참조 (실제 이메일로 변경)
bcc: "bcc@example.com", // 숨은참조 (실제 이메일로 변경)
replyTo: 받는사람, // 답장 받을 주소
name: "자동화봇", // 발신자 이름
noReply: false // 답장 가능
};
GmailApp.sendEmail(받는사람, 제목, 내용, 옵션);
Logger.log("고급 이메일이 발송되었습니다.");
}
4
HTML 형식 이메일 보내기
디자인이 적용된 이메일을 보낼 수 있습니다:
실행하면 깔끔하게 디자인된 이메일이 발송됩니다!
function HTML이메일발송() {
let 받는사람 = Session.getActiveUser().getEmail();
let 제목 = "📊 매출 보고서";
// HTML 내용 작성
let HTML내용 = `
📊 월간 매출 보고서
`;
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() - 양식 제출 시
• 시간 기반: 특정 시간에 실행 (매일 오전 9시 등)
• 스프레드시트 열기: onOpen() - 파일을 열 때
• 스프레드시트 편집: onEdit() - 셀을 수정할 때
• 폼 제출: onFormSubmit() - 양식 제출 시
트리거 설정 방법:
1. 스크립트 편집기에서 왼쪽 메뉴의 시계 아이콘(⏰) 클릭
2. 오른쪽 하단 "+ 트리거 추가" 버튼 클릭
3. 실행할 함수와 시간 설정 후 저장
1. 스크립트 편집기에서 왼쪽 메뉴의 시계 아이콘(⏰) 클릭
2. 오른쪽 하단 "+ 트리거 추가" 버튼 클릭
3. 실행할 함수와 시간 설정 후 저장
7
편집 이벤트 트리거
셀을 편집할 때 자동으로 실행되는 함수를 만듭니다:
이 함수는 자동으로 실행됩니다. A열을 수정하면 B열에 시간이, C열에 점수를 입력하면 D열에 등급이 자동 표시됩니다!
/**
* 셀이 편집될 때 자동 실행
*/
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(색상);
}
}🎯 실습 2: 자동 일일 보고서 시스템
8
자동 일일 보고서 이메일 발송
매일 정해진 시간에 자동으로 보고서를 이메일로 보냅니다:
1. 먼저 트리거설정() 함수를 실행하세요
2. 매일 오전 9시에 자동으로 보고서가 발송됩니다
3. 테스트하려면 자동일일보고서() 함수를 직접 실행하세요
/**
* 일일 보고서 자동 발송 (트리거로 실행)
*/
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 += `
${행[0]}
${행[1]}
${행[2]}
`;
총점수 += parseFloat(행[2]) || 0;
}
let 평균점수 = (총점수 / 데이터.length).toFixed(1);
HTML += `
📈 통계 요약
총 데이터 수: ${데이터.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
);
}2. 매일 오전 9시에 자동으로 보고서가 발송됩니다
3. 테스트하려면 자동일일보고서() 함수를 직접 실행하세요
💡 이메일 발송 팁
- 일일 발송 제한: Gmail은 하루 100통(무료) 또는 1500통(G Suite) 제한이 있습니다
- 대량 발송 시: Utilities.sleep()으로 발송 간격을 두세요
- HTML 이메일: 인라인 스타일을 사용하면 호환성이 좋습니다
- 테스트: 처음엔 자신에게만 보내서 테스트하세요
⚠️ 주의사항
- 트리거는 계정당 실행 시간 제한이 있습니다 (하루 6시간)
- onEdit()은 수동 편집에만 작동하며, 스크립트로 수정 시엔 작동하지 않습니다
- 시간 기반 트리거는 정확한 시간이 아닌 ±15분 정도 오차가 있습니다
- 이메일 발송 실패 시 오류 로그를 확인하세요
🎯 8차시 정리
이번 시간에는 Gmail을 통한 이메일 자동 발송과 트리거를 사용한 자동 실행을 배웠습니다.HTML 형식의 이메일로 전문적인 보고서를 보낼 수 있고, 트리거로 완전 자동화가 가능합니다.
다음 차시에서는 구글 드라이브 연동과 외부 API 활용 방법을 배워보겠습니다.
'AppSheet' 카테고리의 다른 글
| 구글 앱스크립트 10차시 - 실전 프로젝트와 배포 (1) | 2025.12.20 |
|---|---|
| 구글 앱스크립트 9차시 - 구글 드라이브와 외부 API (3) | 2025.12.20 |
| 구글 앱스크립트 7차시 - 사용자 정의 함수와 메뉴 (2) | 2025.12.20 |
| 구글 앱스크립트 6차시 - 시트 관리와 데이터 정렬 (1) | 2025.12.20 |
| 구글 앱스크립트 5차시 - 스프레드시트 Range 다루기 (1) | 2025.12.20 |