"자동화"라는 말을 들으면 코딩부터 떠오르시나요?
구글 앱스 스크립트(Google Apps Script, GAS)는 자바스크립트 기반이지만, 이 글의 예제들은 코드를 통째로 복붙해서 쓰는 방식이에요. 코딩을 몰라도 따라할 수 있어요.
구글 시트·폼·Gmail·캘린더가 모두 연결되어 있어서 — 폼 응답이 들어오면 이메일 발송, 마감일 3일 전 자동 알림, 완료 업무 자동 정리 같은 것들이 가능해요. 소규모 팀에서 실제로 쓸 수 있는 예제 5가지를 처음부터 따라할 수 있게 정리해봤습니다.
앱스 스크립트 편집기 여는 법
모든 예제는 여기서 시작해요.
📋 편집기 열기 순서
- 구글 시트 열기
- 상단 메뉴 → 확장 프로그램 → Apps Script 클릭
- 스크립트 편집기 창이 새 탭으로 열림
- 기존 코드 전체 삭제 후 아래 예제 코드 붙여넣기
- 저장(
Ctrl+S) 후 실행
예제 1 — 폼 응답이 들어오면 자동 이메일 발송
예제 1
폼 응답 수신 시 팀장에게 자동 알림 이메일
💡 이럴 때 유용해요
팀원이 주간 보고를 제출하면 팀장에게 자동 알림 · 거래처 신청 폼에 새 응답이 오면 즉시 확인
function onFormSubmit(e) {
// 알림 받을 이메일 주소 ← 본인 이메일로 변경
var email = "팀장이메일@gmail.com";
// 폼 응답 값 가져오기 (순서는 질문 순서와 동일)
var responses = e.values;
var timestamp = responses[0];
var name = responses[1];
var content = responses[2];
// 이메일 제목과 본문 작성
var subject = "[자동알림] " + name + "님의 보고가 도착했습니다";
var body = "제출 시간: " + timestamp + "\n"
+ "이름: " + name + "\n"
+ "내용: " + content;
GmailApp.sendEmail(email, subject, body);
}
// 알림 받을 이메일 주소 ← 본인 이메일로 변경
var email = "팀장이메일@gmail.com";
// 폼 응답 값 가져오기 (순서는 질문 순서와 동일)
var responses = e.values;
var timestamp = responses[0];
var name = responses[1];
var content = responses[2];
// 이메일 제목과 본문 작성
var subject = "[자동알림] " + name + "님의 보고가 도착했습니다";
var body = "제출 시간: " + timestamp + "\n"
+ "이름: " + name + "\n"
+ "내용: " + content;
GmailApp.sendEmail(email, subject, body);
}
⚙️ 트리거 설정 — 폼 제출 시 자동 실행
- 편집기 왼쪽 메뉴 → 시계 아이콘(트리거) 클릭
- + 트리거 추가 클릭
- 함수 선택 →
onFormSubmit - 이벤트 소스 → 스프레드시트에서
- 이벤트 유형 → 폼 제출 시
- 저장 클릭
예제 2 — 마감일 3일 전 담당자에게 자동 알림
예제 2
업무 현황판 시트 기반 마감 임박 자동 알림
💡 이럴 때 유용해요
담당자가 마감일을 놓치는 일 방지 · 매일 자동으로 마감 임박 업무 점검
function sendDeadlineAlert() {
var sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName("업무현황"); // ← 시트 이름 변경
var data = sheet.getDataRange().getValues();
var today = new Date();
for (var i = 1; i < data.length; i++) {
var taskName = data[i][0]; // A열: 업무명
var assignee = data[i][1]; // B열: 담당자 이메일 ← 열 번호 확인
var status = data[i][3]; // D열: 상태
var deadline = new Date(data[i][4]); // E열: 마감일
if (status === "완료") continue; // 완료 업무 제외
var daysLeft = Math.ceil((deadline - today) / (1000 * 60 * 60 * 24));
if (daysLeft <= 3 && daysLeft >= 0) {
var subject = "[마감 임박] '" + taskName + "' " + daysLeft + "일 남았습니다";
var body = "업무명: " + taskName + "\n마감일: "
+ deadline.toLocaleDateString() + "\n남은 일수: " + daysLeft + "일";
GmailApp.sendEmail(assignee, subject, body);
}
}
}
var sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName("업무현황"); // ← 시트 이름 변경
var data = sheet.getDataRange().getValues();
var today = new Date();
for (var i = 1; i < data.length; i++) {
var taskName = data[i][0]; // A열: 업무명
var assignee = data[i][1]; // B열: 담당자 이메일 ← 열 번호 확인
var status = data[i][3]; // D열: 상태
var deadline = new Date(data[i][4]); // E열: 마감일
if (status === "완료") continue; // 완료 업무 제외
var daysLeft = Math.ceil((deadline - today) / (1000 * 60 * 60 * 24));
if (daysLeft <= 3 && daysLeft >= 0) {
var subject = "[마감 임박] '" + taskName + "' " + daysLeft + "일 남았습니다";
var body = "업무명: " + taskName + "\n마감일: "
+ deadline.toLocaleDateString() + "\n남은 일수: " + daysLeft + "일";
GmailApp.sendEmail(assignee, subject, body);
}
}
}
⚙️ 트리거 설정 — 매일 오전 9시 자동 실행
- 트리거 추가 → 함수
sendDeadlineAlert - 이벤트 소스 → 시간 기반
- 시간 기반 트리거 유형 → 일 타이머
- 시간 → 오전 9시~10시 선택 → 저장
예제 3 — 매주 월요일 완료 업무 자동 정리
예제 3
"완료" 행을 별도 시트로 이동 — 현황판 자동 정리
💡 이럴 때 유용해요
주간 단위로 업무 관리하는 팀 · 완료 이력은 보관하면서 현황판은 항상 깔끔하게 유지
function archiveCompletedTasks() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var mainSheet = ss.getSheetByName("업무현황");
var archiveSheet = ss.getSheetByName("완료이력");
// 완료이력 시트가 없으면 자동 생성
if (!archiveSheet) {
archiveSheet = ss.insertSheet("완료이력");
}
var data = mainSheet.getDataRange().getValues();
var toDelete = [];
for (var i = data.length - 1; i >= 1; i--) {
if (data[i][3] === "완료") { // D열이 "완료"인 행
archiveSheet.appendRow(data[i]);
toDelete.push(i + 1);
}
}
toDelete.forEach(function(row) {
mainSheet.deleteRow(row);
});
}
var ss = SpreadsheetApp.getActiveSpreadsheet();
var mainSheet = ss.getSheetByName("업무현황");
var archiveSheet = ss.getSheetByName("완료이력");
// 완료이력 시트가 없으면 자동 생성
if (!archiveSheet) {
archiveSheet = ss.insertSheet("완료이력");
}
var data = mainSheet.getDataRange().getValues();
var toDelete = [];
for (var i = data.length - 1; i >= 1; i--) {
if (data[i][3] === "완료") { // D열이 "완료"인 행
archiveSheet.appendRow(data[i]);
toDelete.push(i + 1);
}
}
toDelete.forEach(function(row) {
mainSheet.deleteRow(row);
});
}
⚙️ 트리거 설정 — 매주 월요일 오전 8시 자동 실행
- 트리거 추가 → 함수
archiveCompletedTasks - 이벤트 소스 → 시간 기반
- 시간 기반 트리거 유형 → 주 타이머
- 요일 → 월요일 / 시간 → 오전 8시~9시 → 저장
예제 4 — 시트 데이터로 개인별 이메일 자동 발송
예제 4
팀원 각자에게 맞춤 이메일 자동 발송
💡 이럴 때 유용해요
주간 업무 요약을 팀원 각자에게 개별 발송 · 거래처별 맞춤 안내 이메일 대량 발송
function sendPersonalizedEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet()
.getActiveSheet();
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) { // 1행은 헤더
var name = data[i][0]; // A열: 이름
var email = data[i][1]; // B열: 이메일
var task = data[i][2]; // C열: 업무 내용
if (!email) continue; // 이메일 없으면 건너뜀
var subject = name + "님의 이번 주 업무 요약";
var body = name + "님 안녕하세요.\n\n"
+ "이번 주 담당 업무를 안내해드립니다.\n\n"
+ task + "\n\n감사합니다.";
GmailApp.sendEmail(email, subject, body);
}
}
var sheet = SpreadsheetApp.getActiveSpreadsheet()
.getActiveSheet();
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) { // 1행은 헤더
var name = data[i][0]; // A열: 이름
var email = data[i][1]; // B열: 이메일
var task = data[i][2]; // C열: 업무 내용
if (!email) continue; // 이메일 없으면 건너뜀
var subject = name + "님의 이번 주 업무 요약";
var body = name + "님 안녕하세요.\n\n"
+ "이번 주 담당 업무를 안내해드립니다.\n\n"
+ task + "\n\n감사합니다.";
GmailApp.sendEmail(email, subject, body);
}
}
💡 시트에 이름(A열)·이메일(B열)·업무내용(C열)이 있으면 바로 쓸 수 있어요. 열 순서가 다르다면
data[i][0]의 숫자만 바꾸면 돼요. (0=A열, 1=B열, 2=C열)
예제 5 — 구글 캘린더에 업무 일정 자동 등록
예제 5
현황판 마감일을 캘린더에 자동 등록
💡 이럴 때 유용해요
현황판에 업무 추가할 때 캘린더에도 자동 등록 · 팀 전체 일정 공유 자동화
function addToCalendar() {
var sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName("업무현황");
var data = sheet.getDataRange().getValues();
var calendar = CalendarApp.getDefaultCalendar();
for (var i = 1; i < data.length; i++) {
var taskName = data[i][0]; // A열: 업무명
var deadline = new Date(data[i][4]); // E열: 마감일
var registered = data[i][6]; // G열: 등록 여부 확인
if (registered === "등록완료") continue;
if (!taskName || !deadline) continue;
// 캘린더에 종일 이벤트로 등록
calendar.createAllDayEvent("[마감] " + taskName, deadline);
// G열에 등록완료 표시 (중복 등록 방지)
sheet.getRange(i + 1, 7).setValue("등록완료");
}
}
var sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName("업무현황");
var data = sheet.getDataRange().getValues();
var calendar = CalendarApp.getDefaultCalendar();
for (var i = 1; i < data.length; i++) {
var taskName = data[i][0]; // A열: 업무명
var deadline = new Date(data[i][4]); // E열: 마감일
var registered = data[i][6]; // G열: 등록 여부 확인
if (registered === "등록완료") continue;
if (!taskName || !deadline) continue;
// 캘린더에 종일 이벤트로 등록
calendar.createAllDayEvent("[마감] " + taskName, deadline);
// G열에 등록완료 표시 (중복 등록 방지)
sheet.getRange(i + 1, 7).setValue("등록완료");
}
}
코드에서 바꿔야 할 부분만 정리
각 예제에서 본인 상황에 맞게 수정할 부분은 이것뿐이에요.
| 예제 | 수정할 부분 | 변경 내용 |
|---|---|---|
| 예제 1 | "팀장이메일@gmail.com" | 본인 Gmail 주소로 변경 |
| 예제 1 | responses[1], responses[2] | 폼 질문 순서에 맞게 번호 조정 |
| 예제 2·3·5 | "업무현황" | 실제 시트 이름으로 변경 |
| 예제 2 | data[i][1] (담당자) | 담당자 이메일이 있는 열 번호로 변경 |
| 예제 4 | data[i][0], [1], [2] | 이름·이메일·업무 열 번호 확인 후 조정 |
💡 열 번호 기준 — A열=0, B열=1, C열=2, D열=3, E열=4 순서예요. 시트에서 해당 열이 몇 번째인지 세어보고 숫자를 바꾸면 돼요.
처음 실행할 때 권한 허용이 필요해요
⚠️ 스크립트를 처음 실행하면 Gmail·캘린더·시트 접근 권한을 요청하는 창이 떠요. 허용을 눌러야 정상 작동해요.
"이 앱은 Google에서 확인하지 않았습니다"라는 경고가 뜰 수 있는데, 본인이 직접 작성·복붙한 스크립트라면 고급 → 안전하지 않은 페이지로 이동 → 계속을 클릭하면 돼요.
"이 앱은 Google에서 확인하지 않았습니다"라는 경고가 뜰 수 있는데, 본인이 직접 작성·복붙한 스크립트라면 고급 → 안전하지 않은 페이지로 이동 → 계속을 클릭하면 돼요.
✅ 핵심 요약
- 확장 프로그램 → Apps Script에서 코드 복붙 후 이메일·시트명만 수정하면 바로 사용 가능
- 트리거 설정으로 폼 제출 시·매일·매주 등 원하는 시점에 자동 실행
- 예제 1 — 폼 응답 시 즉시 알림 / 예제 2 — 마감 3일 전 자동 알림
- 예제 3 — 완료 업무 자동 정리 / 예제 4 — 개인별 맞춤 이메일 발송
- 예제 5 — 현황판 마감일 캘린더 자동 등록
- 열 번호 기준: A=0, B=1, C=2, D=3, E=4
앱스 스크립트, 처음엔 낯설어 보여도 코드를 통째로 복붙하고 이메일 주소나 시트 이름만 바꾸면 작동해요. 예제 1번부터 하나씩 따라해보세요.
궁금한 점은 댓글로 남겨주세요!
반복 업무 자동화, 처음 세팅하는 데 30분이면 충분해요.
예제 2번 마감 알림 자동화 하나만 돌려도 "마감 잊어버렸어요"라는 말이 팀에서 사라집니다.
📌 다음 글에서는 구글 캘린더 팀 공유 세팅법 — 거래처·내부 부서 일정 충돌 없이 관리하는 법을 다룹니다.
📂 구글 워크스페이스 소규모 팀 협업 시리즈
- 구글 워크스페이스로 팀 협업 시작하기 — 팀즈 쓰다 갈아탄 이유와 첫 세팅
- 구글 공유 드라이브 세팅법 — 소규모 팀 자료 보관 구조 처음부터 잡는 법
- 구글 독스·시트 공동 편집 실전 — 팀 문서 버전 관리와 협업 루틴
- 구글 시트로 팀 업무 현황판 만들기 — 코딩 없이 10분이면 완성
- 구글 폼 + 시트 연동으로 업무 자동 취합하기
- ▶ 구글 앱스 스크립트 입문 — 반복 업무 자동화 실전 예제 5가지 (현재 글)
- 구글 캘린더 팀 공유 세팅법 (예정)
- Gmail 라벨·필터 자동화 (예정)
- 구글 워크스페이스 소규모 팀 세팅 총정리 (예정)
'IT' 카테고리의 다른 글
| 구글 폼 + 시트 연동으로 업무 자동 취합하기 — 신청·보고·설문 한 번에 정리 [초보자 가이드] (0) | 2026.04.16 |
|---|---|
| 시트로 팀 업무 현황판 만들기 — 코딩 없이 10분이면 완성되는 대시보드 [초보자 가이드] (0) | 2026.04.15 |
| 구글 독스·시트 공동 편집 실전 — 팀 문서 버전 관리와 협업 루틴 [초보자 가이드] (0) | 2026.04.14 |
| 구글 공유 드라이브 세팅법 — 소규모 팀 자료 보관 구조 처음부터 잡는 법 [초보자 가이드] (0) | 2026.04.13 |
| 구글 워크스페이스로 팀 협업 시작하기 — 팀즈 쓰다 갈아탄 이유와 첫 세팅 (0) | 2026.04.12 |