- 2026.07.29 Apps Script 프로젝트가 늘어나면 반드시 망가지는 것들
- 2026.07.16 매일 돌던 Apps Script 트리거가 갑자기 멈추는 이유
- 2026.07.15 브라우저 저장소에 고객정보 넣으면 생기는 문제
- 2026.07.07 브라우저가 내 데이터를 버릴 때: 초록 체크가 거짓말을 한다
- 2026.07.07 설치됨 ≠ 작동함: 백업 트리거가 한 번도 안 돌았다
- 2026.07.07 GAS엔 점진 배포가 없다: '맞는' 검사 하나가 전 사용자를 잠근다
- 2026.07.07 시트가 텍스트를 날짜로 바꾼다: '2026-06'이 완료를 영영 막을 때
- 2026.06.18 여러 사람이 한 시트에 쓰는 점검 앱: 동시성·중복·내보내기 설계
- 2026.06.12 셀을 한 칸씩 읽지 마라: 서비스 호출이 진짜 비용이다
- 2026.06.11 시트 셀에 JSON·이미지를 통째로 넣으면 터진다
- 2026.06.10 웹앱 배포 설정 하나가 보안 모델을 정한다: Execute as / 접근 권한
- 2026.06.09 GAS 6분 실행 한도: 멈추기 전에 끊어서 재개하라
- 2026.06.08 PropertiesService는 데이터베이스가 아니다: 9KB의 벽
- 2026.06.07 모바일에서 화면을 이미지로 저장할 때 멈추는 진짜 이유
- 2026.06.06 동시에 같은 시트를 쓰면 깨진다: LockService와 30 동시 실행 천장
- 2026.06.05 재배포할 때마다 주소가 바뀌면 안 된다: /exec URL 고정
- 2026.06.04 외부 호출은 가끔 실패한다: 지수 백오프와 재시도 예산
- 2026.06.03 HtmlService 앱은 껍데기 먼저: 비동기 로드와 모바일 뒤로가기 지금 보는 글
- 2026.06.02 GAS를 졸업해야 할 때: 한계 신호와 외부 DB 이전
- 2026.06.01 GAS에 지능과 엔진룸을 더하기: Vertex AI와 Cloud Run
HtmlService 앱은 껍데기 먼저: 비동기 로드와 모바일 뒤로가기
템플릿에서 긴 데이터 로드를 하면 첫 화면이 늦는다. 껍데기를 먼저 그리고 google.script.run으로 비동기 로드하되, 모든 호출에 실패 핸들러를 붙여라.
HtmlService 템플릿에서 데이터를 통째로 불러오지 마라. 스크립틀릿(<?= ?>)에서 오래 걸리는 로드를 하면 사용자는 빈 화면을 보며 기다린다. 껍데기를 먼저 그리고, 데이터는 google.script.run으로 비동기로 가져온다.
왜 중요한가
모바일에서 첫 화면이 2~3초 늦으면 사용자는 “안 켜진다”고 느낀다. 또 google.script.run은 실패할 수 있는데, 핸들러를 안 붙이면 실패가 조용히 삼켜져 화면이 멈춘 것처럼 보인다.
모든 호출에 실패 핸들러: Promise 래퍼로
function gasRun(fn, ...args) {
return new Promise((resolve, reject) => {
google.script.run
.withSuccessHandler(resolve)
.withFailureHandler(reject) // 강제: 실패를 삼키지 마라
[fn](...args);
});
}
// 사용
try {
const data = await gasRun("getItems", filter);
render(data);
} catch (err) {
showError(err); // dead overlay 금지, 재시도 경로 제공
}
raw google.script.run 직접 호출은 리뷰에서 막고, 위 래퍼만 쓰게 한다.
모바일 뒤로가기
멀티 화면 앱은 폰의 뒤로가기 버튼을 지원해야 한다. google.script.history로 상태를 push/replace 하면, 화면 전환이 브라우저 히스토리에 들어가 뒤로가기가 자연스럽게 동작한다.
잊지 말 것
<base target="_top">: iframe 안에서 링크가 부모를 바꾸게.<meta viewport>+doGet().addMetaTag('viewport', ...)둘 다: 한쪽만으론 모바일 폭이 깨진다.- 자바스크립트는 문서 하단에서 로드해 첫 렌더를 막지 않는다.
핵심 한 줄: 껍데기 먼저 → 비동기 로드(실패 핸들러 필수) → history로 뒤로가기.
자주 묻는 질문
- HtmlService 템플릿에서 데이터를 직접 로드하면 왜 문제가 생기나요?
- 스크립틀릿에서 오래 걸리는 로드를 하면 사용자가 빈 화면을 보며 기다립니다. 특히 모바일에서 2~3초 지연이 생기면 앱이 안 켜진다고 느낍니다.
- google.script.run 호출에 실패 핸들러가 없으면 어떻게 되나요?
- 실패가 조용히 삼켜져 화면이 멈춘 것처럼 보입니다. 모든 호출에 withFailureHandler를 반드시 붙여야 하고, 오류 발생 시 재시도 경로를 사용자에게 제공해야 합니다.
- HtmlService 멀티 화면 앱에서 모바일 뒤로가기를 지원하려면?
- google.script.history로 화면 전환 상태를 push 또는 replace하면 변환이 브라우저 히스토리에 기록되어 뒤로가기 버튼이 자연스럽게 동작합니다.
- 2026.07.29 Apps Script 프로젝트가 늘어나면 반드시 망가지는 것들
- 2026.07.16 매일 돌던 Apps Script 트리거가 갑자기 멈추는 이유
- 2026.07.15 브라우저 저장소에 고객정보 넣으면 생기는 문제
- 2026.07.07 브라우저가 내 데이터를 버릴 때: 초록 체크가 거짓말을 한다
- 2026.07.07 설치됨 ≠ 작동함: 백업 트리거가 한 번도 안 돌았다
- 2026.07.07 GAS엔 점진 배포가 없다: '맞는' 검사 하나가 전 사용자를 잠근다
- 2026.07.07 시트가 텍스트를 날짜로 바꾼다: '2026-06'이 완료를 영영 막을 때
- 2026.06.18 여러 사람이 한 시트에 쓰는 점검 앱: 동시성·중복·내보내기 설계
- 2026.06.12 셀을 한 칸씩 읽지 마라: 서비스 호출이 진짜 비용이다
- 2026.06.11 시트 셀에 JSON·이미지를 통째로 넣으면 터진다
- 2026.06.10 웹앱 배포 설정 하나가 보안 모델을 정한다: Execute as / 접근 권한
- 2026.06.09 GAS 6분 실행 한도: 멈추기 전에 끊어서 재개하라
- 2026.06.08 PropertiesService는 데이터베이스가 아니다: 9KB의 벽
- 2026.06.07 모바일에서 화면을 이미지로 저장할 때 멈추는 진짜 이유
- 2026.06.06 동시에 같은 시트를 쓰면 깨진다: LockService와 30 동시 실행 천장
- 2026.06.05 재배포할 때마다 주소가 바뀌면 안 된다: /exec URL 고정
- 2026.06.04 외부 호출은 가끔 실패한다: 지수 백오프와 재시도 예산
- 2026.06.03 HtmlService 앱은 껍데기 먼저: 비동기 로드와 모바일 뒤로가기 지금 보는 글
- 2026.06.02 GAS를 졸업해야 할 때: 한계 신호와 외부 DB 이전
- 2026.06.01 GAS에 지능과 엔진룸을 더하기: Vertex AI와 Cloud Run