# v7: GemEgg 예실관리 - 예실출력시트 구현 ## 예실출력시트 설계 ### 핵심 기능 1. 예산입력시트의 예산 데이터 참조 2. 실적입력시트의 실적 데이터 참조 3. 차이 (差異) 자동 계산 4. 달성률 (達成率) 자동 계산 ### 레이아웃 ``` 월별 4열 구조: │ 예산 │ 실적 │ 차이 │ 달성률 │ ``` ## Node.js 구현 코드 ```javascript async function setupOutputSheet(sheets) { const sheetName = '予実出力'; // 헤더 const headerRow1 = ['', '予実管理']; const headerRow3 = ['', '単位:円']; // 월별 서브헤더 const subHeaders = ['', '項目']; MONTHS.forEach(month => { subHeaders.push('予算', '実績', '差異', '達成率'); }); subHeaders.push('期間累計'); // 월 헤더 const monthHeaders = ['', '']; MONTHS.forEach(month => { monthHeaders.push(month, '', '', ''); }); // 항목 행 (수식 포함) const itemRows = PL_ITEMS.map((item, index) => { const indent = ' '.repeat(item.level); const row = [indent, item.name]; MONTHS.forEach((month, mIndex) => { const budgetRef = `'予算入力'!${getCol(3 + mIndex)}${5 + index}`; const actualRef = `'実績入力'!${getCol(7 + mIndex)}${index + 4}`; const rowNum = 6 + index; row.push( `=${budgetRef}`, // 예산 '', // 실적 (후에 설정) `=D${rowNum}-C${rowNum}`, // 차이 `=IF(C${rowNum}=0,"",D${rowNum}/C${rowNum})` // 달성률 ); }); row.push(''); // 기간 누계 return row; }); const allRows = [ headerRow1, [], headerRow3, monthHeaders, subHeaders, ...itemRows ]; await sheets.spreadsheets.values.update({ spreadsheetId: SPREADSHEET_ID, range: `'${sheetName}'!A1`, valueInputOption: 'USER_ENTERED', requestBody: { values: allRows } }); } ``` ## 수식 상세 ### 시트 간 참조 ``` 예산 참조: ='予算入力'!C5 실적 참조: ='実績入力'!G8 ``` ### 차이 계산 ``` =실적-예산 =D6-C6 ``` ### 달성률 계산 ``` =IF(예산=0, "", 실적/예산) =IF(C6=0,"",D6/C6) 결과: 백분율 형식 (예: 107%, 95%) ``` ### 기간 누계 ``` =SUM(C6:N6) // 12개월 예산 합계 =SUM(D6:O6) // 12개월 실적 합계 ``` ## 서식 적용 ```javascript // 헤더 배경색 (파란색) { repeatCell: { range: { sheetId, startRowIndex: 4, endRowIndex: 5, startColumnIndex: 1, endColumnIndex: 51 }, cell: { userEnteredFormat: { backgroundColor: { red: 0.29, green: 0.53, blue: 0.91 }, textFormat: { foregroundColor: { red: 1, green: 1, blue: 1 }, bold: true } } } } } // 월 헤더 배경색 (연한 파란색) { repeatCell: { range: { sheetId, startRowIndex: 3, endRowIndex: 4, startColumnIndex: 2, endColumnIndex: 51 }, cell: { userEnteredFormat: { backgroundColor: { red: 0.85, green: 0.92, blue: 0.98 } } } } } ``` ## 결과 화면 ``` ┌────────────────────────────────────────────────────────────────────────┐ │ │ 予実管理 │ ├───┼────────────────────────────────────────────────────────────────────┤ │ │ 単位:円 │ │ │ │ 2025-04 │ 2025-05 │ ... │ │ │ 項目 │予算 │実績 │差異 │率 │予算 │実績 │差異 │率 │... │ ├───┼─────────┼──────┼──────┼──────┼───┼──────┼──────┼──────┼───┼───────┤ │ │ 売上高 │ 0 │1,267K│1,267K│ - │ 0 │1,123K│1,123K│ - │ │ │ │ 役員報酬│ 0 │ 414K │ 414K │ - │ 0 │ 0 │ 0 │ - │ │ │ │ 給料手当│ 0 │ 454K │ 454K │ - │ 0 │ 460K │ 460K │ - │ │ │ │ ... │ │ │ │ │ │ │ │ │ │ └────────────────────────────────────────────────────────────────────────┘ ``` ## 다음 단계 v8에서는: - 조건부 서식 적용 - 색상 코딩 (양수/음수) --- **작성일**: 2025-12-05 **상태**: 완료 **다음**: v8 - 조건부 서식 적용