복잡한 업무 자동화의 핵심은 내가 해야 할 일과 에이전트에게 시킬 일을 분리하고, 비즈니스 로직을 구조화하는 것이다. 프롬프트를 잘 쓰는 것보다 이 분리가 먼저다.
업무 자동화에서 내가 해야 할 일과 에이전트에게 시킬 일을 어떻게 분리할까?
보통 이메일을 보낸다는 것은 내부적인 업무가 완료되고 나서 결과나 내용을 공유하는 가장 마지막에 위치한 프로세스일 것이다.
이메일 관련 마지막 시나리오는 다음과 같다.
스프레드시트에 비즈니스 데이터가 있고,
그 데이터를 조합해서 파일을 생성하고,
파일을 첨부 파일로 추가해서 메일을 발송한다
아래 예시는 엑셀 작업을 사람이 일일이 타이핑해서 PDF로 뽑고 메일 보내던 과정을 버튼 하나로 끝낼 수 있게 만든 워크플로우다.
Google Sheets에서 PDF 생성 및 전송 | Apps Script | Google for Developers
바로 활용해도 되지만, 내가 해야 할 일과 코딩 에이전트에게 시킬 일을 분리해 보면 다음과 같다.
✓ 데이터 조합 = 비즈니스 로직 정리 필요
✓ 파일 생성 = 정해진 문서 양식 필요
✓ 첨부 파일 = 개별마다 다른 파일 관리 필요
비즈니스 데이터 - 스프레드시트
Customers(고객)
Products(상품)
Transactions(거래 내역) 시트
Invoices 시트
비즈니스 로직 정리
**비즈니스 로직은 사용자 계산해서 입력하던 수식이거나 액션을 글로써 정리하는 것이다. 이렇게 정리를 해본 경험이 부족한 사람은 어렵게 느낄 수 있다. **
고객 Sheet에 있는 고객 정보별로 루프를 돌면서 PDF 파일을 만들고 청구서(Invoces 시트)를 만든다.
Invoice No
청구서 번호: 6자리의 랜덤 숫자를 생성한다.
Invoice Date
오늘 날짜로 설정한다.
Customer
Customer 시트에 있는 개별 고객 정보 중 Customer Name
Customer 시트에 있는 개별 고객 정보 중 Email
Notes
빈값
Amount Due
Transaction 시트의 거래 내역을 하나씩 보면서 해당 고객이 구매한 내역을 찾은 후 어떤 상품인지 정보를 찾고(products), 수량과 가격을 곱해 금액(Amount)을 계산한다.
모든 상품의 금액을 더해 총액(Total Amount)을 구합니다.
Due Date
오늘 날짜로부터 15일 뒤의 납기일(Due Date)을 계산
Invoice Link
PDF로 만들어진 Invoice 정보의 링크
Email Sent
이메일 발송 여부
이메일 발송
Invocies 시트의 Email Sent 가 N인 항목은 첨부파일과 함께 메일을 발송한다.
전용 템플릿 준비
Invoice Template 시트로 PDF로 만들기 위한 템플릿
보통은 업무 데이터가 쌓여 있는 스프레드시트가 있어서, 그 스프레드시트에서 Google Apps Script 가 동작하기를 원할 것이다.
그래서 기존과 동일하게 프로젝트를 생성하고 난 후 기존 스프레드시트와 연동하는 방법에 대해서 정리해 보겠다.
설정 파일 직접 수정 방법
가장 확실한 방법은 .clasp.json 파일의 parentId, scriptID 항목을 새 스프레드시트 ID와 scriptID로 교체하는 것이다.
확인하려는 구글 스프레드시트를 열고 주소창을 보면 주소가 다음과 같은 형식으로 되어 있는데, https://docs.google.com/spreadsheets/d/[이 부분이 ID입니다]/edit#gid=0 /d/ 와 /edit 사이에 있는 길****고 복잡한 영문+숫자 조합이 바로 스프레드시트 ID입니다.
ScriptID는 먼저 새로운 앱스 스크립트를 선택한 후 프로젝트 설정에서 Apps Script 프로젝트 ID 복사할 수 있다.
/image_002.png)
새로운 Apps Script 프로젝트 생성
/image_003.png)
프로젝트 설정에서 Apps Script 프로젝트 ID 복사
그러고 나서 Antigravity에서 .clasp.json 파일을 선택한 후 두 가지 값을 교체한다.
/image_004.png)
이는 스프레드시트가 부모, Apps Script가 자식 관계인 것을 알 수 있는데, 우리가 스프레드시트를 기반으로 하기 때문에 당연한 것 같기도 하다. 독립형 프로젝트는 parentID가 빈 값으로 나온다.
이게 끝이 아니다. 배포를 위해서 한 번 더 작업을 해줘야 한다.
다음 쉘 프로그램을 선물로 준비했다.
해당 프로그램은 수정한 .clasp.json 파일을 기준으로 Github에 우리도 모르게 설정한 secret 값들을 갱신하고 만들어진 코드를 Apps Script에 자동으로 반영하는 역할을 수행한다.
#!/bin/bash
# 1. 인자가 전달된 경우 .clasp.json 파일 먼저 업데이트
if [ ! -z "$1" ] && [ ! -z "$2" ]; then
NEW_PARENT_ID=$1
NEW_SCRIPT_ID=$2
# jq를 사용하여 JSON 필드 수정
tmp=$(mktemp)
jq --arg pid "$NEW_PARENT_ID" --arg sid "$NEW_SCRIPT_ID" '.parentId = $pid | .scriptId = $sid' .clasp.json > "$tmp" && mv "$tmp" .clasp.json
echo "📝 .clasp.json 파일이 새로운 ID로 업데이트되었습니다."
fi
# 2. .clasp.json에서 현재 설정값 읽기
CURRENT_SCRIPT_ID=$(jq -r '.scriptId' .clasp.json)
CURRENT_PARENT_ID=$(jq -r '.parentId' .clasp.json)
# scriptId 유효성 체크
if [ "$CURRENT_SCRIPT_ID" == "null" ] || [ -z "$CURRENT_SCRIPT_ID" ]; then
echo "❌ 에러: .clasp.json 파일에서 scriptId를 찾을 수 없습니다."
exit 1
fi
# 3. GitHub Secrets 업데이트 (자동 배포용)
echo "🔐 GitHub Secret (SCRIPT_ID) 동기화 중..."
gh secret set SCRIPT_ID -b"$CURRENT_SCRIPT_ID"
# 4. Google Apps Script로 푸시
echo "🚀 Google Apps Script로 코드 푸시 중 (clasp push)..."
clasp push --force
echo "--------------------------------------------------"
echo "✅ 모든 업데이트 및 푸시가 완료되었습니다!"
echo "📍 적용된 시트 ID: $CURRENT_PARENT_ID"
echo "📍 적용된 스크립트 ID: $CURRENT_SCRIPT_ID"
echo "✨ 이제 로컬과 GitHub, 구글 서버가 모두 동기화되었습니다."
echo "--------------------------------------------------"
해당 내용은 gas-template에 반영해서 어떤 프로젝트에서든 사용할 수 있도록 하였으니, 참고만 하면 된다.
다음 글에서는 바이브 코딩으로 저 프로젝트를 한번 만들어보도록 하겠다. 임시 보관함 활용법도 같이 참고하면 좋다.
불러오는 중...