RevOps 팀의 월간 MRR 통합 복붙을 Apps Script로 없애는 법

RevOps 팀의 월간 MRR 통합 복붙을 Apps Script로 없애는 법

TL;DR
Google Sheets 5개 원천 시트를 Apps Script 데일리 스냅샷으로 통합해 매일 5~10분짜리 복붙 작업을 0으로 만들었습니다.
핵심 단계: 원천 시트 수식 안정화(LET/FILTER) → 스냅샷 스크립트 작성 → 트리거 등록 → 월간 대시보드 연결.
IMPORTRANGE 단독 의존은 503 에러로 자주 깨집니다. 수식 + 스크립트 2단계 조합이 안정적입니다.

Looker가 이미 운영 중인 조직에서도, 5개 시트 결과를 하나로 모으는 마지막 단계는 사람이 손으로 복붙하고 있었습니다. B2B SaaS 도메인에서 RevOps를 맡아본 경험상 이 패턴은 생각보다 훨씬 흔합니다. Google Sheets와 Apps Script만으로 그 1마일을 닫은 과정을 단계별로 풀어봅니다.

왜 이걸 만들었나 — BI가 있어도 복붙은 남는다

월간 MRR 흐름을 보려면 매번 신규/이탈/확장/축소 분해 시트 3종, 종량제 매출 시트를 따로 열어야 했습니다. 각 시트의 원천 데이터 적재는 이미 자동화돼 있었지만, “결과를 하나로 모아서 전체 매출 플로우를 본다”는 마지막 단계만 사람이 직접 처리하고 있었습니다.

매일 5~10분. 숫자로는 작아 보이지만, 이 작업이 살아 있는 한 데일리 점검은 사실상 불가능합니다. 점검 주기가 월 1회로 굳어지면 그 사이 무슨 일이 일어나는지 볼 방법이 없습니다.

트리거가 된 순간은 명확했습니다. 월초 결제 실패 고객사 비율을 추적하고 싶었는데, 월 1회 갱신 구조로는 그 변화 폭 자체가 잡히지 않았습니다. 새 BI 도구를 도입하거나 데이터 파이프라인을 새로 구성하는 건 리소스 낭비였고, 기존 시트 위에 자동화 한 겹만 얹는 것으로 충분하다는 판단을 했습니다.

준비물

  • Google Workspace 계정 (Apps Script 실행 및 트리거 등록 권한 포함)
  • 통합 대상 원천 시트 5개 편집 권한
  • 스냅샷을 쌓을 통합 시트 1개 (신규 생성 또는 기존 시트 지정)
  • 월간 대시보드 시트 1개 (통합 시트에서 값을 읽어올 최종 뷰)
  • clasp (선택 사항 — 로컬 git 버전 관리가 필요한 경우에만 도입)
  • 매월 반복하는 통합 작업의 단계 명세 (입력 → 가공 → 출력 1줄씩 정리)
Close-up of colorful financial charts and a pencil on a wooden desk.
Photo by RDNE Stock project on Pexels

1. 원천 시트 수식을 LET/FILTER로 안정화하기

IMPORTRANGE 단독으로 5개 시트를 한 곳에 모으면 503 에러와 refresh 지연으로 자주 깨집니다. 통합 시트의 신뢰성이 떨어지면 결국 사람이 다시 손을 대게 됩니다.

대신 각 원천 시트 내부에서 LET와 FILTER로 필요한 컬럼을 먼저 정제하고, 통합 시트는 그 결과만 참조하도록 구조를 바꿉니다. IMPORTRANGE는 원천 시트 → 정제 시트 단 1회만 사용하고, 이후 참조는 시트 내부 수식으로만 처리합니다.

=LET(
  raw, IMPORTRANGE("시트_URL", "MRR분해!A:F"),
  filtered, FILTER(raw, ISNUMBER(INDEX(raw,,2))),
  filtered
)

이 수식을 원천 시트별로 적용해 정제 범위를 고정합니다. Apps Script가 스냅샷을 찍는 시점에 이 범위를 읽어가므로, 수식이 안정적이어야 스크립트 결과도 안정적입니다.

2. Apps Script로 데일리 스냅샷 스크립트 작성하기

Google Sheets 메뉴의 확장 프로그램 → Apps Script에서 스크립트를 작성합니다. 핵심 동작은 세 가지입니다. 원천 시트 정제 범위를 읽고, 날짜 열을 붙여 통합 시트에 행 단위로 추가하고, 중복 스냅샷을 방지하기 위해 당일 날짜 행이 이미 있으면 스킵합니다.

function takeSnapshot() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const today = Utilities.formatDate(new Date(), "Asia/Seoul", "yyyy-MM-dd");

  // 통합 스냅샷 시트
  const dest = ss.getSheetByName("Total_Paid_MRR");
  const lastRow = dest.getLastRow();

  // 당일 스냅샷 중복 방지
  if (lastRow > 1 && dest.getRange(lastRow, 1).getValue() === today) return;

  // 원천 시트별 정제 범위 읽기 (예: MRR_New 시트의 C2:C 합계)
  const sources = ["MRR_New", "MRR_Churn", "MRR_Expansion", "Push_Revenue", "Review_Deferred"];
  const row = [today];
  sources.forEach(name => {
    const sheet = ss.getSheetByName(name);
    const vals = sheet.getRange("C2:C" + sheet.getLastRow()).getValues();
    const sum = vals.reduce((acc, v) => acc + (Number(v[0]) || 0), 0);
    row.push(sum);
  });

  dest.appendRow(row);
}

시트 이름과 범위는 실제 구성에 맞게 수정합니다.

3. 트리거 등록 및 월간 대시보드 연결하기

Apps Script 편집기 좌측 메뉴의 트리거(알람 아이콘)에서 takeSnapshot 함수를 시간 기반 트리거로 등록합니다. 매일 오전 원하는 시간대(예: 오전 7~8시)로 설정하면 됩니다.

// 트리거를 코드로 등록하고 싶을 때 (1회만 실행)
function createDailyTrigger() {
  ScriptApp.newTrigger("takeSnapshot")
    .timeBased()
    .everyDays(1)
    .atHour(7)
    .create();
}

트리거 등록 후 월간 대시보드 시트에서는 Total_Paid_MRR 시트를 FILTER로 참조해 당월 행만 집계합니다. 이 구조를 갖추면 사람이 손대는 단계는 0입니다. clasp를 쓴다면 로컬에서 `clasp push`로 배포하고 git으로 변경 이력을 관리할 수 있습니다. 단순 자동화라면 GAS 에디터 안에서만 작업해도 충분합니다.

마무리

Claude Code 프롬프트

Google Sheets 5개 원천 시트를 Apps Script 데일리 스냅샷으로 자동 통합하는 시스템을 만들어줘.

기술 스택: Google Sheets, Google Apps Script, LET/FILTER 수식, IMPORTRANGE (원천 정제 1회만), clasp (옵션, 로컬 git 관리용). 시트 이름과 집계 컬럼은 내가 별도로 알려줄게.

단계 순서:
1. 각 원천 시트에 LET/FILTER 수식 적용해 정제 범위 고정 — 수식이 값을 반환하는지 확인
2. Apps Script takeSnapshot 함수 작성 — 당일 날짜 중복 방지 로직 포함, appendRow로 통합 시트에 적재 — Logger.log로 행 추가 확인
3. createDailyTrigger 함수로 매일 오전 7시 트리거 등록 — 트리거 목록에서 등록 확인
4. 월간 대시보드 시트에서 FILTER로 당월 행만 참조하는 수식 작성 — 집계값이 원천 합계와 일치하는지 교차 검증

이 시스템의 진짜 효용은 시간 절약보다 그동안 보이지 않던 metric이 보이기 시작하는 데 있습니다. 월초 결제 실패율처럼 데일리 스냅샷 없이는 절대 잡히지 않는 변화 폭이 대표적입니다.

GAS를 직접 짤 줄 몰라도 됩니다. 본인이 매월 반복하는 통합 작업을 “어떤 시트의 어떤 컬럼을 어떻게 모아서 어떤 결과로 만든다”는 형태로 한 단락 명세하고, Claude에 넘기면 스크립트 초안은 충분히 받아낼 수 있습니다. 명세 능력이 자동화의 시작입니다. 🙂


글쓴이: YJ — 여행/레저 플랫폼부터 이커머스 SaaS까지 14년간 세일즈/Revenue Growth를 만들어왔습니다. 매일 업무에 AI를 쓰며 검증한 활용법을 기록합니다.


Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top