Apps Script 자동 실행 오류는 권한 승인, 트리거 등록, 함수명, 실행 계정 순서로 확인하면 원인을 좁히기 쉽습니다.
Google Apps Script 트리거가 자동으로 실행되지 않는다면 코드를 바로 고치기보다 먼저 권한 승인, 트리거 등록 여부, 함수명 변경, 실행 계정, 시간 기반 트리거 주기를 차례대로 확인해야 합니다. 특히 Gmail, Google Sheets, Forms처럼 사용자 데이터에 접근하는 자동화는 권한 승인이 끝나지 않았거나 실행 계정이 달라지면 정상 코드도 멈출 수 있습니다.
오류를 해결할 때는 트리거를 삭제하거나 스크립트를 새로 만들기 전에 실행 기록을 먼저 확인합니다. Apps Script 편집기 왼쪽의 실행 기록과 트리거 메뉴에서 실패한 시간, 오류 메시지, 실행된 함수명을 보면 불필요한 재설정을 줄일 수 있습니다.
먼저 확인할 결론
자동 실행이 안 될 때는 코드보다 트리거 상태를 먼저 봐야 합니다. 실행할 함수명이 실제 코드와 같은지, 권한 승인이 완료됐는지, 시간 기반 트리거가 등록되어 있는지, 어떤 계정으로 실행되는지 확인하는 순서가 가장 안전합니다.
Apps Script 트리거 오류가 나는 대표 상황
Apps Script 트리거 오류는 대부분 “코드는 맞는 것 같은데 자동으로 실행되지 않는 상황”에서 발견됩니다. 수동 실행은 되는데 예약 실행이 안 되거나, 처음에는 되다가 함수명을 바꾼 뒤 멈추는 경우가 많습니다.
| 증상 | 가능한 원인 | 먼저 볼 곳 |
|---|---|---|
| 예약 실행이 안 됨 | 시간 기반 트리거 미등록 또는 주기 설정 문제 | 트리거 메뉴 |
| Authorization required 메시지 | Gmail, Sheets, Drive 접근 권한 미승인 | 수동 실행과 권한 승인 화면 |
| 함수를 찾을 수 없음 | 트리거에 연결된 함수명을 변경함 | 트리거의 실행 함수명 |
| 내 계정에서는 되지만 다른 계정은 안 됨 | 실행 계정, 파일 권한, Workspace 정책 차이 | 파일 공유 권한과 관리자 설정 |
먼저 확인할 5가지
트리거 오류는 한 번에 여러 원인이 겹칠 수 있습니다. 아래 순서대로 확인하면 가장 흔한 원인부터 빠르게 걸러낼 수 있습니다.
트리거 오류 점검 순서
1. 함수명이 바뀌었는지 확인합니다.
2. 트리거가 실제로 등록되어 있는지 확인합니다.
3. 권한 승인을 완료했는지 확인합니다.
4. 실행 계정과 파일 접근 권한이 맞는지 확인합니다.
5. 시간 기반 트리거 주기가 너무 촘촘하지 않은지 확인합니다.
함수명이 바뀌었는지 확인하기
트리거는 특정 함수명을 기준으로 실행됩니다. 예를 들어 처음에는 sendEmailReport 함수에 트리거를 연결했는데 나중에 함수명을 sendDailyEmailReport로 바꾸면 기존 트리거는 바뀐 이름을 자동으로 따라가지 못할 수 있습니다.
function sendDailyEmailReport() {
// 매일 실행할 자동화 코드
}
이 경우 트리거 메뉴에서 기존 트리거를 수정하거나 새 함수명으로 다시 연결해야 합니다. 함수명은 대소문자까지 정확히 맞아야 하므로 코드의 함수명과 트리거의 실행 함수명을 함께 확인합니다.
트리거가 실제로 등록되어 있는지 확인하기
코드를 저장했다고 해서 자동 실행 트리거가 자동으로 생기지는 않습니다. 시간 기반 실행, 특정 시트 열기, 양식 제출 같은 자동 실행은 트리거 메뉴에서 별도로 등록해야 합니다.
Apps Script 편집기에서 왼쪽 메뉴의 트리거를 열고, 실행할 함수와 이벤트 소스, 이벤트 유형이 맞는지 확인합니다. 트리거 목록이 비어 있다면 자동 실행 설정이 아직 없는 상태입니다.
권한 승인을 완료했는지 확인하기
Gmail 메일 읽기, Google Sheets 수정, Drive 파일 접근처럼 사용자 데이터에 접근하는 스크립트는 권한 승인이 필요합니다. 처음 실행하는 함수라면 자동 실행 전에 편집기에서 한 번 수동 실행해 권한 승인 화면을 완료하는 것이 좋습니다.
function testPermission() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange("A1").setValue("권한 테스트 완료");
}
위와 같은 간단한 테스트 함수를 먼저 실행하면 Google Sheets 접근 권한이 필요한지 확인할 수 있습니다. 권한 승인이 끝난 뒤 실제 자동화 함수를 다시 실행해 보는 순서가 안전합니다.
실행 계정이 맞는지 확인하기
설치형 트리거는 보통 트리거를 만든 계정의 권한과 연결됩니다. 개인 계정으로 만든 트리거를 회사 계정 파일에서 사용하거나, 다른 사람이 소유한 스프레드시트에 접근하는 경우 권한 차이 때문에 실행이 실패할 수 있습니다.
자동화가 접근해야 하는 Google Sheets, Gmail, Drive 파일을 실행 계정이 실제로 열 수 있는지 확인합니다. 파일 소유자와 트리거 생성자가 다르면 공유 권한도 함께 봐야 합니다.
시간 기반 트리거 주기를 확인하기
시간 기반 트리거는 매분, 매시간, 매일처럼 일정 주기로 실행하도록 설정할 수 있습니다. 다만 너무 촘촘한 실행 주기는 할당량, 실행 시간, 외부 서비스 호출 제한에 걸릴 수 있으므로 처음부터 짧은 주기로 반복 실행하는 방식은 피하는 것이 좋습니다.
Authorization required 메시지 원인
Authorization required는 스크립트가 사용자의 Google 데이터에 접근하려고 하지만 아직 필요한 권한을 받지 못했을 때 자주 나타납니다. Gmail 메일 읽기, 스프레드시트 쓰기, Drive 파일 검색, Calendar 일정 생성처럼 개인 데이터와 연결되는 작업에서 특히 많이 보입니다.
해결 순서는 간단합니다. 먼저 자동 실행에 연결된 함수가 아니라 실제 권한이 필요한 함수를 편집기에서 직접 실행합니다. 이후 Google 계정 선택, 권한 요청 확인, 허용 단계를 완료한 뒤 트리거를 다시 실행합니다.
function checkGmailPermission() {
const threads = GmailApp.search("newer_than:1d", 0, 5);
console.log(threads.length);
}
Gmail 자동화라면 위처럼 최소한의 Gmail 접근 테스트를 먼저 실행할 수 있습니다. 회사 계정에서는 관리자가 Gmail API 접근이나 외부 앱 권한을 제한했을 수 있으므로, 개인 계정에서 되는 코드가 회사 계정에서 바로 되는 것은 아닙니다.
주의할 점
권한 오류가 난다고 해서 스크립트를 바로 삭제할 필요는 없습니다. 어떤 서비스 권한이 필요한지 확인하고, 실행 계정이 해당 파일과 서비스에 접근할 수 있는지 먼저 점검하는 것이 안전합니다.
시간 기반 트리거가 실행되지 않을 때
시간 기반 트리거는 사용자가 직접 버튼을 누르지 않아도 정해진 시간에 함수를 실행하는 방식입니다. 예약 실행이 안 된다면 트리거가 등록되어 있는지, 연결된 함수명이 맞는지, 실행 기록에 실패 로그가 남았는지부터 확인합니다.
예를 들어 매일 오전에 메일 보고서를 보내려면 아래처럼 스크립트로 트리거를 만들 수도 있습니다. 다만 같은 함수를 여러 번 실행해 중복 트리거가 생기지 않도록 주의해야 합니다.
function createDailyTrigger() {
ScriptApp.newTrigger("sendDailyReport")
.timeBased()
.everyDays(1)
.atHour(9)
.create();
}
function sendDailyReport() {
console.log("daily report");
}
트리거가 여러 개 중복 등록되면 같은 작업이 반복 실행될 수 있습니다. 트리거 메뉴에서 같은 함수명으로 여러 트리거가 등록되어 있는지 확인하고, 불필요한 트리거는 삭제합니다.
Gmail·Sheets 권한 오류가 날 때
Gmail과 Google Sheets를 함께 쓰는 자동화는 권한 범위가 넓어질 수 있습니다. 문의 메일을 읽고, 내용을 시트에 적고, 처리 상태를 업데이트하는 자동화라면 Gmail 읽기 권한과 Sheets 수정 권한이 함께 필요합니다.
오류 원인을 좁히려면 전체 자동화를 한 번에 실행하지 말고 Gmail 접근 테스트와 Sheets 쓰기 테스트를 나누어 확인합니다.
function testSheetWrite() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.appendRow([new Date(), "Sheets 쓰기 테스트"]);
}
function testGmailRead() {
const threads = GmailApp.search("is:unread", 0, 3);
console.log("unread threads:", threads.length);
}
| 오류 위치 | 확인할 권한 | 점검 방법 |
|---|---|---|
| Gmail 읽기 | 메일 검색과 읽기 권한 | 간단한 Gmail 검색 함수 수동 실행 |
| Sheets 쓰기 | 스프레드시트 수정 권한 | 테스트 행 추가 함수 실행 |
| Drive 파일 접근 | 파일 열람 또는 수정 권한 | 파일 소유자와 공유 범위 확인 |
함수명 변경 후 트리거 다시 연결하는 방법
함수명을 바꾼 뒤 자동 실행이 멈췄다면 트리거가 여전히 예전 함수명을 바라보고 있을 가능성이 있습니다. 이때는 기존 트리거를 무리하게 유지하기보다 현재 코드의 함수명에 맞춰 다시 연결하는 편이 깔끔합니다.
확인 순서는 다음과 같습니다.
- Apps Script 편집기에서 현재 함수명을 확인합니다.
- 왼쪽 메뉴에서 트리거를 엽니다.
- 실행할 함수가 예전 이름으로 되어 있는지 확인합니다.
- 잘못된 트리거를 삭제하거나 수정합니다.
- 현재 함수명으로 새 트리거를 등록합니다.
- 수동 실행으로 권한 승인과 오류 여부를 먼저 확인합니다.
- 실행 기록에서 자동 실행 결과를 확인합니다.
함수명을 바꿀 때는 자동 실행에 연결된 함수와 내부에서 호출되는 함수명을 구분해야 합니다. 트리거에는 보통 시작점 역할을 하는 함수 하나만 연결하고, 그 안에서 다른 보조 함수를 호출하는 방식이 관리하기 쉽습니다.
function runAutomation() {
collectGmailMessages();
writeToSheet();
}
function collectGmailMessages() {
// Gmail 처리
}
function writeToSheet() {
// Sheets 기록
}
실행 로그에서 오류 확인하는 방법
자동 실행은 화면에서 바로 보이지 않기 때문에 실행 로그 확인이 중요합니다. Apps Script 편집기 왼쪽의 실행 기록에서 언제 실행됐는지, 어떤 함수가 실패했는지, 오류 메시지가 무엇인지 확인할 수 있습니다.
실행 로그를 더 보기 쉽게 남기려면 중요한 지점마다 console.log()를 넣습니다. 로그는 오류 원인을 좁히는 데 도움이 되며, 어느 단계까지 정상 실행됐는지 확인할 수 있습니다.
function runAutomation() {
console.log("자동화 시작");
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
console.log("시트 접근 성공");
sheet.appendRow([new Date(), "테스트"]);
console.log("시트 기록 완료");
}
실행 기록에서 실패한 실행을 열어 보면 오류가 발생한 줄과 메시지를 확인할 수 있습니다. 권한 문제, 함수명 문제, 할당량 문제는 메시지 표현이 다르므로 오류 문구를 그대로 확인하는 것이 중요합니다.
회사 Google Workspace 계정에서 막힐 수 있는 부분
회사 Google Workspace 계정은 개인 Gmail 계정보다 제한이 많을 수 있습니다. 관리자가 외부 앱 권한, 민감한 OAuth 범위, Gmail 접근, Drive 공유 정책을 제한해 두면 코드가 맞아도 실행이 막힐 수 있습니다.
특히 회사 계정에서 자동화가 실패한다면 아래 항목을 확인합니다.
Workspace 계정 체크리스트
1. 자동화를 실행하는 계정이 해당 시트의 편집 권한을 가지고 있는지 확인합니다.
2. Gmail 접근을 사용하는 스크립트가 조직 정책에 막히지 않는지 확인합니다.
3. 외부 공유된 파일을 읽어야 한다면 Drive 공유 정책을 확인합니다.
4. 다른 사람이 만든 트리거라면 트리거 생성 계정을 확인합니다.
5. 조직 관리자에게 Apps Script와 OAuth 앱 사용 제한 여부를 문의합니다.
팀에서 쓰는 자동화라면 개인 계정에만 의존하지 않는 구조가 좋습니다. 담당자가 바뀌거나 계정이 비활성화되면 트리거 실행도 영향을 받을 수 있으므로, 소유자와 실행 계정을 문서로 남겨 두는 편이 안전합니다.
재발 방지 체크리스트
트리거 오류는 한 번 해결해도 함수명 변경, 파일 소유자 변경, 권한 정책 변경 때문에 다시 생길 수 있습니다. 자동화가 업무에 영향을 준다면 간단한 운영 체크리스트를 만들어 두는 것이 좋습니다.
| 체크 항목 | 확인 기준 | 권장 방식 |
|---|---|---|
| 함수명 | 트리거와 코드의 함수명이 같은지 | 시작 함수명은 자주 바꾸지 않기 |
| 권한 승인 | 필요한 Google 서비스 권한을 승인했는지 | 배포 전 수동 실행으로 확인 |
| 실행 계정 | 파일과 서비스에 접근 가능한 계정인지 | 소유자와 트리거 생성 계정 기록 |
| 실행 로그 | 실패 기록과 오류 문구가 남는지 | console.log()로 주요 단계 기록 |
자동 실행 오류는 함수명, 트리거 등록, 권한 승인, 실행 계정, 실행 로그 순서로 확인하면 원인을 좁히기 쉽습니다.
공식 자료로 더 확인하기
Apps Script의 권한, 트리거, 실행 기록은 Google 공식 문서 기준으로 확인하는 것이 가장 안전합니다. 화면 구성과 제한은 바뀔 수 있으므로, 실제 운영 자동화라면 공식 문서에서 최신 기준을 함께 확인하는 것이 좋습니다.
시간 기반 트리거, 이벤트 기반 트리거, 설치형 트리거의 동작 방식과 제한 사항을 확인할 수 있습니다.
Apps Script 설치형 트리거 기준 확인하기Gmail, Sheets, Drive 같은 Google 서비스에 접근할 때 필요한 OAuth 권한과 승인 흐름을 확인할 수 있습니다.
Apps Script 권한 승인 흐름 확인하기실행 기록, 오류 메시지, 로그 확인 방법처럼 스크립트가 실패했을 때 원인을 추적하는 기본 방법을 확인할 수 있습니다.
Apps Script 실행 오류 점검 방법 확인하기함께 보면 좋은 글
자주 묻는 질문
Apps Script 트리거 오류는 코드를 지우기보다 함수명, 트리거 등록, 권한 승인, 실행 계정, 실행 기록을 차례대로 확인하는 방식이 가장 안전합니다.
댓글