# Phase 7: Event Lookup & Parameter Library Web App Google Apps Script를 활용한 Event Taxonomy Sheet 기반 업무 지원용 앱 배포. ## Objectives 1. Event Taxonomy 데이터 조회 앱 2. 실시간 파라미터 참조 도구 3. 비개발자용 Self-service 도구 4. 팀 간 일관된 이벤트 정보 공유 ## App Architecture ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Google Sheets │────▶│ Apps Script │────▶│ Web App │ │ (Taxonomy DB) │ │ (Backend) │ │ (Frontend) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ``` ## Google Sheets Data Source ### Required Sheets - Events Master - Parameters Reference - Custom Definitions - Platform Mapping ### Column Requirements → Phase 4 참조: [phase4-taxonomy.md](phase4-taxonomy.md) ## Apps Script Setup ### 1. Project Creation ``` 1. Google Sheets 열기 2. Extensions > Apps Script 3. 프로젝트 이름 설정 ``` ### 2. Core Functions #### Data Retrieval ```javascript function getEventsData() { const sheet = SpreadsheetApp.getActiveSpreadsheet() .getSheetByName('Events Master'); const data = sheet.getDataRange().getValues(); const headers = data[0]; return data.slice(1).map(row => { const obj = {}; headers.forEach((header, i) => { obj[header] = row[i]; }); return obj; }); } function getParametersData() { const sheet = SpreadsheetApp.getActiveSpreadsheet() .getSheetByName('Parameters Reference'); const data = sheet.getDataRange().getValues(); const headers = data[0]; return data.slice(1).map(row => { const obj = {}; headers.forEach((header, i) => { obj[header] = row[i]; }); return obj; }); } ``` #### Search Function ```javascript function searchEvents(query) { const events = getEventsData(); const searchTerm = query.toLowerCase(); return events.filter(event => event.event_name.toLowerCase().includes(searchTerm) || event.event_category.toLowerCase().includes(searchTerm) || event.notes.toLowerCase().includes(searchTerm) ); } function getEventDetails(eventName) { const events = getEventsData(); const params = getParametersData(); const event = events.find(e => e.event_name === eventName); if (!event) return null; const eventParams = event.parameters.split(',').map(p => p.trim()); const paramDetails = params.filter(p => eventParams.includes(p.parameter_name) ); return { event: event, parameters: paramDetails }; } ``` ### 3. Web App Handler ```javascript function doGet(e) { return HtmlService.createHtmlOutputFromFile('index') .setTitle('GTM Event Lookup') .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL); } function doPost(e) { const action = e.parameter.action; switch(action) { case 'search': return ContentService.createTextOutput( JSON.stringify(searchEvents(e.parameter.query)) ).setMimeType(ContentService.MimeType.JSON); case 'details': return ContentService.createTextOutput( JSON.stringify(getEventDetails(e.parameter.eventName)) ).setMimeType(ContentService.MimeType.JSON); default: return ContentService.createTextOutput( JSON.stringify({error: 'Invalid action'}) ).setMimeType(ContentService.MimeType.JSON); } } ``` ### 4. HTML Frontend (index.html) ```html