# v9: GemEgg 예실관리 - 자동화 및 트리거 ## Google Apps Script 자동화 ### 메뉴 추가 ```javascript function onOpen() { const ui = SpreadsheetApp.getUi(); ui.createMenu('GemEgg予実管理') .addItem('予算シートを初期化', 'initBudgetSheet') .addItem('実績シートを初期化', 'initActualSheet') .addItem('予実シートを更新', 'updateBudgetVsActual') .addSeparator() .addItem('CSVからインポート', 'importFromCSV') .addToUi(); } ``` ### 시트 초기화 함수 ```javascript function initBudgetSheet() { const ss = SpreadsheetApp.getActiveSpreadsheet(); let sheet = ss.getSheetByName('予算入力'); if (!sheet) { sheet = ss.insertSheet('予算入力'); } // 헤더 설정 const headers = [ ['', '予算入力シート'], [], ['', '単位:円'], ['', '項目', '2025-04', '2025-05', /* ... */ '2026-03', '期間累計'] ]; sheet.getRange(1, 1, headers.length, 15).setValues(headers); // 서식 설정 sheet.getRange('B2').setFontSize(14).setFontWeight('bold'); sheet.getRange('B4:O4') .setBackground('#4a86e8') .setFontColor('white') .setFontWeight('bold'); SpreadsheetApp.getUi().alert('予算入力シートを初期化しました'); } ``` ### 예실 업데이트 함수 ```javascript function updateBudgetVsActual() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const budgetSheet = ss.getSheetByName('予算入力'); const actualSheet = ss.getSheetByName('実績入力'); if (!budgetSheet || !actualSheet) { SpreadsheetApp.getUi().alert('シートが見つかりません'); return; } let outputSheet = ss.getSheetByName('予実出力'); if (!outputSheet) { outputSheet = ss.insertSheet('予実出力'); } // 예산 데이터 읽기 const budgetData = budgetSheet.getRange('C5:N40').getValues(); // 실적 데이터 읽기 const actualData = actualSheet.getRange('G8:R50').getValues(); // 예실 비교 계산 및 출력 // ... SpreadsheetApp.getUi().alert('予実出力シートを更新しました'); } ``` ## 트리거 설정 ### 편집 트리거 ```javascript function onEdit(e) { const sheet = e.source.getActiveSheet(); const sheetName = sheet.getName(); // 예산 또는 실적 시트가 편집되면 예실 시트 자동 업데이트 if (sheetName === '予算入力' || sheetName === '実績入力') { updateBudgetVsActual(); } } ``` ### 시간 기반 트리거 ```javascript function createDailyTrigger() { ScriptApp.newTrigger('updateBudgetVsActual') .timeBased() .everyDays(1) .atHour(9) .create(); } function createMonthlyTrigger() { ScriptApp.newTrigger('monthlyReport') .timeBased() .onMonthDay(1) .atHour(10) .create(); } ``` ### 트리거 관리 ```javascript function listTriggers() { const triggers = ScriptApp.getProjectTriggers(); triggers.forEach(trigger => { Logger.log(`Function: ${trigger.getHandlerFunction()}`); Logger.log(`Type: ${trigger.getEventType()}`); }); } function deleteTriggers() { const triggers = ScriptApp.getProjectTriggers(); triggers.forEach(trigger => { ScriptApp.deleteTrigger(trigger); }); } ``` ## 배포 방법 ### Apps Script 프로젝트 생성 1. Google Sheet 열기 2. 확장 프로그램 > Apps Script 3. Code.gs에 코드 붙여넣기 4. 저장 (Ctrl+S) 5. 실행 > onOpen 선택 6. 권한 승인 ### 트리거 설정 1. Apps Script 편집기에서 ⏰ 트리거 클릭 2. "+ 트리거 추가" 클릭 3. 함수 선택: updateBudgetVsActual 4. 이벤트 유형: 편집 시 5. 저장 ## 다음 단계 v10에서는: - 최종 테스트 - 문서화 완료 --- **작성일**: 2025-12-05 **상태**: 완료 **다음**: v10 - 완성 및 배포