Gmail 청구서 자동 분류의 안전한 기본형은 필터가 후보 메일을 모으고, 사람이 지급 상태를 확정하며, Google Sheets가 확인 이력을 남기는 구조입니다. Gmail 필터는 라벨 적용·보관·별표 같은 작업은 할 수 있지만 청구서의 금액·납부기한을 이해하거나 지급 완료를 증명하지는 않습니다. 따라서 메일 수신만으로 상태를 ‘완료’로 바꾸지 마세요.
이 글은 Google 공식 문서에서 직접 확인한 검색 문법과 숫자만 사용합니다. 실제 Gmail 계정 설정, Apps Script 실행, Zapier·Make 연동, OCR 정확도 실험은 수행하지 않았습니다. 아래 증상표의 원인은 재현 결과가 아니라 원인 후보와 구분 절차입니다.
공식 문서에서 확인한 숫자: 상한과 권고를 섞지 마세요
| 대상 | 공식 문서에서 확인한 값 | 원문 항목명 | 적용상 주의 |
|---|---|---|---|
| Gmail 라벨 생성 | 최대 5,000개 | Create a label — “You can create up to 5,000 labels.” | 생성 상한이지 원활한 운영을 보장하는 권장 개수가 아님 |
| Workspace 라벨 성능 권고 | 중첩 라벨 포함 500개 이하 사용 권고 | Reduce labels — “Use 500 labels or fewer (including nested labels)” | 업무·학교용 계정의 성능 권고이며 500개가 Gmail 전체의 생성 상한이라는 뜻이 아님 |
| 개인 Gmail 발신 첨부 | 여러 파일 합계 최대 25MB | Attachment size limit | 개인 계정의 보내기 기준이다. 수신 인보이스의 한도나 Workspace 계정의 고정값이 아님. Workspace 송수신 한도는 관리자가 설정 |
| Apps Script 1회 실행 | 6분/실행 | Script runtime | 6분마다 자동 실행된다는 뜻이 아니라 한 번의 실행이 가질 수 있는 최대 실행시간 |
| Apps Script 설치형 트리거 수 | 20개/사용자/스크립트 | Triggers | 하루 20회 실행 제한이 아니라 한 사용자와 한 스크립트 조합에 만들 수 있는 트리거 수 |
| 트리거 총 실행시간 | 개인 계정 90분/일, Workspace 6시간/일 | Triggers total runtime | 실행 횟수가 아니라 트리거 실행시간의 일일 합계. 할당량은 사용자별이며 첫 요청 후 24시간 뒤 재설정 |
| 메일 읽기·쓰기 | 개인 계정 20,000/일, Workspace 50,000/일 | Email read/write (excluding send) | 메일 발송은 제외된 Apps Script 서비스 할당량이다. 숫자를 곧바로 ‘처리 가능한 청구서 수’로 환산할 수 없음 |
| Google Sheets 크기 | 최대 1,000만 셀 또는 18,278열(ZZZ) | Spreadsheets — “Up to 10 million cells or 18,278 columns (column ZZZ)” | 한 시트 탭의 행 한도가 아니라 스프레드시트 파일의 셀·열 상한. 빈 서식·수식·다른 탭도 셀을 사용 |
예를 들어 추적표를 8열로 고정하면 1,000만÷8=1,250,000행이 산술상 최대이고, 머리글 1행을 빼면 데이터는 1,249,999행입니다. 이는 다른 탭과 미리 채운 셀이 전혀 없다는 가정의 계산값일 뿐 실제 처리 성능을 측정한 값이 아닙니다.
Gmail 검색식은 넓게 찾고, 라벨 필터는 좁게 만드세요
먼저 검색창에서 후보를 찾고 결과를 검토한 뒤 필터로 저장합니다. Google의 Create a filter 절차도 검색 조건을 입력하고 결과를 확인한 다음 필터를 만들도록 안내합니다. 처음부터 자동 삭제하거나 ‘지급 완료’ 라벨을 붙이지 말고 청구서/후보처럼 되돌릴 수 있는 라벨만 적용하세요.
| 찾으려는 조건 | 공식 문법을 조합한 예시 | 원문 항목명 | 적용상 주의 |
|---|---|---|---|
| 제목 후보 중 하나 | {subject:청구서 subject:영수증 subject:invoice subject:receipt} |
subject: / OR or { } | 중괄호는 하나 이상 일치 조건이다. 제목에 단어가 있다는 사실만으로 실제 청구서임을 보장하지 않음 |
| 특정 발신자와 제목 | from:[email protected] subject:invoice |
from: / subject: | 공식 예시는 특정 주소를 사용한다. *@domain 형태는 확인한 공식 예시에 없으므로 사용하지 않음 |
| PDF 첨부 후보 | has:attachment filename:pdf |
has: / filename: | 25MB를 넘는 개인 Gmail 발신 파일은 Drive 링크로 바뀔 수 있어 첨부 조건만으로 모든 문서를 찾는다는 뜻이 아님 |
| 최근 1년 후보 | newer_than:1y |
older_than: / newer_than: | d·m·y는 일·월·년 기간 단위다. 회계연도 경계가 필요하면 after:와 before:로 날짜를 명시 |
| 광고 문구 제외 | -"광고" |
– / “ ” | 음수 연산자를 써도 대화 안의 다른 메시지가 일치하면 대화 전체가 보일 수 있으므로 제외 결과를 표본 메일과 대조 |
| 후보 라벨 재검색 | label:청구서/후보 |
label: | 라벨은 폴더가 아니며 삭제·이동과 효과가 다르다. 대화형 보기 설정에 따라 새 답장에 보이는 라벨도 달라질 수 있음 |
한 번에 거대한 검색식 하나를 만들기보다 발행처별로 좁은 조건을 두는 편이 수정 범위를 통제하기 쉽습니다. 필터·라벨 설정 자체가 낯설다면 Gmail 필터와 라벨 자동화 기초를 먼저 적용하고, 검색 결과에서 빠진 실제 청구서와 잘못 잡힌 안내 메일을 각각 기록하세요.
필터가 할 일과 추적표가 할 일을 분리하세요
- 후보 수집: Gmail 필터는
청구서/후보라벨만 붙입니다. 자동 삭제·자동 완료 처리는 사용하지 않습니다. - 고유키 확인: 시트에 행을 추가하기 전에 메시지 고유키가 이미 있는지 검사합니다. 같은 트리거가 재실행돼도 기존 행이 있으면 추가하지 않습니다.
- 원문 보존: 발행처, 수신일, 제목, 금액 원문, 납부기한 원문, 메일 링크, 상태, 최종 확인일의 8열을 저장합니다. 파싱에 실패한 값은 빈칸 대신
검토 필요로 남깁니다. - 상태 확정: 메일 도착은
후보, 금액·기한 확인은지급 예정, 실제 지급 근거를 확인한 뒤에만완료로 바꿉니다. - 주기 검수: 트리거 성공 로그와 시트의 마지막 수신일을 비교합니다. 실행 성공은 모든 청구서가 정확히 추출됐다는 증거가 아닙니다.
시트 열 구성과 중복 방지 규칙을 더 확장할 때는 Google Sheets 자동화 기준을, 코드를 유지할 담당자가 없을 때는 Zapier·Make 연동 선택 기준을 참고할 수 있습니다. 단, 노코드 도구의 요금제별 폴링 간격은 이번 공식 확인값에 포함하지 않았습니다.
조건 → 선택 → 이유: 어디까지 자동화할지 정하는 표
| 현재 조건 | 선택 | 이유·합격 기준 |
|---|---|---|
| 발행처가 적고 제목·발신자가 일정하다 | Gmail 필터와 후보 라벨만 사용 | 코드 없이 누락 후보를 모은다. 실제 청구서가 빠지지 않고 안내 메일 오분류를 사람이 되돌릴 수 있어야 함 |
| 금액·기한 형식이 발행처마다 다르다 | 메일 링크와 원문을 시트에 기록하고 금액·기한은 수동 확인 | 잘못 파싱한 숫자를 확정값으로 저장하는 위험이 자동 입력 절약보다 큼 |
| 고정된 템플릿의 메일이 반복되고 담당자가 스크립트를 관리할 수 있다 | Apps Script로 후보 행을 만들되 실패값은 검토 필요 처리 |
고유키 중복 방지, 실행 로그, 6분 실행 한도와 일일 할당량 대응이 준비돼야 함 |
| PDF·이미지 본문에서 숫자를 읽어야 한다 | OCR 또는 문서 파서를 별도 단계로 두고 원문 대조 | Gmail 검색은 첨부 존재와 파일명은 찾지만 문서 속 금액의 정확성을 보증하지 않음 |
| ‘지급 완료’를 자동 판정하려 한다 | 결제 승인·계좌 기록 등 별도 근거가 없으면 자동 판정하지 않음 | 청구서 수신은 지급 증거가 아니므로 미납을 완료로 오인할 수 있음 |
| 필터 수가 많아 관리 기준이 흔들린다 | 발행처·목적별로 통합하고 정기적으로 미사용 필터를 검토 | 확인한 공식 필터 문서에는 숫자 상한이 명시되지 않았다. 근거 없는 ‘최대 필터 수’를 운영 기준으로 쓰지 않음 |
증상 → 원인 후보 → 조치: 누락과 중복을 먼저 분리하세요
| 증상 | 원인 후보·구분 방법 | 조치와 재확인 |
|---|---|---|
| 특정 발행처 청구서만 빠진다 | 발신 주소나 제목이 바뀌었거나 PDF가 Drive 링크로 전달됨. 빠진 원문과 현재 검색식을 항목별로 대조 | 해당 발행처 조건만 수정하고 과거 메일 검색 결과로 누락·오분류를 다시 확인 |
| 광고·뉴스레터까지 후보가 된다 | 제목 OR 조건이 넓거나 발신자 제한이 없음 | 정확한 발신자 또는 제외 문구를 추가. 음수 연산자의 대화 단위 주의를 반영해 결과를 다시 대조 |
| 같은 청구서가 시트에 여러 행으로 쌓인다 | 트리거 재실행 때 메시지 고유키를 확인하지 않고 매번 추가함 | 추가 전 고유키 열을 조회하고 기존 행이면 갱신 또는 건너뜀. 같은 후보를 다시 처리해 행 수가 늘지 않는지 확인 |
| 금액이나 납부기한이 엉뚱한 값이다 | 본문의 주문번호·발행일을 금액·기한으로 오인함 | 원문 열을 보존하고 파싱값을 검토 필요로 되돌림. 발행처별 규칙이 없으면 수동 확인 유지 |
| 청구서 도착만으로 완료 처리된다 | 수신 이벤트와 지급 증거를 같은 상태로 취급함 | 후보 → 지급 예정 → 완료를 분리하고 완료는 지급 근거 확인 후에만 변경 |
| Apps Script가 중간에 멈추거나 할당량 예외가 난다 | 1회 6분 실행시간, 트리거 총 실행시간, 메일 읽기·쓰기 할당량 중 어느 항목을 넘었는지 실행 기록에서 구분 | 한 번에 처리할 범위를 줄이고 마지막 처리 고유키를 저장. 다음 실행에서 이어 처리하며 예외 항목이 사라졌는지 확인 |
| 시트에 새 행을 추가할 수 없다 | 스프레드시트 전체가 1,000만 셀 또는 18,278열 상한에 닿았는지 확인 | 불필요한 빈 서식·열·과거 탭을 정리하거나 연도별 파일로 분리한 뒤 새 행 추가를 재확인 |
공식 문서에 없던 값과 이번 검증의 경계
| 확인하려던 항목 | 확인 결과 | 본문 처리 |
|---|---|---|
| Gmail 필터의 최대 개수 | 확인한 Google의 Create rules to filter your emails 문서에 숫자 한도 명시 없음 | 필터 최대 개수를 쓰지 않고 관리 원칙만 제시 |
| Workspace 수신 첨부의 공통 고정 한도 | Gmail 도움말은 관리자가 송수신 한도를 설정한다고 설명 | 개인 Gmail의 발신 첨부 25MB를 수신 또는 Workspace 한도로 전용하지 않음 |
| Zapier·Make의 공통 실행 간격 | 이번 Google 공식 자료 범위에서 확인하지 않음 | 숫자를 넣지 않고 요금제·도구 공통값으로 주장하지 않음 |
| 메일 본문·OCR의 금액 및 날짜 인식률 | 실제 메일이나 첨부로 측정하지 않음 | 성공률을 만들지 않고 실패값을 검토 필요로 남기는 절차만 제시 |
설정의 합격 기준은 “자동화가 실행됐다”가 아니라 누락된 실제 청구서를 찾을 수 있고, 중복 행이 생기지 않으며, 지급 근거 없는 메일이 완료 처리되지 않는 것입니다. 먼저 후보 라벨만 만들고 결과를 검토한 뒤, 고유키와 원문 보존 규칙이 준비됐을 때만 시트 자동 기록으로 확장하세요.