트렌비 트렌봇 팀이 운영팀에서 구글 시트로 넘겨주는 세일 정보를 곧바로 시스템에 반영하기 위해 Apps Script로 시트에 커스텀 UI와 API 연동을 붙인 소개다. 커스텀 메뉴와 사이드바를 만들고 버튼 이벤트에서 외부 REST API를 호출하는 전 과정을 코드와 함께 짚는다. 권한 요청 관련 함정도 함께 나온다.
핵심 포인트- 시트에 정리된 자료는 그 자체로 데이터베이스와 다를 바 없어 Apps Script를 붙이면 바로 활용할 수 있다.
- 커스텀 메뉴와 다이얼로그, 사이드바를 만들고 직접 작성한 자바스크립트 함수를 실행할 수 있다.
- 계정 기반 권한과 히스토리 관리가 되고 사용자가 익숙한 표 UI를 그대로 쓴다는 점이 이점이다.
- onOpen에서 바로 UI를 띄우지 않고 메뉴를 거치게 한 것은 사용자의 직접 행위가 있어야 권한 요청 팝업이 뜨기 때문이다.
- 브라우저에 여러 구글 계정이 로그인돼 있으면 권한을 줘도 권한 없음 오류가 나며 알려진 해결책이 없다.
- UrlFetchApp으로 외부 REST API를 호출할 수 있어 시트를 그대로 운영 도구로 쓸 수 있다.
상세 정리- 배경: 트렌봇 팀은 세계 곳곳에서 상품 정보를 수집·정제해 서비스와 운영 페이지에 제공하며, 특정 판매처에 세일가를 적용하거나 특정 상품을 별도 카테고리에 노출하는 식의 요청을 받는다.
- 시급성: 세일은 기간과 할인율이 바뀌므로 반영이 늦으면 의미가 없어지고, 운영팀은 그래서 구글 시트로 정리해 전달한다.
- 착안점: 관리 도구를 새로 만드는 대신 시트에 스크립트를 붙여 입력된 데이터를 바로 쓰기로 했다.
- 생성 위치: 시트 상단 메뉴의 확장 프로그램에서 Apps Script를 만들면 현재 시트와 자동으로 연결된다. 배포하면 다른 시트에서도 쓸 수 있다.
- 편집기 구성: 전반 상태와 배포 현황을 보는 개요, 파일 관리와 테스트를 하는 편집기, 함수 호출 조건을 거는 트리거, 실행 로그를 보는 실행 기록, 프로젝트 설정으로 나뉜다.
- 메뉴 만들기: onOpen에서 메뉴 추가 함수를 부르고, SpreadsheetApp의 UI 객체로 상단에 메뉴와 하위 항목을 만들며 항목에 실행할 함수 이름을 문자열로 지정한다.
- 사이드바 만들기: HtmlService로 별도 html 파일에서 템플릿을 만들어 제목을 붙이고 showSidebar로 띄운다.
- 권한 흐름: 메뉴를 처음 누르면 권한 요청 팝업이 뜨고 계정 연결과 승인을 거친 뒤에야 사이드바가 나온다.
- 권한 함정 1: 사용자의 직접 행위 없이 실행하면 팝업 없이 권한 없음 오류만 나므로 메뉴를 거치는 구조가 필요하다.
- 권한 함정 2: 여러 구글 계정이 동시에 로그인된 상태면 승인 후에도 오류가 나며 공식 문서에도 알려진 이슈로 올라 있다. 한 계정으로만 로그인해야 한다.
- 이벤트 연결: 사이드바 html에서 버튼에 onclick을 걸고, google.script.run으로 스크립트 파일의 함수를 호출한다.
- 콜백 처리: withSuccessHandler로 성공 시 핸들러를 지정하며 실패용 핸들러도 붙일 수 있다.
- 데이터 읽기: SpreadsheetApp으로 현재 시트 이름과 파일 ID, 실행 사용자 이메일을 얻고 getSheetValues로 범위를 지정해 값을 배열로 가져온다.
- API 호출: 인증 정보를 base64로 인코딩해 헤더에 담고 method와 contentType, payload를 지정해 UrlFetchApp의 fetch로 외부 API에 POST한다.
- 결과 전달: 함수가 반환한 값이 사이드바에서 지정한 성공 핸들러의 인자로 넘어와 화면에 표시된다.
- 확장 가능성: 읽기뿐 아니라 쓰기 기능도 쓸 수 있고, 엑셀 파일을 PDF로 만들어 메일로 보내는 식의 자동화 도구도 만들 수 있다.
- 적용 범위: Apps Script는 시트 전용이 아니라 구글이 제공하는 여러 서비스에 붙일 수 있어 메일 자동 응답기 같은 것도 가능하다.
왜 읽나운영팀이 시트로 넘겨주는 데이터를 매번 손으로 옮기고 있다면, 관리 도구를 새로 만들지 않고 시트 자체를 입력 인터페이스로 쓰는 최소 구성을 볼 수 있다.