구글 앱스 스크립트 업무 자동화 예제 총정리 (스프레드시트+Gmail)
매일 반복되는 보고서 작성, 메일 발송, 일정 등록. 이런 작업에 하루 30분씩만 써도 한 달이면 10시간이 넘습니다. 구글 앱스 스크립트(Google Apps Script)는 이런 반복 업무를 코드 몇 줄로 끝낼 수 있는 구글의 공식 자동화 도구입니다.
이 글에서는 실제로 업무에 바로 적용할 수 있는 예제와 함께, 막상 따라 해보면 걸리는 지점들까지 짚어보겠습니다.
구글 앱스 스크립트란
구글 앱스 스크립트는 구글 드라이브 기반의 클라우드형 자바스크립트 플랫폼입니다. Gmail, 스프레드시트, 문서, 캘린더 등 구글 워크스페이스 전 제품의 작업을 자동화하고 통합할 수 있도록 구글이 공식 제공하는 스크립팅 환경입니다.
엑셀 매크로나 VBA를 써봤다면 비슷한 개념이라고 생각하면 됩니다. 다만 클라우드 기반이라 별도 설치 없이 브라우저에서 바로 실행됩니다.
시작하려면 필요한 것:
| 항목 | 내용 |
|---|---|
| 계정 | 구글 계정 |
| 환경 | 인터넷 브라우저 |
| 회사 계정 사용 시 | 관리자 승인 필요할 수 있음 |
| 비용 | 무료 |
개인 Gmail 계정이라면 바로 시작할 수 있지만, 회사나 학교의 워크스페이스 계정이라면 관리자가 앱스 스크립트 사용을 차단해뒀을 수 있습니다. 이 부분은 아래에서 따로 다루겠습니다.
앱스 스크립트 시작하는 방법
script.google.com에 접속하면 바로 시작할 수 있습니다. 스프레드시트나 문서 안에서 작업하고 싶다면 상단 메뉴의 확장 프로그램 → Apps Script로 들어가면 해당 파일에 연결된 스크립트를 바로 작성할 수 있습니다.
기본 실행 절차
- script.google.com 접속 → 새 프로젝트 클릭
- 코드 작성 후 저장
- 실행 버튼 클릭
- 권한 요청 팝업에서 계정 선택 및 승인
- 결과 확인 (Gmail, 시트 등)
여기서 저도 처음엔 여기서 헤맸습니다. 실행 버튼을 눌렀는데 “이 앱은 Google에서 확인하지 않았습니다”라는 경고가 뜨면 대부분 뭔가 잘못됐다고 생각하고 멈춥니다. 하지만 이건 정상적인 절차입니다. 고급 → (프로젝트명)으로 이동(안전하지 않음)을 클릭하면 계속 진행할 수 있습니다.
실전 예제 1: 스프레드시트 데이터 자동 정리
가장 많이 쓰이는 예제입니다. 시트에 쌓인 데이터를 조건에 따라 정리하거나 새 행이 추가될 때마다 자동으로 처리하는 방식입니다.
기본 코드 구조:
function processSheetData() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("데이터");
var lastRow = sheet.getLastRow();
var data = sheet.getRange(2, 1, lastRow - 1, 3).getValues();
data.forEach(function(row, index) {
// 처리 로직
});
}
실제로 반복되는 질문은 getLastRow와 getRange를 쓸 때 헤더 행을 포함시켜서 데이터가 한 칸씩 밀리는 문제입니다. 위 코드처럼 시작 행을 2로 지정하면 헤더(1행)를 건너뛰고 실제 데이터부터 가져옵니다.
또 하나 자주 걸려 넘어지는 부분은 시트 이름을 바꾼 뒤 getSheetByName에 적어둔 이름을 그대로 두는 경우입니다. 시트명을 바꿨다면 코드 안의 이름도 반드시 함께 바꿔야 합니다.
실전 예제 2: 메일 병합 자동 발송
스프레드시트에 있는 명단을 기준으로 개인화된 메일을 자동 발송하는 예제입니다. 이름, 금액, 링크 등을 각 수신자에 맞게 넣어 보낼 수 있습니다.
기본 구조:
function sendPersonalizedEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
var name = data[i][0];
var email = data[i][1];
var subject = name + "님, 안내드립니다";
var body = name + "님 안녕하세요.n내용을 안내드립니다.";
GmailApp.sendEmail(email, subject, body);
}
}
여기서 많이들 걸려 넘어집니다. 명단이 수백 건을 넘어가면 어느 순간 메일이 더 이상 나가지 않습니다. 코드 오류라고 오해하기 쉽지만, 실제로는 Gmail 자체의 일일 발송 한도 때문입니다. 개인 Gmail 계정은 워크스페이스 계정보다 발송 한도가 낮게 설정되어 있습니다.
운영 팁:
- 처음엔 5~10건으로 소량 테스트 먼저 진행
- 대량 발송용 계정은 업무용 메인 계정과 분리
- 발송 완료 후 로그 시트에 기록해 중복 발송 방지
실전 예제 3: 폼 제출 시 자동 처리
구글 폼으로 신청을 받고, 제출되면 자동으로 시트에 기록하고 캘린더에 일정을 등록하거나 확인 메일을 보내는 방식입니다.
활용 시나리오:
| 단계 | 처리 내용 |
|---|---|
| 1 | 폼 제출 |
| 2 | 시트에 자동 기록 |
| 3 | 캘린더에 일정 등록 |
| 4 | 신청자에게 확인 메일 발송 |
이 흐름은 이벤트 신청 관리, 예약 접수, 상담 신청 같은 업무에 그대로 적용할 수 있습니다. 트리거 설정에서 “폼 제출 시”를 선택하면 자동으로 연결됩니다.
트리거 설정, 왜 이렇게 헷갈릴까
트리거는 스크립트를 언제 실행할지 정하는 설정입니다. 편집기 왼쪽 메뉴의 시계 아이콘(트리거)에서 설정할 수 있습니다.
트리거 종류:
- 시간 기반 (매일, 매시간 등)
- 폼 제출 시
- 스프레드시트 편집 시
- 파일 열림 시
자주 오해하는 부분이 있습니다. 시간 기반 트리거를 “매일 오전 9시”로 설정해도 정확히 9시 정각에 실행된다는 보장은 없습니다. 구글 서버 상황에 따라 몇 분 정도 지연될 수 있습니다. 정시 실행이 코드 오류라고 생각해서 계속 디버깅하는 경우가 많은데, 이는 앱스 스크립트의 정상적인 동작 범위입니다.
중요한 업무라면 중복 실행 방지 로직과 실패 로그를 함께 넣는 걸 권장합니다.
회사 계정에서 안 될 때 (워크스페이스 도메인 정책)
개인 Gmail에서는 잘 되던 스크립트가 회사 계정에서는 갑자기 안 되는 경우가 있습니다. 대부분의 튜토리얼이 개인 계정 기준이라 이 부분을 잘 다루지 않습니다.
회사 계정에서 막히는 대표 상황:
- “관리자가 이 앱을 차단했습니다” 메시지 노출
- 외부 API 호출(UrlFetchApp) 차단
- 외부 도메인으로 메일 발송 제한
- 앱스 스크립트 서비스 자체가 비활성화
이 경우 코드는 완전히 정상이어도 실행되지 않습니다. 코드를 아무리 뜯어봐도 원인을 못 찾는다면, 회사 워크스페이스 관리자에게 앱스 스크립트 사용 권한을 확인하는 게 먼저입니다.
확인 순서:
- 개인 Gmail 계정으로 동일 코드 테스트 → 정상 작동하면 도메인 정책 문제
- 관리자에게 앱스 스크립트 서비스 허용 여부 문의
- 외부 API 연동이 필요하다면 별도 승인 요청
새 편집기(IDE)로 바뀌면서 달라진 점
2020년 이후 앱스 스크립트 편집기는 완전히 개편됐습니다. 실시간 로그 스트리밍, 향상된 디버거, 자동 완성 기능이 추가됐고, V8 런타임을 지원하면서 기존 Rhino 런타임 디버거는 지원이 종료됐습니다.
오래된 유튜브 영상이나 블로그를 보고 따라 하다가 화면이 완전히 달라서 메뉴를 못 찾는 경우가 많습니다. 이 글의 모든 예제는 V8 런타임 기준으로 작성됐으니, 기존 Rhino 기준 예제 코드를 그대로 복붙하면 일부 전역 객체 처리 방식이 달라 오류가 날 수 있다는 점을 참고하세요.
프로젝트가 커지면: 구조화와 재사용
처음엔 함수 하나로 시작하지만, 자동화 범위가 넓어지면 코드가 뒤섞여 관리가 어려워집니다.
실무형 구조화 예시:
프로젝트
├── Config.gs (설정값 모음)
├── SheetUtils.gs (시트 관련 함수)
├── MailUtils.gs (메일 관련 함수)
└── Main.gs (실행 진입점)
함수를 파일별로 분리하면 디버깅할 때 어느 파일을 봐야 할지 명확해집니다. 반복적으로 쓰는 함수(날짜 포맷 변환, 시트 조회 등)는 별도 파일로 빼두면 다른 프로젝트에서도 재사용할 수 있습니다.
자주 발생하는 에러와 해결
| 에러 메시지 | 원인 | 해결 방법 |
|---|---|---|
| 이 앱은 Google에서 확인하지 않았습니다 | 정상 절차 | 고급 → 이동(안전하지 않음) 클릭 |
| 관리자가 이 앱을 차단했습니다 | 워크스페이스 정책 | 관리자에게 권한 요청 |
| Cannot read property of undefined | 범위(range) 참조 오류 | getRange 시작 행·열 확인 |
| 시트를 찾을 수 없음 | getSheetByName 이름 불일치 | 시트명과 코드 내 이름 재확인 |
| 발송 한도 초과 | Gmail 일일 발송 제한 | 발송량 조절, 계정 분리 |
챗GPT 연동, 가능하지만 주의할 점
최근에는 챗GPT API와 앱스 스크립트를 연동해 콘텐츠 요약이나 메일 답변 초안을 자동 생성하는 사례도 늘고 있습니다. UrlFetchApp으로 외부 API를 호출하는 방식인데, 이는 구글의 공식 문서보다는 3rd-party 튜토리얼 중심으로 퍼져 있는 실험적인 활용법입니다.
⚠️ 회사 네트워크나 워크스페이스 관리 정책에 따라 외부 API 호출이 차단될 수 있으니, 개인 계정에서 먼저 테스트해보는 걸 권장합니다. 또한 OpenAI와 구글 양쪽의 정책 변경에 따라 코드나 사용 범위가 달라질 수 있다는 점도 참고하세요.
웹 앱으로 확장하기
자동화 로직에 간단한 HTML 화면을 붙이면 팀원들이 URL만으로 접근할 수 있는 내부 도구로 만들 수 있습니다. 별도 설치 없이 브라우저에서 바로 쓸 수 있어 폼을 대체하는 용도로도 활용됩니다.
배포 시에는 편집기 내에서 버전과 배포 유형(웹 앱, API 실행형 등)을 관리할 수 있습니다.
자주 묻는 질문
구글 앱스 스크립트는 완전 무료인가요?
네, 구글 계정만 있으면 별도 비용 없이 사용할 수 있습니다. 다만 실행 시간, 트리거 횟수, 이메일 발송량 등에는 계정 유형별 한도가 있습니다.
회사 계정에서 스크립트가 갑자기 안 될 때 뭘 먼저 확인해야 하나요?
같은 코드를 개인 Gmail 계정에서 먼저 테스트해보세요. 개인 계정에서 정상 작동한다면 회사 워크스페이스의 관리자 정책 때문일 가능성이 높습니다. 이 경우 관리자에게 앱스 스크립트 사용 권한을 확인해야 합니다.
메일 자동 발송이 중간에 멈추는 이유는 무엇인가요?
대부분 코드 오류가 아니라 Gmail의 일일 발송 한도 때문입니다. 개인 계정은 발송 한도가 상대적으로 낮으므로, 대량 발송이 필요하다면 소량으로 나눠 테스트하고 발송 전용 계정을 분리하는 방식을 권장합니다.
