챕터 8

막혔을 때와 오래 쓰는 법 — 오류 사전·보안·유지보수

자동화는 만든 뒤가 더 중요합니다. 자주 만나는 오류 메시지별 해결법, 개인정보·회사 데이터를 AI에 넘길 때의 원칙, 권한과 한도 관리, 인수인계를 위한 주석·문서화, 다음 단계로 넘어가는 방법을 정리합니다.

오류 사전: 메시지별 원인과 해결

7장까지 만든 스크립트는 한 번 돌아갔다고 끝이 아닙니다. 시트 이름이 바뀌고, 파일 형식이 달라지고, 하루 한도가 차는 날이 옵니다. 그때 가장 빠른 길은 오류 메시지를 한 글자도 고치지 않고 AI에게 다시 붙여 넣는 것입니다. 2장에서 익힌 수정 대화 그대로입니다. 다만 메시지가 무슨 뜻인지 알면 AI에게 물을 질문이 더 정확해집니다.

앱스 스크립트 오류

오류 원문 원인 해결 관련 장
TypeError: Cannot read properties of null (reading 'getDataRange') getSheetByName에 넣은 시트 이름이 오타이거나 공백이 달라 null이 돌아옴 탭 이름을 복사해 코드와 한 글자씩 대조 2장, 3장
Exception: The number of columns in the data does not match the number of columns in the range. The data has 6 but the range has 9. setValues에 넣은 데이터 열 수와 쓸 범위의 열 수가 다름 범위 크기를 data[0].length로 계산해 맞춤 3장
Exception: Service invoked too many times for one day: email. 메일 일일 한도 초과(개인 100명, Workspace 1,500명, 24시간 기준으로 초기화) 하루 뒤 재실행, 나눠 보내기, 발송 기록 열로 이어 보내기 4장
Exceeded maximum execution time 1회 실행 6분 초과 일괄 읽기·쓰기로 바꾸고, 마지막 처리 행을 저장해 이어 처리 7장
Authorization is required to perform that action 권한 미승인, 트리거에서 자주 발생 편집기에서 함수를 직접 실행해 재승인, 안 되면 트리거 삭제 후 재생성 4장, 7장
Exception: Access denied: DriveApp 관리자가 도메인에서 Drive 접근을 막아 둠 관리자에게 허용 요청 5장

앞의 네 줄은 이 시리즈를 쓰며 실제로 만난 메시지입니다. 아래 두 줄은 구글 공식 문제 해결 문서에 실린 표현입니다. 일일 한도 메시지는 공식 문서에서 Service invoked too many times: <action name> 형태로 적혀 있어, 뒤의 서비스 이름만 email, urlfetch 등으로 바뀝니다. Exceeded maximum execution time은 공식 문서가 아니라 커뮤니티 자료에서 확인한 표기입니다.

파이썬 오류

오류 원문 원인 해결 관련 장
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte 한글 윈도우에서 저장한 CSV가 cp949 encoding='cp949'로 읽기, 안 되면 'utf-8-sig' 6장
KeyError: '매출액' 열 이름 끝에 보이지 않는 공백('매출액 ') 열 이름에 .str.strip() 적용 6장
ModuleNotFoundError: No module named 'openpyxl' 엑셀을 읽고 쓰는 부품 미설치 python -m pip install openpyxl 6장
FileNotFoundError: [Errno 2] No such file or directory: '...' 경로 오타, 현재 폴더가 예상과 다름 전체 경로를 Path로 지정하고 존재 여부 출력 5장
IndentationError: expected an indented block after 'for' statement on line 1 for 아래 줄의 들여쓰기 누락 탭과 공백을 섞지 말고 4칸 공백으로 통일 2장
PermissionError: [Errno 13] Permission denied 엑셀에서 그 파일이 열려 있음 파일을 닫고 재실행 6장

Windows에서 python이나 pip를 인식하지 못하면 py -m pip install 패키지처럼 py로 시작해 보세요. 파이썬 공식 문서(3.14.8 기준)도 pip를 항상 python -m pip나 py -m pip 형태로 실행하라고 안내합니다.

권한 승인 화면의 경고

처음 실행하면 'Google에서 확인하지 않은 앱' 경고가 뜹니다. 본인이 만든 스크립트라면 왼쪽 아래 '고급'에서 계속 진행하면 됩니다. 이 경고는 악성이라는 뜻이 아니라 검증받지 않은 앱이라는 표준 문구입니다. 반대로 남이 준 스크립트는 코드를 읽고 요청하는 권한을 확인한 뒤에 승인하세요. 메일 발송 권한만 필요한 코드가 Drive 전체 접근을 요구하면 이유를 따져 봐야 합니다.

AI에 데이터를 넘기기 전에

열 이름과 가짜 예시면 충분합니다

AI가 코드를 쓰는 데 필요한 것은 데이터의 모양입니다. 값이 아닙니다. 이 시리즈의 요청 프롬프트가 모두 '열 구성 + 가짜 예시 몇 줄' 형태였던 이유입니다.

보내지 말 것 이렇게 바꿔 보내기
고객 이름·전화번호가 든 시트 통째 이름, 전화, 이메일 열 + 고객A, 010-xxxx-xxxx, a@example.com
주민등록번호·계좌번호·카드번호 자릿수만 같은 가짜 번호 또는 열 이름만
API 키, 웹훅 URL, 비밀번호가 든 코드 자리표시자(YOUR_API_KEY)로 바꿔서
스프레드시트 ID가 든 주소 필요하면 SHEET_ID로 가림

오류 수정 대화에서도 같습니다. 오류 메시지에 경로나 이름이 섞여 있다면 가린 뒤 붙여 넣으세요.

학습에 쓰이는지 설정부터 확인

서비스마다 대화가 모델 개선에 쓰이는지 설정이 따로 있고, 이름과 위치가 바뀌는 일이 잦습니다. 확인된 범위만 정리합니다(2026년 10월 기준).

서비스 확인된 내용
Claude (Free·Pro·Max) 'Model Improvement' 설정에 동의하면 데이터를 최대 5년, 동의하지 않으면 30일 보관합니다. Incognito 채팅은 학습에 쓰이지 않습니다. 설정은 언제든 바꿀 수 있지만 끈 뒤의 새 대화에만 적용됩니다(Anthropic 공지 2025년 8월 28일, 개인정보 센터 2026년 7월 갱신).
ChatGPT 설정의 Data controls에서 모델 개선 사용 여부를 끌 수 있습니다. 기업용(Business·Enterprise·Edu)과 API는 기본적으로 학습에 쓰지 않는다고 안내됩니다. 한국어 메뉴 이름은 화면에서 확인하세요.
Gemini 'Keep Activity'를 켜면 기본 18개월 뒤 자동 삭제되고, 끄면 대화가 72시간 보관됩니다. 일부 대화는 사람이 검토하며 검토된 대화는 최대 3년 보관됩니다(Google 고객센터 2026년 9월 24일 갱신).

개인 계정으로 업무 자료를 쓰지 않는 것이 첫째 원칙이고, 불가피할 때만 학습 설정을 끄거나 임시·시크릿 대화를 쓰세요.

회사가 도입한 기업용 제품은 대체로 학습 제외가 기본이지만, 계약과 설정은 IT 부서에 확인하는 쪽이 정확합니다. 회사에서 쓸 수 있는 AI 도구가 정해져 있다면 그 정책이 이 글보다 우선합니다.

왜 이렇게까지 조심하나

2023년 삼성전자 반도체 부문에서 엔지니어들이 약 20일 사이에 소스코드와 회의 녹취를 ChatGPT에 입력한 일이 있었고, 이후 사용 제한 방침이 보도됐습니다(The Register 2023년 5월 2일 외 다수 매체, 회사 원문 공지는 확인하지 못했습니다). 코드 오류를 물으려던 평범한 질문이었습니다.

공적인 기준도 있습니다. 개인정보보호위원회는 2025년 8월 6일 「생성형 인공지능(AI) 개발·활용을 위한 개인정보 처리 안내서」를 공개했습니다. 이 안내서는 AI를 개발하거나 서비스로 제공하는 쪽에 초점을 두고 있어서, 직장인에게 바로 적용되는 체크리스트는 아닙니다. 다만 주민등록번호 같은 고유식별정보나 계좌번호를 학습 전에 삭제하거나 가명·익명 처리하라는 원칙은 우리가 시트를 붙여 넣을 때의 기준으로 그대로 옮겨 쓸 만합니다.

권한과 한도를 관리하기

권한은 필요한 만큼만

스크립트를 처음 승인할 때 나오는 권한 목록은 코드가 쓰는 서비스에서 결정됩니다. 7장처럼 보고서만 보낸다면 MailApp이 GmailApp보다 낫습니다. 보내기 권한만 요구하고, 받은편지함 전체에는 접근하지 않기 때문입니다. AI가 GmailApp을 쓴 코드를 주면 "발송만 하니 MailApp으로 바꿔 주세요"라고 요청해 보세요.

한도를 한눈에 보기

항목 개인(gmail.com) Workspace
1회 실행 시간 6분 6분
트리거 총 실행 시간(하루) 90분 6시간
메일 수신자(하루) 100명 1,500명
URL 요청(하루) 20,000회 100,000회
트리거 개수 사용자당 스크립트별 20개 사용자당 스크립트별 20개

(Google for Developers 할당량 문서 2026년 9월 3일 갱신. 구글은 한도가 예고 없이 바뀔 수 있다고 밝히고 있으니 중요한 자동화는 문서를 다시 확인하세요.)

한도는 사용자 단위이고 첫 요청 24시간 뒤에 초기화됩니다. 그래서 같은 계정으로 4장 발송과 7장 보고서를 함께 돌리면 수신자 수를 합산해서 봐야 합니다.

인수인계가 되는 자동화 만들기

코드 맨 위에 설명을 남기기

몇 달 뒤의 나도 남입니다. 파일 첫머리에 아래 네 줄만 있어도 큰 차이가 납니다. AI에게 "이 코드에 목적, 입력 시트 이름, 실행 주기, 수정한 날짜를 적은 주석을 붙여 줘"라고 요청하면 됩니다.

// 목적: 매주 월요일 지난주 매출을 요약해 팀에 PDF 메일 발송
// 입력: '매출' 시트(A날짜, B담당자, C금액) / 출력: '주간보고' 시트
// 실행: createTrigger()로 월요일 8시대 트리거 등록(1회만)
// 수정: 2026-10-02 작성, 받는 사람은 상단 TO 상수

README 시트 한 장

코드 밖에도 설명이 필요합니다. 같은 파일에 README 시트를 만들고 아래 항목을 적어 두세요.

  • 스크립트 소유자와 트리거 소유자 설치형 트리거는 만든 사람 계정으로 실행됩니다. 소유자가 퇴사해 계정이 정지되면 예약 실행이 멈추고, 파일을 이전해도 트리거는 따라가지 않아 새 담당자가 다시 만들어야 한다는 것이 커뮤니티 경험담입니다.
  • 실패 알림을 받는 사람 알림 메일이 퇴사한 사람에게 가고 있지 않은지 점검하세요.
  • 자주 나는 오류와 첫 조치 이 장의 오류 사전에서 해당 줄만 복사해 두면 됩니다.

고치기 전에 복사본 먼저

운영 중인 시트의 스크립트를 AI가 준 새 코드로 덮어쓰기 전에, 파일 메뉴의 '사본 만들기'로 백업하세요. 앱스 스크립트에는 코드 스냅샷인 버전과, 그 버전을 외부에 공개하는 배포가 따로 있습니다. 시트에 붙은 스크립트만 쓰는 우리 같은 사용자에게는 사본이 가장 단순한 되돌리기 수단입니다. 명령어로 코드를 내려받아 관리하는 clasp 같은 도구도 있지만 비개발 직장인에게는 선택 사항입니다.

다음 단계와 시리즈 정리

스크립트가 버거워질 때

앱스 스크립트는 구글 서비스 안의 일에 강하고, 서로 다른 서비스를 이어야 하면 불편해집니다. 예를 들어 폼 제출 → 슬랙 알림 → 노션 기록을 코드 없이 연결하고 싶다면 Zapier, Make, n8n 같은 노코드 연결 서비스가 맞을 수 있습니다. 세 서비스의 차이는 AI 자동화 시리즈에서 비교합니다. 스크립트는 무료이고 내 데이터 옆에서 돌고, 연결 서비스는 앱 간 연결이 쉬운 대신 실행 횟수에 따라 요금이 붙는 구조라 용도가 겹치지만 대체 관계는 아닙니다.

더 나아가고 싶다면 터미널에서 코드를 직접 다루는 Claude Code나 GitHub Copilot 같은 개발 도구도 있습니다. 파일 여러 개로 이뤄진 프로젝트를 AI가 함께 고쳐 주는 방식인데, 지금 단계에서는 필요 없습니다. 이 시리즈의 방식으로 몇 개를 굴려 보고, 한계를 느끼는 때에 보세요.

시리즈 정리

장 제목 핵심
1 코딩 몰라도 자동화가 된다 — 앱스 스크립트·파이썬, 무엇을 맡길까 빈도·시간·규칙성으로 대상 고르기
2 AI에게 코드 받는 프롬프트 공식 — 요청·실행·오류 수정 대화 5요소 요청, 오류 원문 붙이기
3 구글 시트 데이터 정리 자동화 — 중복 제거·형식 통일·빈칸 채우기 일괄 읽기·쓰기, 사용자 메뉴
4 메일 대량 발송 자동화 — 시트 명단으로 개인화 메일 보내기 테스트 발송, 한도, 발송 기록
5 파일 이름 일괄 변경 — 파이썬으로 PC 폴더, 앱스 스크립트로 드라이브 미리보기(드라이런) 후 실행
6 엑셀·CSV 여러 파일 합치고 정리하기 — 파이썬 판다스 입문 인코딩·열 이름 오류 대응
7 정기 보고서 자동 생성 — 매주 요약해 PDF·메일로 보내기 트리거, 시간대, 실패 알림
8 막혔을 때와 오래 쓰는 법 — 오류 사전·보안·유지보수 오류 사전, 데이터 가리기, 인수인계

오늘부터 할 세 가지

  1. 1장에서 매긴 후보 업무 중 점수가 가장 높은 하나를 골라, 열 이름과 가짜 예시 3줄로 요청 프롬프트를 씁니다.
  2. 나온 코드는 복사본 시트에서 먼저 실행하고, 되돌릴 수 없는 일(발송·삭제·이름 변경)은 미리보기나 본인 주소 테스트부터 합니다.
  3. 잘 돌면 코드 맨 위 주석과 README 시트를 채우고 실패 알림을 켭니다.

자동화는 한 번에 크게 만들기보다 작은 것을 하나씩 늘려 가는 편이 오래갑니다. 막히면 이 장의 오류 표로 돌아와 메시지를 찾아보고, 찾지 못하면 원문을 그대로 AI에게 붙여 넣으세요.

관련 시리즈