구글 스프레드시트 자동화가 안정적인지는 “몇 행까지 되느냐” 하나로 판단할 수 없습니다. 파일의 셀·열 상한, 수식 계산 특성, IMPORTRANGE 전송량, Apps Script 실행시간, Sheets API 요청량, 동시 편집 범위가 서로 다른 제한이기 때문입니다. 이 글은 2026년 9월 11일 Google 공식 문서에서 직접 확인한 값과 원문 항목명을 나눠 적습니다.
실제 Google 계정에서 대량 행, 수식, 트리거, API 부하 실험은 하지 않았습니다. 아래 계산 예시는 공식 셀 상한을 나눈 산술값이고, 증상표는 재현 결과가 아니라 공식 제한에서 도출한 원인 후보와 확인 순서입니다.
공식 문서에서 확인한 Google Sheets·자동화 한도
| 대상 | 공식 문서에서 확인한 값 | 원문 항목명 | ⭐ 적용상 주의 |
|---|---|---|---|
| Google Sheets 파일 크기 | 최대 1,000만 셀 또는 18,278열(ZZZ) | File sizes → Spreadsheets — “Up to 10 million cells or 18,278 columns (column ZZZ)” | 스프레드시트 파일의 상한이지 탭 하나에 보장되는 행 수나 쾌적한 성능 기준이 아님. 다른 탭과 미리 채운 셀도 합계에 포함 |
| Excel·CSV 가져오기 | 최대 1,000만 셀 또는 18,278열 | File sizes → Spreadsheets — Excel and CSV imports | 가져오기가 허용되는 크기 기준이지 수식 호환, 서식 보존, 계산 속도를 보장하는 값이 아님 |
| Excel에서 변환한 셀의 문자 | 50,000자 초과 셀은 Sheets에서 제거 | File sizes → Spreadsheets — “any cell with more than 50,000 characters will be removed” | Excel을 Google Sheets로 변환할 때의 처리다. 네이티브 Sheets 셀·수식의 일반 최대 길이가 50,000자라는 뜻이 아님 |
| Connected Sheets 피벗 테이블 | 최대 200,000행 | File sizes → “Up to 200k rows for pivot tables in Connected Sheets” | Connected Sheets의 피벗 테이블에만 해당한다. 일반 시트의 독립적인 행 상한으로 전용할 수 없음 |
| Connected Sheets 추출 | 최대 500,000행 또는 500만 셀 | File sizes → “Up to 500k rows or 5m cells for extracts in Connected Sheets” | Connected Sheets 추출 한도다. 일반 Google Sheets 파일의 1,000만 셀 상한을 대체하지 않음 |
| IMPORTRANGE 수신량 | 요청당 수신 데이터 10MB | IMPORTRANGE → Performance — “capped at 10MB of received data per request” | 원본 파일 크기나 셀 수 상한이 아니라 한 요청이 받는 데이터의 상한. 10MB 이하라고 빠른 갱신이 보장되는 것도 아님 |
| IMPORTRANGE 갱신 확인 | 문서가 열려 있는 동안 매시간 자동 확인 | IMPORTRANGE → Data Freshness — “checks for updates every hour while the document is open” | 매시 정각 실행이나 변경 후 1시간 이내 반영 보장이 아니다. 체인·계산·네트워크에 따른 지연과 별개 |
| Apps Script 1회 실행 | 6분/실행 | Current limitations → Script runtime | 6분마다 실행된다는 뜻이 아니라 한 번의 스크립트 실행이 가질 수 있는 최대 시간 |
| Apps Script 사용자 정의 함수 | 30초/실행 | Current limitations → Custom function runtime | 모든 시트 수식의 계산시간 한도가 아니다. Apps Script로 만든 사용자 정의 함수 한 번의 실행 제한 |
| 설치형 트리거 수 | 20개/사용자/스크립트 | Current limitations → Triggers | 하루 20회 실행 제한이 아니라 사용자와 스크립트 조합에 만들 수 있는 트리거 수 |
| 트리거 총 실행시간 | 개인 계정 90분/일, Workspace 6시간/일 | Current quotas → Triggers total runtime | 실행 횟수가 아닌 사용자별 일일 실행시간 합계. 할당량은 첫 요청 24시간 뒤 재설정되며 변경될 수 있음 |
| 시간 기반 트리거 주기 | 최단 1분마다, 최장 한 달에 한 번 | Time-driven triggers — “as frequently as every minute or as infrequently as once per month” | 선택 가능한 반복 주기 범위이지 정각 실행 SLA가 아님. 특정 시각 트리거는 시간이 약간 무작위화될 수 있음 |
| 동시 Apps Script 실행 | 사용자당 30개, 스크립트당 1,000개 | Current limitations → Simultaneous executions per user / per script | 트리거 수나 하루 실행 횟수와 다른 동시성 한도. 스크립트당 1,000개여도 사용자당 30개 제한은 따로 적용 |
| Sheets API 읽기·쓰기 | 각각 프로젝트당 분당 300회, 사용자·프로젝트당 분당 60회 | Quota limits → Read requests / Write requests | 셀 개수가 아니라 API 요청 수다. 읽기와 쓰기는 별도이며, 한도를 지켜도 파일 크기와 처리시간 제한은 남음 |
| Sheets API 요청 크기 | Sheets API 자체 하드 크기 제한은 없고 2MB 이하 권고 | Quota limits — “recommend a 2 MB maximum payload” | 2MB는 성능을 위한 권고값이지 초과 즉시 거절되는 고정 상한이 아님. 다른 처리 구성요소의 제한은 생길 수 있음 |
| Sheets API 처리시간 | 요청 1건당 최대 180초 | Behavior and limitations — “maximum time limit for processing one API request” | Apps Script의 6분 제한과 다른 Sheets API 서버 처리 제한. 180초마다 재실행된다는 뜻이 아님 |
| 동시 편집 | 열린 탭·기기 최대 100개에서 편집 | Share with specific audiences — “edited on up to 100 open tabs or devices” | 100명의 공유 상한이 아니라 동시에 열린 편집 인스턴스 기준. 100개를 넘으면 소유자와 일부 편집자만 편집 가능 |
| 개별 이메일 주소 공유 | 파일 1개당 최대 600개 | Share with specific audiences — “up to 600 individual email addresses” | 동시 편집자 600명을 뜻하지 않으며, 링크 공개 범위나 그룹·공유 드라이브 멤버 한도와 같은 값도 아님 |
예를 들어 12열짜리 단일 표만 있다고 가정하면 10,000,000 ÷ 12 = 833,333.33…이므로 온전한 행은 산술상 833,333개, 머리글 1행을 빼면 데이터 행은 833,332개입니다. 이는 다른 탭·수식·미리 채운 셀이 전혀 없다는 가정의 계산값이며, 그 행 수에서 원활히 작동한다고 측정한 성능값이 아닙니다.
숫자와 별개로 설치형 트리거는 Restrictions 항목에 따라 항상 만든 사람의 계정으로 실행됩니다. 동료가 시트를 열어 트리거가 작동해도 동료 계정으로 실행되는 것이 아닙니다. 담당자가 바뀔 업무라면 트리거 생성자와 복구 담당자를 문서에 남겨야 합니다.
함수 중첩·수식 길이: 확인되지 않은 숫자를 만들지 마세요
| 확인 항목 | 공식 문서 확인 결과 | 원문 항목명 | 본문 판단 |
|---|---|---|---|
| 일반 함수의 최대 중첩 단계 | 숫자 상한 명시 없음 | Add formulas & functions → Nested functions | 공식 문서는 가장 안쪽 함수를 먼저 계산한다고 설명하지만 최대 중첩 횟수는 제시하지 않는다. 출처 없는 “최대 N단계”를 쓰지 않음 |
| 일반 수식의 최대 문자 길이 | 숫자 상한 명시 없음 | Add formulas & functions → Use a formula, Create & use named functions → Formula definition | Excel 변환 셀의 50,000자 제거 규칙을 네이티브 수식 길이 한도로 바꿔 쓰지 않음 |
| 재귀 명명 함수 계산 한계 | 계산이 너무 오래 걸리거나 메모리를 너무 많이 쓰면 오류 가능 | Create & use named functions → “Calculation limit was reached…” | 공식 문서가 숫자 임계값은 밝히지 않는다. 오류가 나면 임의의 한도값을 가정하지 말고 수식을 단순화 |
따라서 수식 유지보수 기준은 “공식 최대치 직전까지 한 셀에 넣기”가 아닙니다. 반복되는 부분은 보조열이나 명명 함수로 분리하고, 한 열에는 한 데이터 유형을 유지하며, 계산 오류가 생기면 수식 길이보다 의존 범위·재귀·반복 계산을 먼저 줄이는 편이 원인 확인에 유리합니다.
IMPORTRANGE와 QUERY는 서로 다른 실패를 만듭니다
| 기능 | 공식 문서에서 확인한 제약 | ⭐ 적용상 주의 |
|---|---|---|
IMPORTRANGE 권한 |
새 원본에서 처음 가져올 때 명시적으로 접근을 허용해야 함. 허용한 사용자가 원본에서 제거될 때까지 연결 유지 | 대상 시트 편집 권한만 있다고 새 원본이 자동 연결되는 것이 아님. 원본의 다운로드·인쇄·복사 제한을 켜면 새 IMPORTRANGE 내보내기도 막힘 |
IMPORTRANGE 체인 |
A→B→C처럼 연결하면 원본 변경이 뒤 문서까지 다시 로드되며, 공식 문서는 체인 제한과 순환 참조 회피를 권고 | “열린 동안 매시간 확인”이 체인 전체의 즉시 동기화를 뜻하지 않음. 원본에서 먼저 집계한 작은 결과만 전송 |
IMPORTRANGE 변동 함수 |
NOW, RAND, RANDBETWEEN을 직접·간접 참조할 수 없음. TODAY는 예외 |
모든 변동 함수가 금지된다는 뜻은 아니며, TODAY 예외를 임의로 다른 함수에 확대하면 안 됨 |
QUERY 혼합 데이터형 |
한 열에서 다수 데이터형이 열의 유형을 결정하고, 소수 데이터형은 null로 취급 | 화면에 값이 보인다고 QUERY 결과에도 반드시 남는 것이 아님. 날짜·숫자·문자열을 한 열에 섞지 말고 입력 단계에서 정규화 |
QUERY 머리글 |
headers를 생략하거나 -1로 두면 내용에 따라 추정 |
자동 추정이 항상 맞는다는 뜻이 아님. 가져오기 범위의 머리글 행 수를 알고 있다면 명시 |
조건 → 선택 → 이유: 자동화 방식을 정하는 판단표
| 현재 조건 | 선택 | 이유·합격 기준 |
|---|---|---|
| 한 파일 안에서 입력 정리·조회·요약만 필요하다 | 드롭다운, 보조열, 기본 수식부터 사용 | 외부 호출 없이 입력 유형을 고정할 수 있다. QUERY를 쓴다면 열별 데이터형과 머리글 수를 먼저 확정 |
| 다른 시트의 일부 집계값을 가져오며 지연을 허용할 수 있다 | 원본에서 먼저 집계한 뒤 IMPORTRANGE |
받는 범위를 줄여 요청당 10MB와 체인 지연 위험을 낮춘다. 권한 연결 담당자와 원본을 기록해야 함 |
| Google 서비스 안에서 짧은 정리·알림을 예약한다 | Apps Script 설치형 트리거 | 작업을 6분보다 짧은 배치로 나누고, 사용자별 트리거 총 실행시간·동시 실행·20개 생성 한도를 함께 관리 |
| 외부 시스템이 시트를 반복 조회·수정한다 | Sheets API의 배치 요청과 지수 백오프 | 분당 읽기·쓰기 할당량, 180초 처리 제한, 2MB 권고를 API 기준으로 따로 관리. 429 응답 때 무한 즉시 재시도 금지 |
| 결제·고객 발송처럼 중복이나 누락 비용이 크다 | 시트는 검토 화면으로 두고 큐·DB·승인 단계를 별도 구성 | 파일이 열리고 스크립트가 완료됐다는 사실은 거래 완료 증거가 아니다. 고유키, 재시도 상한, 사람 승인, 원장 대조가 필요 |
| 100개가 넘는 탭·기기에서 동시에 입력해야 한다 | Google Form 등 입력 창구와 조회용 공개본을 분리 | 600개 주소에 공유할 수 있어도 동시 편집 인스턴스는 100개 기준이다. 대규모 입력을 한 시트 직접 편집으로 해결하지 않음 |
자동화 전에 데이터 계약부터 적으세요
- 고유키를 정합니다. 주문번호·신청 ID처럼 재실행해도 같은 행을 식별할 값을 둡니다.
- 입력 열과 계산 열을 분리합니다. 날짜, 숫자, 상태 문자열을 한 열에 섞지 않고 QUERY의 데이터형 판정을 흔들지 않게 합니다.
- 완료와 실패 상태를 분리합니다. 실행 시작, 처리 완료, 검토 필요, 재시도 중을 같은 체크박스 하나로 표현하지 않습니다.
- 재시작 지점을 저장합니다. Apps Script가 6분 전에 멈추도록 배치를 나누고 마지막 고유키나 처리 시각을 기록합니다.
- 원본과 가져오기 방향을 기록합니다. IMPORTRANGE 연결자, 원본 URL, 범위, 권한 소유자, 체인 단계를 남깁니다.
- 검증 결과를 직접 남깁니다. 정상 입력, 빈 값, 중복 키, 잘못된 데이터형을 넣어 예상 결과와 실제 결과를 비교하되, 수행하지 않은 시험을 완료했다고 표시하지 않습니다.
이메일 청구서를 시트에 기록하는 구체적인 고유키·원문 보존·완료 판정 사례는 Gmail 청구서 자동 분류와 시트 추적 기준에서 이어서 볼 수 있습니다.
시트 밖에서 정기 수집 작업을 실행한다면 GitHub Actions 예약 실행의 지연·권한·실패 로그 확인을 함께 살펴보세요. Apps Script 트리거와 외부 실행기의 실패 기록을 구분해야 재실행할 위치를 정할 수 있습니다.
증상 → 원인 후보 → 조치
| 증상 | 원인 후보·구분 방법 | 조치와 재확인 |
|---|---|---|
새 IMPORTRANGE가 #REF!로 멈춘다 |
원본 연결을 아직 허용하지 않았거나 원본 접근 권한이 없음. 원본의 다운로드·인쇄·복사 제한도 구분 | 원본 소유·접근 권한을 확인하고 대상 시트에서 연결을 허용. 제한 설정을 바꿀 권한이 없다면 기존 연결과 새 연결을 구분해 기록 |
IMPORTRANGE가 오래 로드되거나 이전 값이 보인다 |
가져오는 범위가 크거나 체인이 길고 원본 계산이 끝나지 않음. 요청당 수신 10MB와 연결 단계를 확인 | 원본에서 집계한 작은 범위만 가져오고 A→B→C 체인을 줄임. 즉시 동기화를 전제로 한 업무에는 사용하지 않음 |
QUERY 결과에서 일부 값만 빈칸이 된다 |
같은 열에 숫자·날짜·문자열이 섞여 소수 데이터형이 null로 처리됨 | 원본 열의 데이터형을 통일하고 별도 오류 열로 예외를 이동. headers 값도 명시한 뒤 결과를 대조 |
| Apps Script가 처리 도중 멈춘다 | Script runtime 6분, 트리거 총 실행시간, 동시 실행 중 어느 제한인지 실행 기록과 예외 메시지로 구분 |
범위를 작은 배치로 나누고 마지막 고유키를 저장. 다음 실행이 이어서 처리하며 기존 행을 중복 생성하지 않는지 확인 |
| 시트 사용자 정의 함수가 시간 초과된다 | Custom function runtime 30초를 넘었거나 셀별 호출이 반복됨 |
범위 전체를 한 번에 받도록 함수를 바꾸거나 계산을 기본 수식·배치 스크립트로 이동 |
| Sheets API가 429를 반환한다 | 프로젝트 또는 사용자·프로젝트의 분당 읽기·쓰기 요청 한도를 초과 | 요청을 배치하고 공식 문서의 truncated exponential backoff를 적용. 읽기와 쓰기 사용량을 따로 확인 |
| Sheets API 요청이 180초 후 시간 초과된다 | 한 요청의 처리 범위나 복잡도가 너무 큼. 페이로드 크기와 하위 요청을 확인 | 2MB 이하 권고를 기준으로 요청을 분할하고 각 배치에 고유키를 둠. 180초를 Apps Script 6분과 혼동하지 않음 |
| 행이나 열을 더 추가할 수 없다 | 파일 전체의 셀 합계가 1,000만 또는 열이 18,278에 도달했는지 확인 | 불필요한 빈 행·열·서식 영역과 과거 탭을 정리하거나 파일을 기간별로 분리. 계산값이 아닌 실제 파일 셀 합계로 재확인 |
| 공유자는 많지만 일부만 편집할 수 있다 | 공유 주소 600개와 열린 탭·기기 100개 편집 기준을 혼동 | 입력은 Form 등으로 분리하고 직접 편집자는 필요한 사람으로 제한. 공유 인원과 동시 편집 인스턴스를 따로 관리 |
| 재귀 명명 함수에서 계산 한계 오류가 난다 | 공식 문서 기준 계산시간이 너무 길거나 메모리를 너무 많이 사용 | 재귀와 반복 하위식을 줄이고 보조열로 분해. 공식 숫자 임계값이 없는 상태에서 임의의 “최대 단계”로 진단하지 않음 |
공식 문서에 명시되지 않은 값과 검증 경계
| 확인하려던 항목 | 확인 결과 | 구분·본문 처리 |
|---|---|---|
| 일반 Google Sheets의 고정 행 상한 | Files you can store in Google Drive에는 1,000만 셀과 18,278열은 있으나 일반 시트의 독립된 행 숫자는 명시 없음 | 명시 없음. 열 수로 나눈 값은 계산식과 가정을 함께 표시 |
| 네이티브 Sheets 셀·수식의 일반 문자 상한 | 확인한 수식 도움말에 숫자 명시 없음. 50,000자는 Excel 변환 시 셀 제거 조건 | 명시 없음. Excel 변환 규칙을 일반 수식 한도로 전용하지 않음 |
| 일반 함수의 최대 중첩 단계 | Nested functions는 계산 순서를 설명하지만 숫자 단계는 명시하지 않음 | 명시 없음. 출처 없는 숫자 제외 |
| 행 수별 실제 계산·로딩 시간 | 실제 계정과 데이터로 측정하지 않음 | 미측정. “N행까지 빠르다”는 성능값을 만들지 않음 |
| 공식 문서 접근 여부 | 이 글에 인용한 Google 공식 페이지는 2026-09-11 본문을 열어 대조함 | 접근 성공. 문서에 접근하지 못한 경우와 문서에 숫자가 적혀 있지 않은 경우를 같은 사유로 묶지 않음 |
자동화의 합격 기준은 “시트가 크다”나 “트리거가 돌았다”가 아닙니다. 같은 입력을 다시 처리해도 중복되지 않고, 실패 위치를 찾을 수 있으며, 권한 담당자가 바뀌어도 연결과 실행 주체를 설명할 수 있는 상태여야 합니다. 공식 상한은 설계의 경계이고, 실제 배치 크기와 수식 구조는 자신의 데이터로 측정해 정해야 합니다.
확인한 공식 자료
- Files you can store in Google Drive — Sheets·Excel/CSV·Connected Sheets 크기 항목
- IMPORTRANGE — 권한, 성능, 사용량, 갱신, 변동 함수 항목
- QUERY function — 혼합 데이터형과 headers 항목
- Add formulas & functions — Nested functions 항목
- Create & use named functions — Formula definition과 계산 한계 오류 항목
- Quotas for Google Services — Apps Script 실행·트리거·동시성 항목, 문서 갱신 2026-07-22 UTC
- Installable Triggers — 생성자 계정 실행, 시간 기반 트리거, 실패 알림 항목
- Google Sheets API Usage limits — 분당 요청, 2MB 권고, 180초 처리시간, 문서 갱신 2026-07-31 UTC
- Share files from Google Drive — 100개 열린 탭·기기 편집과 600개 개별 이메일 공유 항목