# GemEgg 予実管理スプレッドシート 프로젝트 진행 기록 ## 프로젝트 개요 - **프로젝트명**: GemEgg 予実管理 스프레드시트 자동화 - **시작일**: 2025-12-05 - **상태**: ✅ 완료 ## 의뢰 내용 GemEgg용 스프레드시트 3종 제작: 1. **予算入力シート** - 예산을 직접 입력 2. **実績入力シート** - Money Forward CSV 붙여넣기 3. **予実出力シート** - 예산 vs 실적 비교 출력 ## 진행 과정 ### Phase 1: 환경 설정 | 시간 | 작업 | 상태 | |------|------|------| | 13:27 | 작업 디렉토리 생성 | ✅ | | 13:28 | CSV 파일 다운로드 | ✅ | | 13:29 | CSV 인코딩 변환 (Shift-JIS → UTF-8) | ✅ | | 13:30 | 서비스 계정 키 복사 | ✅ | ### Phase 2: 프로젝트 구조 생성 | 시간 | 작업 | 상태 | |------|------|------| | 13:35 | Node.js 프로젝트 초기화 (pnpm) | ✅ | | 13:40 | Python 프로젝트 초기화 (venv) | ✅ | | 13:45 | Apps Script 코드 작성 | ✅ | ### Phase 3: 스프레드시트 분석 | 시간 | 작업 | 상태 | |------|------|------| | 13:50 | PlanitAI 원본 스프레드시트 구조 분석 | ✅ | | 14:00 | CSV 데이터 구조 분석 | ✅ | | 14:05 | 시트 레이아웃 설계 | ✅ | ### Phase 4: 시트 생성 | 시간 | 작업 | 상태 | |------|------|------| | 14:15 | setup-sheets.js 작성 | ✅ | | 14:18 | 시트 생성 스크립트 실행 | ✅ | | 14:20 | 予算入力シート 생성 완료 | ✅ | | 14:20 | 実績入力シート 생성 완료 | ✅ | | 14:20 | 予実出力シート 생성 완료 | ✅ | ### Phase 5: 데이터 임포트 | 시간 | 작업 | 상태 | |------|------|------| | 14:25 | import-csv.js 작성 | ✅ | | 14:28 | CSV 데이터 임포트 실행 | ✅ | | 14:28 | 실적 데이터 23개 항목 임포트 완료 | ✅ | ### Phase 6: 블로그 작성 | 시간 | 작업 | 상태 | |------|------|------| | 14:22 | v1 - 프로젝트 소개 | ✅ | | 14:26 | v2 - 환경 설정 | ✅ | | 14:30 | v3 - CSV 파싱 | ✅ | | 14:30 | v4 - 시트 레이아웃 | ✅ | | 14:31 | v5 - 예산입력시트 | ✅ | | 14:31 | v6 - 실적입력시트 | ✅ | | 14:31 | v7 - 예실출력시트 | ✅ | | 14:33 | v8 - 조건부 서식 | ✅ | | 14:33 | v9 - 자동화 | ✅ | | 14:33 | v10 - 완성 | ✅ | ### Phase 7: Apps Script 배포 | 시간 | 작업 | 상태 | |------|------|------| | 14:45 | Code.gs 완성 버전 작성 | ✅ | | 14:50 | 사용자가 스프레드시트에 배포 | ✅ | | 14:50 | 메뉴 등록 확인 | ✅ | ## 생성된 파일 ``` 20251205-worksheet-17AUAHQQB0nZVje9QXtdISEPtMoa8RXKkuCk4R5iHbd4/ ├── gemegg_monthly_pl_2025-04_2026-03.csv # 실적 CSV ├── progress.md # 진행 기록 (현재 파일) ├── prompts.md # 사용 프롬프트 ├── 20251205-worksheet-gemegg-v1.md ~ v10.md # 블로그 10편 │ └── project/ ├── .env # 환경 변수 ├── service-account-key.json # 서비스 계정 키 │ ├── nodejs/ # Node.js 구현 │ ├── package.json │ ├── pnpm-lock.yaml │ ├── node_modules/ │ └── src/ │ ├── analyze-sheet.js │ ├── setup-sheets.js │ └── import-csv.js │ ├── python/ # Python 구현 │ ├── requirements.txt │ ├── venv/ │ └── src/ │ └── analyze_sheet.py │ └── apps-script/ # Apps Script └── Code.gs ``` ## 스프레드시트 정보 - **Document ID**: `17AUAHQQB0nZVje9QXtdISEPtMoa8RXKkuCk4R5iHbd4` - **URL**: https://docs.google.com/spreadsheets/d/17AUAHQQB0nZVje9QXtdISEPtMoa8RXKkuCk4R5iHbd4 - **서비스 계정**: `gemegg@spatial-cargo-456805-u2.iam.gserviceaccount.com` ## 생성된 시트 | 시트명 | 용도 | 기능 | |--------|------|------| | **予算入力** | 예산 입력 | 월별 예산 직접 입력, 기간 누계 자동 계산 | | **実績入力** | 실적 입력 | CSV 붙여넣기 영역 (노란색 배경) | | **予実出力** | 예실 비교 | 예산/실적/차이/달성률 자동 계산, 색상 코딩 | ## Apps Script 기능 ### 메뉴 구조 ``` 🔷 GemEgg予実管理 ├── 📊 予実シートを更新 ├── 初期設定 ▶ │ ├── 予算シートを初期化 │ ├── 実績シートを初期化 │ └── 予実シートを初期化 ├── 自動化 ▶ │ ├── 毎日自動更新を設定 │ ├── 毎月自動更新を設定 │ └── トリガーを全削除 └── ℹ️ 使い方 ``` ### 자동화 옵션 - 매일 9시 자동 업데이트 - 매월 1일 10시 자동 업데이트 ## 기술 스택 | 구현 | 언어 | 패키지 매니저 | 주요 라이브러리 | |------|------|--------------|----------------| | Node.js | JavaScript (ES Modules) | pnpm | googleapis, csv-parse | | Python | Python 3.x | venv + pip | google-api-python-client, pandas | | Apps Script | Google Apps Script | - | SpreadsheetApp, ScriptApp | ## 임포트된 데이터 ``` 📊 実績データ (9ヶ月分: 2025-04 ~ 2025-12) ├── 売上高: 12,852,347円 ├── 販売管理費 計: 12,604,644円 ├── 営業損益金額: 247,703円 └── 当期純損益金額: 247,703円 ``` --- ## 2025-12-07 수정 작업 ### Phase 8: 予実出力 시트 개선 | 시간 | 작업 | 상태 | |------|------|------| | - | 売上高/売上原価 중복 항목 제거 | ✅ | | - | 年間(期間累計) 열 추가 | ✅ | | - | 4행 월별 헤더 셀 결합 | ✅ | | - | 5행 중앙 정렬 적용 | ✅ | | - | VLOOKUP 수식으로 予算/実績 연결 | ✅ | | - | 숫자 콤마 서식 적용 | ✅ | | - | 差異 조건부 서식 (마이너스=빨강, 플러스=녹색) | ✅ | | - | 폴더 이동 (서비스 계정 권한 없음) | ⚠️ 수동 필요 | ### Phase 9: VLOOKUP 수식 수정 | 시간 | 작업 | 상태 | |------|------|------| | - | VLOOKUP 열 번호 오류 발견 | ✅ | | - | 2025-04, 2025-05 사용자 수동 수정 | ✅ | | - | 2025-06 ~ 2026-03 자동 수정 (10개월) | ✅ | ### VLOOKUP 수식 수정 내역 **문제점**: 모든 월의 実績 열이 동일한 열 번호(6)를 참조하여 같은 값이 표시됨 **수정된 수식 패턴**: ``` 실績入력 시트 구조: $C:$T 범위 - 2025-04: =IFERROR(VLOOKUP($B6,'実績入力'!$C:$T,6,FALSE),0) - 2025-05: =IFERROR(VLOOKUP($B6,'実績入力'!$C:$T,7,FALSE),0) - 2025-06: =IFERROR(VLOOKUP($B6,'実績入力'!$C:$T,8,FALSE),0) - ... - 2026-03: =IFERROR(VLOOKUP($B6,'実績入力'!$C:$T,17,FALSE),0) ``` **수정된 열 매핑**: | 월 | 予実出力 열 | VLOOKUP 열번호 | |---|---|---| | 2025-04 | D | 6 | | 2025-05 | H | 7 | | 2025-06 | L | 8 | | 2025-07 | P | 9 | | 2025-08 | T | 10 | | 2025-09 | X | 11 | | 2025-10 | AB | 12 | | 2025-11 | AF | 13 | | 2025-12 | AJ | 14 | | 2026-01 | AN | 15 | | 2026-02 | AR | 16 | | 2026-03 | AV | 17 | --- ## 생성된 추가 파일 ``` project/nodejs/src/ └── update-output-sheet.js # 予実出力 시트 업데이트 스크립트 ``` --- ## 향후 개선 가능 사항 1. 대시보드 시트 추가 (차트 시각화) 2. 예산 초과 시 이메일 알림 3. 다중 회계연도 비교 기능 4. Vertex AI 연동 인사이트 분석 --- **작성일**: 2025-12-05 **최종 수정**: 2025-12-07 **작성자**: Claude Code