Q. 구글 시트 애드온을 마켓플레이스에 공개하려면 무엇을 거쳐야 하나요?
크게 세 덩어리다. 코드를 여러 사용자가 안전하게 나눠 쓰도록 멀티테넌트, 최소권한(currentonly 스코프)으로 준비하고, 회사 계정에서 GCP 프로젝트와 OAuth 동의화면을 구성한 뒤, Marketplace SDK의 App Configuration과 Store Listing을 채워 제출한다. 스코프를 비민감으로 짜두면 보안 심사가 가벼워진다.
오늘 바로 쓸 핵심 3줄
- 권한부터 좁혀라.
currentonly같은 비민감 스코프면 심사 관문이 통째로 하나 빠진다. - 정책 페이지와 이미지 규격은 코드보다 먼저 막히는 관문이다. 미리 만들어 둬라.
- 계정 소유권 이전은 설치 사용자가 0명일 때 해라. 게시 후에는 큰일이 된다.
왜 "그냥 올리기"가 안 되는가
내부용으로 쓰던 애드온은 나 혼자, 혹은 팀 몇 명이 각자 시트에 설치해 쓰는 구조였다. 공개 애드온은 다르다. 스크립트 프로젝트 하나를 전 세계 사용자가 공유한다.
여기서 첫 함정. 시트별 상태를 스크립트 전역 저장소에 넣어 두면, 사용자 B가 사용자 A의 중앙 시트 ID나 최근 실행 결과를 그대로 읽어 버린다. 남의 데이터가 보이는 교차 오염이다.
그래서 공개 전환의 진짜 1단계는 콘솔이 아니라 코드다. 모든 시트별 상태를 DocumentProperties 같은 문서별 저장소로 옮기고, 권한은 활성 문서만 건드리는 spreadsheets.currentonly로 좁힌다. 이 선택 하나가 뒤에서 심사 난이도까지 낮춘다.
그림. 코드(1) 다음부터는 대부분 계정과 콘솔 작업이다. 실제로 손이 오래 걸린 건 5, 7, 8번이었다.
2단계. 소유권 이전은 사용자가 0명일 때
이 애드온은 원래 개인 지메일 계정에 있었다. 공개하려니 게시 계정, GCP 소유, 스크립트 소유를 회사 계정 하나로 통일하는 게 맞았다. 문제는 언제 옮기느냐, 타이밍.
결론부터. 지금이 옮길 최적 시점이었다. 아직 설치 사용자가 0명이라 잃을 게 없기 때문이다. 게시되고 나면 스크립트 ID가 사용자 설치와 묶여서, 그때 옮기는 건 진짜 큰 공사가 된다.
코드가 전부 로컬에 있으니 "이전"이 아니라 재배포였다. 회사 계정으로 clasp login을 다시 하고, 새 스크립트 프로젝트를 만들어 전체 코드를 밀어 넣었다. 원리는 단순하지만 함정이 하나 있었다.
clasp create로 새 프로젝트를 만들면 appsscript.json이 기본값으로 초기화된다. 애써 좁혀둔 OAuth 스코프 3종이 날아간다. 새 프로젝트 생성 직후 매니페스트의 스코프를 다시 써넣고, 엔진 테스트를 돌려 회귀가 없는지 확인해야 한다.
3단계. 정책과 이미지가 코드보다 먼저 막는다
많은 사람이 코드만 되면 올릴 수 있다고 생각한다. 실제로 먼저 막히는 건 개인정보처리방침, 이용약관, 그리고 규격 맞춘 이미지다.
정책은 웹에서 접근 가능한 공개 URL이어야 한다. 브랜드 사이트가 있으면 거기에 라우트로 올리는 게 깔끔하다. 우리는 제품 상세 페이지와 함께 개인정보처리방침, 약관을 각각 고정 URL로 뒀다.
이미지는 규격이 은근히 많다. 아이콘은 32, 48, 96, 128 픽셀, 그리고 목록에 뜨는 카드 배너 220x140이 필수다. 스크린샷은 1280x800. 여기서 두 번째 함정.
220x140은 명함보다 작다. 화려한 맥시멀리즘은 이 크기에서 뭉개져 노이즈가 된다. 어두운 베이스에 큰 볼드 워드마크, 단일 강조색, 입체감 있는 아이콘 하나로 수렴하는 게 작은 크기에서도 읽히고 심사에도 무난하다.
4~5단계. GCP 연결과 OAuth 동의화면
Apps Script는 GCP 프로젝트에 연결해야 마켓플레이스로 갈 수 있다. 편집기의 프로젝트 설정에서 GCP 프로젝트 번호를 넣는다. 이때 스크립트를 여는 계정이 그 GCP의 편집자여야 하고, OAuth 동의화면이 먼저 구성돼 있어야 붙는다.
동의화면은 User Type을 External로, 앱 이름과 지원 이메일, 승인된 도메인, 정책 URL을 넣는다. 여기서 소소한 벽 하나를 만난다. 지원 이메일 드롭다운은 본인 구글 계정 주소나 소유한 구글 그룹만 받는다. 브랜드 도메인 메일(라우팅 주소)은 안 뜬다. 그건 리스팅과 개발자 연락처에 쓰고, 지원 이메일은 계정 주소로 두면 된다.
동의화면이 "테스트" 상태면 테스트 사용자 목록에 등록된 계정만 인증할 수 있다. 새 콘솔은 소유자도 자동 포함해 주지 않는다. 애드온을 설치하려다 403 access_denied가 뜨면, 대상 탭의 테스트 사용자에 내 계정을 추가하면 풀린다.
6~7단계. Marketplace SDK와 App Configuration
GCP 라이브러리에서 Google Workspace Marketplace SDK를 켜면 세부정보에 탭이 생긴다. 사용자 인증 정보, 앱 구성, 스토어 등록정보. 여기 앱 구성이 핵심이다.
앱 통합에서 애드온 유형을 고르는데, 시트 사이드바를 띄우는 클래식 에디터 애드온이면 Sheets 부가기능 하나만 체크한다. 신형 Google Workspace 부가기능은 카드 기반 프레임워크라 다른 물건이다. 체크하면 입력란이 펼쳐진다.
스크립트 ID와 스크립트 버전을 넣는다. 버전은 미리 만들어 둔 불변 버전 번호(예: 1)를 쓴다. 코드가 바뀌면 새 버전을 찍고 이 번호를 갱신한다.
그 아래 OAuth 범위에 애드온이 실제 쓰는 스코프를 모두 넣는다. 이메일과 프로필은 기본 포함이고, 여기에 spreadsheets.currentonly와 script.container.ui를 더한다.
script.container.ui 같은 애드온 전용 스코프에 "인증되지 않음"이 뜨는 건 오류가 아니다. 앱이 아직 심사 통과 전이라는 상태 표시다. 심사 과정에서 확인된다.
8단계. Store Listing, 마지막 관문
스토어 등록정보에는 앱 이름, 짧은 설명, 상세 설명, 카테고리, 언어, 그리고 준비해 둔 그래픽 애셋을 올린다. 지원 링크에는 약관, 개인정보처리방침, 지원 URL, 문제 신고 URL을 넣는다.
배포에서 모든 리전을 체크하면 전 세계 공개가 된다. 우리 목표가 글로벌이라 이걸 켰다. 마지막 함정은 초안 테스터에서.
게시 전 미리보기용으로 초안 테스터를 추가하면 "초안 테스터 사용 중지 URL"이 필수로 생긴다. 테스터가 접근 중지를 요청할 창구인데, 문의 페이지 URL을 넣으면 유효하게 채워진다. 미리보기가 필요 없으면 테스터를 빼서 이 칸을 없애도 된다.
전 필드를 채우고 초안 저장을 누른 뒤, 검토 제출을 누르면 끝이다. 우리는 도메인 소유권 확인 요구 없이 바로 넘어갔다. 스코프가 전부 비민감이라 심사 관문이 가벼운 덕이었다. 이게 1단계에서 권한을 좁혀둔 배당금이다.
이제 심사 대기, 그리고 당신 차례
제출하면 나머지는 구글이 본다. 스코프가 비민감이면 무거운 보안 평가는 없고, 리스팅과 브랜드 위주로 며칠에서 2주쯤 걸린다. 승인되면 누구나 설치할 수 있게 되고 테스트 경고도 사라진다.
- 격리: 시트별 상태가 문서별 저장소에 있나? 스크립트 전역이면 교차 오염이 난다.
- 스코프: 비민감 스코프만 쓰나?
currentonly면 심사가 가볍다. - 소유권: 게시 계정·GCP·스크립트가 한 계정인가? 사용자 0명일 때 통일하라.
- 정책: 개인정보처리방침·약관이 공개 URL로 살아 있나?
- 에셋: 아이콘 4종 + 배너 220x140 + 스크린샷이 규격에 맞나?
- 동의화면: 테스트 사용자를 넣어 403을 피했나?
그래도 하나만 챙긴다면, 이것이다.
권한을 좁히는 결정이 심사의 절반을 미리 통과시킨다.
이 전 과정을 거쳐 심사에 올린 애드온이 UTM Builder다. 구글 시트 안에서 채널을 고르면 source와 medium이 규칙대로 자동 입력되고, 캠페인·콘텐츠 값을 컨벤션에 맞게 검증해 잘못된 값은 차단하며, 생성 이력을 자동 기록한다. 제품 소개와 사용법은 mcpy.kr/ko/tools/utm-builder에서 볼 수 있다. 마켓플레이스 공개는 심사 통과 후
근거·출처
- 제품 페이지: UTM Builder 소개 (mcpy.kr)
- 개인정보처리방침: mcpy.kr/ko/utm-builder/privacy
- 이용약관: mcpy.kr/ko/utm-builder/terms
- 공식 문서: Google Workspace Marketplace 게시 가이드
- 스코프 최소화: Marketplace 앱 심사(비민감 스코프 권장)
이 글은 2026-07-07 실제 제출 과정을 1인칭으로 기록한 구축기다. 심사 소요 기간(며칠~2주)은 구글 공식 안내 범위이며 결과는 케이스마다 다를 수 있다. 스크린샷 대신 화면 위치를 텍스트로 표기했다.
이 글이 도움이 되었다면 공유해주세요
최신 인사이트
카카오톡 공유 썸네일 안 나올 때 해결법 (Kakao JavaScript SDK 2025)
카카오톡 공유하기에서 썸네일 이미지가 안 나오는 원인과 scrapImage로 KAGE URL을 변환해 해결하는 방법을 단계별로 설명합니다. 지금 확인하세요.
Claude Code 서브에이전트로 CRM 사용자 설명서 20분 만에 완성하는 방법
Claude Code 서브에이전트를 활용해 CRM 코드베이스에서 사용자 설명서와 비주얼 가이드북을 20분 만에 자동 생성한 실전 사례를 공유합니다. 지금 확인하세요.
GEO 생성형 엔진 최적화: 2025년 AI 마케팅 전략 완전 가이드
GEO 생성형 엔진 최적화란 무엇이며 기존 SEO와 어떻게 다른지, 2025년 AI 마케팅 전략의 핵심 실행 방법 5가지를 데이터와 함께 알아보세요.
관련 프로젝트
새 글을 이메일로 받아보세요
마케팅, 분석, 개발 인사이트를 정리해서 보내드려요.