본문 바로가기
인공지능 (AI,GPT)

회의록 작성 AI에게 맡기자! ChatGPT GPTs와 Google Gemini Gem 자동화

by 날으는물고기 2025. 6. 2.

회의록 작성 AI에게 맡기자! ChatGPT GPTs와 Google Gemini Gem 자동화

728x90

AI 기술로 회의록 작성을 완전 자동화하는 방법

  • ChatGPT GPTs vs Google Gemini Gem 완전 비교 가이드

AI 시대의 업무 혁신과 플랫폼 선택

2025년, AI는 더 이상 전문가만의 도구가 아닙니다. 일반 직장인들도 일상적으로 AI를 활용하여 업무 효율성을 극대화하고 있습니다. 특히 최근 많은 사용자들이 Google Gemini로 이동하는 추세를 보이고 있는데, 이는 구글의 급진적인 AI 혁신과 생태계 통합 전략이 주효했기 때문입니다. ChatGPT GPTsGoogle Gemini Gem 두 플랫폼 모두를 활용하여 완전 자동화된 회의록 생성 시스템을 구축하는 방법을 비교 분석합니다. 특히 Gemini의 경우 Google Workspace와의 네이티브 통합이 가능하여 더욱 효율적인 솔루션을 제공할 수 있습니다.

플랫폼 선택 가이드: ChatGPT vs Gemini

ChatGPT GPTs의 장점

  • 성숙한 생태계: 풍부한 커뮤니티와 레퍼런스
  • 유연한 커스터마이징: 상세한 프롬프트 엔지니어링 가능
  • 안정적인 성능: 검증된 자연어 처리 능력

Google Gemini Gem의 장점

  • 완벽한 Google 생태계 통합: Workspace, Drive, Calendar 네이티브 연동
  • 무료 고성능 서비스: 구글의 공격적인 무료 정책으로 비용 절감
  • 실시간 데이터 접근: 최신 정보 및 실시간 검색 가능
  • 멀티모달 처리: 텍스트, 이미지, 오디오 동시 처리
  • 간편한 설정: Google 계정 하나로 모든 서비스 접근

시스템 아키텍처 비교

Option 1: ChatGPT GPTs 기반 시스템

  1. 사용자: 회의 녹취록 파일을 GPTs에 업로드
  2. GPTs: 녹취록을 분석하여 구조화된 회의록 텍스트 생성
  3. 웹훅: GPTs에서 생성된 데이터를 Apps Script로 전송
  4. Apps Script: Google Docs 템플릿에 데이터를 삽입하여 최종 문서 생성
  5. 결과: 완성된 회의록 문서가 Google Drive에 자동 저장

Option 2: Google Gemini Gem 기반 시스템

  1. 사용자: 회의 녹취록 파일을 Gemini Gem에 업로드
  2. Gemini Gem: 녹취록 분석 + Google Workspace API 직접 호출
  3. Google Docs API: 템플릿 기반 문서 직접 생성
  4. Google Drive API: 자동 폴더 분류 및 권한 설정
  5. Gmail API: 참석자 자동 알림 발송
  6. Google Calendar API: 다음 회의 일정 자동 등록

Google Gemini Gem 구현 방법

Gemini Gem 생성 및 설정

1. Gem 기본 설정

Name: Meeting Minutes Pro
Description: 회의 녹취록을 전문적인 회의록으로 변환하고 Google Workspace에 자동 통합하는 AI 어시스턴트

2. System Instructions 작성

당신은 Google Workspace 통합 회의록 전문가입니다. 다음 역할을 수행하세요:

# 핵심 역할
1. 업로드된 회의 녹취록을 분석하여 구조화된 회의록 생성
2. Google Docs API를 직접 호출하여 문서 생성
3. Google Drive에서 자동 폴더 관리 및 권한 설정
4. 참석자들에게 Gmail을 통한 자동 알림 발송
5. 다음 회의 일정을 Google Calendar에 자동 등록

# 출력 구조
회의록 분석 후 다음 작업을 순차적으로 수행:
1. 회의 정보 추출 및 구조화
2. Google Docs 문서 생성
3. 참석자 이메일 발송
4. 캘린더 이벤트 생성
5. 작업 완료 보고

# 문서 구조
- 회의 기본 정보 (일시, 참석자, 주제, 회의실)
- 핵심 논의사항 (우선순위별 분류)
- 결정사항 (승인자, 예산 포함)
- 액션 아이템 (담당자, 마감일, 우선순위)
- 차회 일정 및 예상 안건
- 첨부 자료 링크

# 특별 지시사항
- 한국어 회의의 경우 존댓말과 비즈니스 톤 사용
- 중요도에 따른 시각적 구분 (색상, 굵기 활용)
- 액션 아이템은 SMART 원칙 적용 (구체적, 측정가능, 달성가능, 관련성, 시간제한)
- 민감한 정보는 별도 보안 처리

3. Google Workspace API 통합 설정

필요한 API 활성화

  • Google Docs API
  • Google Drive API
  • Gmail API
  • Google Calendar API
  • Google Sheets API (보고서용)
300x250

Gemini Gem 고급 프롬프트 엔지니어링

# Gemini Gem에서 사용할 고급 프롬프트 예시

def generate_meeting_minutes_prompt(transcript_text):
    return f"""
다음 회의 녹취록을 분석하여 전문적인 회의록을 생성하고 Google Workspace에 통합해주세요.

# 녹취록 데이터
{transcript_text}

# 처리 단계
1. **정보 추출**: 일시, 참석자, 주제, 핵심 논의사항 파악
2. **구조화**: 중요도와 카테고리별 분류
3. **문서 생성**: Google Docs API를 사용하여 템플릿 기반 문서 작성
4. **자동화 실행**: 
   - Drive 폴더 생성/분류
   - 참석자 이메일 발송
   - 캘린더 이벤트 생성
   - 권한 설정

# 출력 형식
```json
{{
  "meetingInfo": {{
    "date": "YYYY-MM-DD",
    "time": "HH:MM-HH:MM",
    "location": "회의실 또는 온라인",
    "attendees": ["참석자1", "참석자2"],
    "subject": "회의 주제",
    "organizer": "주최자명"
  }},
  "keyDiscussions": [
    {{
      "topic": "논의 주제",
      "details": "상세 내용",
      "priority": "high|medium|low",
      "category": "전략|운영|기술|재무"
    }}
  ],
  "decisions": [
    {{
      "item": "결정 사항",
      "rationale": "결정 근거",
      "impact": "예상 영향",
      "budget": "관련 예산",
      "approver": "승인자"
    }}
  ],
  "actionItems": [
    {{
      "task": "구체적 할 일",
      "assignee": "담당자",
      "dueDate": "YYYY-MM-DD",
      "priority": "high|medium|low",
      "dependencies": "선행 조건",
      "deliverables": "산출물"
    }}
  ],
  "risks": [
    {{
      "description": "리스크 설명",
      "probability": "발생 가능성",
      "impact": "영향도",
      "mitigation": "대응 방안"
    }}
  ],
  "nextMeeting": {{
    "date": "YYYY-MM-DD",
    "agenda": "예상 안건",
    "preparation": "사전 준비사항"
  }},
  "attachments": ["첨부파일 링크들"]
}}
```

이제 Google Workspace API를 사용하여 실제 문서를 생성하고 통합 작업을 수행해주세요.
"""

Google Workspace 완전 통합 구현

1. Google Docs 자동 생성

# Gemini에서 Google Docs API 직접 호출 예시
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build

def create_meeting_document(meeting_data):
    """
    Gemini Gem에서 직접 Google Docs 문서 생성
    """

    # Google Docs API 서비스 생성
    service = build('docs', 'v1', credentials=get_credentials())

    # 문서 생성
    document = {
        'title': f"회의록_{meeting_data['meetingInfo']['subject']}_{meeting_data['meetingInfo']['date']}"
    }

    doc = service.documents().create(body=document).execute()
    document_id = doc.get('documentId')

    # 문서 내용 구성
    requests = [
        # 제목 삽입
        {
            'insertText': {
                'location': {'index': 1},
                'text': f"{meeting_data['meetingInfo']['subject']} 회의록\n\n"
            }
        },
        # 회의 정보 테이블 생성
        {
            'insertTable': {
                'location': {'index': 1},
                'rows': 4,
                'columns': 2
            }
        }
    ]

    # 스타일링 및 포맷팅
    format_requests = [
        # 제목 스타일
        {
            'updateTextStyle': {
                'range': {'startIndex': 1, 'endIndex': len(meeting_data['meetingInfo']['subject']) + 6},
                'textStyle': {
                    'bold': True,
                    'fontSize': {'magnitude': 18, 'unit': 'PT'},
                    'foregroundColor': {'color': {'rgbColor': {'blue': 1.0}}}
                },
                'fields': 'bold,fontSize,foregroundColor'
            }
        }
    ]

    # 액션 아이템 테이블 생성
    action_table_requests = create_action_items_table(meeting_data['actionItems'])

    # 모든 요청 실행
    all_requests = requests + format_requests + action_table_requests
    service.documents().batchUpdate(
        documentId=document_id,
        body={'requests': all_requests}
    ).execute()

    return document_id

def create_action_items_table(action_items):
    """액션 아이템을 시각적 테이블로 생성"""
    requests = []

    # 테이블 헤더 생성
    header_style = {
        'backgroundColor': {'color': {'rgbColor': {'red': 0.26, 'green': 0.52, 'blue': 0.96}}},
        'foregroundColor': {'color': {'rgbColor': {'red': 1.0, 'green': 1.0, 'blue': 1.0}}},
        'bold': True
    }

    # 우선순위별 색상 구분
    priority_colors = {
        'high': {'red': 0.96, 'green': 0.26, 'blue': 0.21},
        'medium': {'red': 1.0, 'green': 0.6, 'blue': 0.0},
        'low': {'red': 0.22, 'green': 0.73, 'blue': 0.29}
    }

    for item in action_items:
        color = priority_colors.get(item['priority'], priority_colors['medium'])
        # 각 액션 아이템에 대한 스타일링 요청 생성
        requests.append({
            'updateTableCellStyle': {
                'tableCellStyle': {
                    'backgroundColor': {'color': {'rgbColor': color}}
                }
            }
        })

    return requests

2. 지능형 폴더 관리

def smart_folder_management(meeting_data, document_id):
    """
    회의 유형과 날짜에 따른 자동 폴더 분류
    """
    drive_service = build('drive', 'v3', credentials=get_credentials())

    # 폴더 구조 생성 전략
    year = meeting_data['meetingInfo']['date'][:4]
    month = meeting_data['meetingInfo']['date'][5:7]
    subject_category = categorize_meeting(meeting_data['meetingInfo']['subject'])

    folder_structure = f"회의록/{year}/{month}/{subject_category}"

    # 폴더 존재 확인 및 생성
    folder_id = ensure_folder_exists(folder_structure)

    # 문서를 해당 폴더로 이동
    file = drive_service.files().get(fileId=document_id, fields='parents').execute()
    previous_parents = ",".join(file.get('parents'))

    file = drive_service.files().update(
        fileId=document_id,
        addParents=folder_id,
        removeParents=previous_parents,
        fields='id, parents'
    ).execute()

    # 권한 설정 (참석자들에게 편집 권한 부여)
    set_document_permissions(document_id, meeting_data['meetingInfo']['attendees'])

    return folder_id

def categorize_meeting(subject):
    """AI 기반 회의 카테고리 자동 분류"""
    categories = {
        '전략': ['전략', '기획', '로드맵', '비전'],
        '운영': ['운영', '프로세스', '업무', '일일'],
        '기술': ['기술', '개발', '시스템', 'IT'],
        '재무': ['예산', '재무', '투자', '비용'],
        '인사': ['인사', '채용', '평가', '교육']
    }

    subject_lower = subject.lower()
    for category, keywords in categories.items():
        if any(keyword in subject_lower for keyword in keywords):
            return category

    return '기타'

3. 지능형 이메일 발송

def send_intelligent_notification(meeting_data, document_id):
    """
    참석자별 맞춤형 이메일 발송
    """
    gmail_service = build('gmail', 'v1', credentials=get_credentials())

    document_url = f"https://docs.google.com/document/d/{document_id}"

    for attendee in meeting_data['meetingInfo']['attendees']:
        # 참석자별 맞춤 액션 아이템 추출
        personal_actions = [
            action for action in meeting_data['actionItems'] 
            if action['assignee'] == attendee
        ]

        # 개인화된 이메일 내용 생성
        email_content = generate_personalized_email(
            attendee=attendee,
            meeting_data=meeting_data,
            personal_actions=personal_actions,
            document_url=document_url
        )

        # HTML 이메일 템플릿 적용
        html_content = apply_email_template(email_content, meeting_data)

        # 이메일 발송
        send_email(gmail_service, attendee, html_content)

def generate_personalized_email(attendee, meeting_data, personal_actions, document_url):
    """개인화된 이메일 내용 생성"""

    action_summary = ""
    if personal_actions:
        action_summary = f"""

📋 {attendee}님의 액션 아이템:
"""
        for action in personal_actions:
            priority_emoji = "🔴" if action['priority'] == 'high' else "🟡" if action['priority'] == 'medium' else "🟢"
            action_summary += f"""
• {priority_emoji} {action['task']}
  └ 마감일: {action['dueDate']}
  └ 산출물: {action.get('deliverables', 'N/A')}
"""

    return f"""
안녕하세요 {attendee}님,

{meeting_data['meetingInfo']['date']} {meeting_data['meetingInfo']['subject']} 회의록이 완성되었습니다.

📄 회의록 문서: {document_url}

📊 주요 결정사항:
{format_key_decisions(meeting_data['decisions'])}

{action_summary}

📅 다음 회의: {meeting_data.get('nextMeeting', {}).get('date', '미정')}

궁금한 점이 있으시면 언제든 연락 주세요.

감사합니다.
"""

def apply_email_template(content, meeting_data):
    """HTML 이메일 템플릿 적용"""
    return f"""
<!DOCTYPE html>
<html>
<head>
    <style>
        .container {{ max-width: 600px; margin: 0 auto; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }}
        .header {{ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 20px; border-radius: 10px 10px 0 0; }}
        .content {{ padding: 20px; background: #f8f9fa; }}
        .action-item {{ background: #e3f2fd; border-left: 4px solid #2196f3; padding: 10px; margin: 10px 0; }}
        .high-priority {{ border-left-color: #f44336; background: #ffebee; }}
        .footer {{ background: #333; color: white; padding: 15px; text-align: center; border-radius: 0 0 10px 10px; }}
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h2>📝 {meeting_data['meetingInfo']['subject']} 회의록</h2>
        </div>
        <div class="content">
            {content.replace('\n', '<br>')}
        </div>
        <div class="footer">
            <p>AI 자동 생성 회의록 시스템 | Powered by Google Gemini</p>
        </div>
    </div>
</body>
</html>
"""

4. 스마트 캘린더 통합

def create_smart_calendar_events(meeting_data):
    """
    지능형 캘린더 이벤트 생성
    """
    calendar_service = build('calendar', 'v3', credentials=get_credentials())

    events_created = []

    # 1. 다음 회의 일정 생성
    if meeting_data.get('nextMeeting'):
        next_meeting_event = create_next_meeting_event(
            calendar_service, 
            meeting_data['nextMeeting'], 
            meeting_data['meetingInfo']['attendees']
        )
        events_created.append(next_meeting_event)

    # 2. 액션 아이템 마감일 리마인더 생성
    for action in meeting_data['actionItems']:
        if action.get('dueDate'):
            reminder_event = create_action_reminder(
                calendar_service,
                action,
                meeting_data['meetingInfo']['subject']
            )
            events_created.append(reminder_event)

    # 3. 중요 결정사항 후속 검토 일정 생성
    for decision in meeting_data['decisions']:
        if decision.get('followUpRequired'):
            review_event = create_decision_review(
                calendar_service,
                decision,
                meeting_data['meetingInfo']['organizer']
            )
            events_created.append(review_event)

    return events_created

def create_action_reminder(calendar_service, action, meeting_subject):
    """액션 아이템 마감일 리마인더 이벤트 생성"""

    # 마감일 1일 전 리마인더 설정
    due_date = datetime.strptime(action['dueDate'], '%Y-%m-%d')
    reminder_date = due_date - timedelta(days=1)

    event = {
        'summary': f"⏰ {action['task']} (마감 D-1)",
        'description': f"""
{meeting_subject} 회의 액션 아이템 리마인더

📋 작업: {action['task']}
👤 담당자: {action['assignee']}
📅 마감일: {action['dueDate']}
🎯 산출물: {action.get('deliverables', 'N/A')}
⚡ 우선순위: {action['priority'].upper()}

{action.get('dependencies', '')}
        """,
        'start': {
            'dateTime': reminder_date.isoformat() + 'T09:00:00',
            'timeZone': 'Asia/Seoul',
        },
        'end': {
            'dateTime': reminder_date.isoformat() + 'T09:30:00',
            'timeZone': 'Asia/Seoul',
        },
        'attendees': [{'email': get_email_from_name(action['assignee'])}],
        'reminders': {
            'useDefault': False,
            'overrides': [
                {'method': 'email', 'minutes': 24 * 60},  # 1일 전 이메일
                {'method': 'popup', 'minutes': 60},       # 1시간 전 팝업
            ],
        },
    }

    return calendar_service.events().insert(calendarId='primary', body=event).execute()

Gemini Gem의 고급 기능 활용

1. 멀티모달 처리

def process_multimodal_meeting_data(files):
    """
    오디오, 이미지, 텍스트를 동시에 처리하는 Gemini의 멀티모달 기능
    """

    processed_data = {}

    for file in files:
        if file.type == 'audio':
            # 음성 인식 및 화자 분리
            transcript = gemini.transcribe_audio(file, speaker_diarization=True)
            processed_data['transcript'] = transcript

        elif file.type == 'image':
            # 화이트보드, 프레젠테이션 슬라이드 텍스트 추출
            slide_content = gemini.extract_text_from_image(file)
            processed_data['visual_content'] = slide_content

        elif file.type == 'document':
            # 기존 문서 참조 내용 분석
            doc_content = gemini.analyze_document(file)
            processed_data['reference_docs'] = doc_content

    # 모든 데이터를 종합하여 회의록 생성
    comprehensive_minutes = gemini.generate_comprehensive_minutes(processed_data)

    return comprehensive_minutes

2. 실시간 데이터 통합

def integrate_realtime_data(meeting_data):
    """
    실시간 데이터와 외부 정보를 통합한 회의록 강화
    """

    enhanced_data = meeting_data.copy()

    # 1. 관련 프로젝트 진행상황 자동 조회
    for action in meeting_data['actionItems']:
        if 'project_id' in action:
            project_status = get_project_status(action['project_id'])
            action['current_status'] = project_status

    # 2. 시장 동향 정보 자동 추가
    if '전략' in meeting_data['meetingInfo']['subject']:
        market_trends = gemini.search_latest_trends(
            meeting_data['meetingInfo']['subject']
        )
        enhanced_data['market_context'] = market_trends

    # 3. 예산 관련 실시간 정보
    for decision in meeting_data['decisions']:
        if 'budget' in decision:
            budget_impact = calculate_budget_impact(decision['budget'])
            decision['budget_analysis'] = budget_impact

    return enhanced_data

Google Workspace 생태계 완전 통합의 장점

1. 네이티브 연동의 효율성

  • 단일 로그인: Google 계정 하나로 모든 서비스 접근
  • 실시간 동기화: 변경사항의 즉시 반영
  • 권한 통합 관리: Workspace 관리자 콘솔에서 일괄 제어

2. 고급 협업 기능

def enable_advanced_collaboration(document_id, meeting_data):
    """
    고급 협업 기능 활성화
    """

    # 1. 스마트 제안 활성화
    enable_smart_compose(document_id)

    # 2. 실시간 채팅 연동
    create_chat_space(meeting_data['meetingInfo']['attendees'])

    # 3. 진행상황 추적 대시보드 생성
    create_progress_dashboard(meeting_data['actionItems'])

    # 4. 자동 알림 워크플로우 설정
    setup_notification_workflow(document_id, meeting_data)

def create_progress_dashboard(action_items):
    """Google Sheets를 활용한 진행상황 추적 대시보드"""

    sheets_service = build('sheets', 'v4', credentials=get_credentials())

    # 새 스프레드시트 생성
    spreadsheet = {
        'properties': {
            'title': '액션 아이템 추적 대시보드'
        }
    }

    spreadsheet = sheets_service.spreadsheets().create(body=spreadsheet).execute()
    spreadsheet_id = spreadsheet.get('spreadsheetId')

    # 데이터 입력 및 차트 생성
    setup_dashboard_data(sheets_service, spreadsheet_id, action_items)
    create_progress_charts(sheets_service, spreadsheet_id)

    return spreadsheet_id

3. AI 기반 인사이트 생성

def generate_ai_insights(meeting_history):
    """
    과거 회의 데이터를 분석하여 인사이트 생성
    """

    insights = {
        'productivity_trends': analyze_productivity_patterns(meeting_history),
        'decision_effectiveness': track_decision_outcomes(meeting_history),
        'team_collaboration': assess_collaboration_quality(meeting_history),
        'action_completion_rate': calculate_completion_rates(meeting_history)
    }

    # 개선 제안 생성
    recommendations = gemini.generate_improvement_recommendations(insights)

    return {
        'insights': insights,
        'recommendations': recommendations
    }

GPTs 생성 및 설정

기본 정보 설정

Name: Meeting Minutes Generator
Description: 회의 녹취록을 전문적인 회의록으로 변환하는 AI 어시스턴트

Instructions (지시사항) 작성

당신은 회의록 작성 전문가입니다. 다음 역할을 수행하세요:

1. 업로드된 녹취록을 분석하여 핵심 내용을 파악
2. 다음 구조로 회의록을 작성:
   - 회의 기본 정보 (일시, 참석자, 주제)
   - 주요 논의 사항
   - 결정 사항
   - 액션 아이템 (담당자, 마감일 포함)
   - 차회 일정

3. 출력 형식은 반드시 JSON 형태로 구조화
4. 전문적이고 명확한 문체 사용
5. 중요도에 따른 우선순위 표시

출력 예시:
{
  "meetingInfo": {
    "date": "2025-01-15",
    "time": "14:00-15:30",
    "attendees": ["김철수", "이영희", "박민수"],
    "subject": "Q1 마케팅 전략 회의"
  },
  "discussions": [
    {
      "topic": "신제품 출시 전략",
      "details": "상세 논의 내용...",
      "priority": "high"
    }
  ],
  "decisions": [
    {
      "item": "마케팅 예산 승인",
      "amount": "5,000만원",
      "approver": "김철수"
    }
  ],
  "actionItems": [
    {
      "task": "시장 조사 보고서 작성",
      "assignee": "이영희",
      "dueDate": "2025-01-22",
      "priority": "high"
    }
  ],
  "nextMeeting": {
    "date": "2025-01-29",
    "agenda": "시장 조사 결과 검토"
  }
}

Actions 설정 (웹훅 연동)

openapi: 3.1.0
info:
  title: Meeting Minutes Webhook
  description: Google Apps Script로 회의록 데이터 전송
  version: 1.0.0
servers:
  - url: https://script.google.com/macros/s/{YOUR_SCRIPT_ID}/exec
paths:
  /webhook:
    post:
      operationId: sendMeetingMinutes
      summary: 회의록 데이터를 Google Apps Script로 전송
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                meetingInfo:
                  type: object
                  properties:
                    date:
                      type: string
                    time:
                      type: string
                    attendees:
                      type: array
                      items:
                        type: string
                    subject:
                      type: string
                discussions:
                  type: array
                  items:
                    type: object
                actionItems:
                  type: array
                  items:
                    type: object
      responses:
        '200':
          description: 성공적으로 처리됨

Google Apps Script 웹훅 구현

프로젝트 생성 및 기본 설정

  1. Google Apps Script (script.google.com) 접속
  2. 새 프로젝트 생성
  3. 프로젝트명: "Meeting Minutes Automation"

메인 웹훅 함수 작성

/**
 * 웹훅 엔드포인트 - GPTs에서 POST 요청 처리
 */
function doPost(e) {
  try {
    // 요청 데이터 파싱
    const requestData = JSON.parse(e.postData.contents);

    // 회의록 문서 생성
    const documentId = createMeetingMinutes(requestData);

    // 응답 반환
    return ContentService
      .createTextOutput(JSON.stringify({
        success: true,
        documentId: documentId,
        message: "회의록이 성공적으로 생성되었습니다."
      }))
      .setMimeType(ContentService.MimeType.JSON);

  } catch (error) {
    Logger.log('Error in doPost: ' + error.toString());

    return ContentService
      .createTextOutput(JSON.stringify({
        success: false,
        error: error.toString()
      }))
      .setMimeType(ContentService.MimeType.JSON);
  }
}

회의록 생성 함수

/**
 * 회의록 문서 생성 및 Google Drive 저장
 */
function createMeetingMinutes(data) {
  try {
    // 템플릿 문서 ID (미리 생성해둔 Google Docs 템플릿)
    const TEMPLATE_ID = 'YOUR_TEMPLATE_DOCUMENT_ID';

    // 템플릿 복사
    const templateDoc = DriveApp.getFileById(TEMPLATE_ID);
    const fileName = `회의록_${data.meetingInfo.subject}_${data.meetingInfo.date}`;
    const copiedDoc = templateDoc.makeCopy(fileName);

    // 새 문서 열기
    const doc = DocumentApp.openById(copiedDoc.getId());
    const body = doc.getBody();

    // 플레이스홀더 치환
    replacePlaceholders(body, data);

    // 테이블 생성 (액션 아이템)
    insertActionItemsTable(body, data.actionItems);

    // 문서 저장
    doc.saveAndClose();

    // 특정 폴더로 이동 (선택사항)
    const targetFolder = DriveApp.getFolderById('YOUR_TARGET_FOLDER_ID');
    copiedDoc.moveTo(targetFolder);

    return copiedDoc.getId();

  } catch (error) {
    Logger.log('Error in createMeetingMinutes: ' + error.toString());
    throw error;
  }
}

플레이스홀더 치환 함수

/**
 * 문서 내 플레이스홀더를 실제 데이터로 치환
 */
function replacePlaceholders(body, data) {
  const replacements = {
    '{{MEETING_DATE}}': data.meetingInfo.date,
    '{{MEETING_TIME}}': data.meetingInfo.time,
    '{{MEETING_SUBJECT}}': data.meetingInfo.subject,
    '{{ATTENDEES}}': data.meetingInfo.attendees.join(', '),
    '{{DISCUSSIONS}}': formatDiscussions(data.discussions),
    '{{DECISIONS}}': formatDecisions(data.decisions),
    '{{NEXT_MEETING}}': data.nextMeeting ? 
      `${data.nextMeeting.date} - ${data.nextMeeting.agenda}` : '미정'
  };

  // 각 플레이스홀더 치환
  Object.keys(replacements).forEach(placeholder => {
    body.replaceText(placeholder, replacements[placeholder]);
  });
}

/**
 * 논의사항 포맷팅
 */
function formatDiscussions(discussions) {
  return discussions.map((item, index) => 
    `${index + 1}. ${item.topic}\n   ${item.details}`
  ).join('\n\n');
}

/**
 * 결정사항 포맷팅
 */
function formatDecisions(decisions) {
  return decisions.map((item, index) => 
    `${index + 1}. ${item.item}${item.amount ? ` (${item.amount})` : ''}`
  ).join('\n');
}

액션 아이템 테이블 생성

/**
 * 액션 아이템을 테이블 형태로 삽입
 */
function insertActionItemsTable(body, actionItems) {
  // {{ACTION_ITEMS_TABLE}} 플레이스홀더 찾기
  const placeholder = '{{ACTION_ITEMS_TABLE}}';
  const searchResult = body.findText(placeholder);

  if (searchResult) {
    const element = searchResult.getElement();
    const parent = element.getParent();

    // 테이블 생성
    const table = body.insertTable(body.getChildIndex(parent));

    // 헤더 행 추가
    const headerRow = table.appendTableRow();
    headerRow.appendTableCell('할 일');
    headerRow.appendTableCell('담당자');
    headerRow.appendTableCell('마감일');
    headerRow.appendTableCell('우선순위');

    // 헤더 스타일링
    const headerStyle = {};
    headerStyle[DocumentApp.Attribute.BACKGROUND_COLOR] = '#4285f4';
    headerStyle[DocumentApp.Attribute.FOREGROUND_COLOR] = '#ffffff';
    headerStyle[DocumentApp.Attribute.BOLD] = true;

    for (let i = 0; i < 4; i++) {
      headerRow.getCell(i).setAttributes(headerStyle);
    }

    // 데이터 행 추가
    actionItems.forEach(item => {
      const dataRow = table.appendTableRow();
      dataRow.appendTableCell(item.task);
      dataRow.appendTableCell(item.assignee);
      dataRow.appendTableCell(item.dueDate);
      dataRow.appendTableCell(item.priority === 'high' ? '높음' : '보통');

      // 우선순위 높음인 경우 강조
      if (item.priority === 'high') {
        const priorityCell = dataRow.getCell(3);
        priorityCell.setBackgroundColor('#ff9800');
        priorityCell.setForegroundColor('#ffffff');
      }
    });

    // 플레이스홀더 제거
    element.removeFromParent();
  }
}

Google Docs 템플릿 생성

템플릿 문서 구조

회의록

회의 정보
- 일시: {{MEETING_DATE}} {{MEETING_TIME}}
- 주제: {{MEETING_SUBJECT}}
- 참석자: {{ATTENDEES}}

주요 논의사항
{{DISCUSSIONS}}

결정사항
{{DECISIONS}}

액션 아이템
{{ACTION_ITEMS_TABLE}}

차회 일정
{{NEXT_MEETING}}

---
작성일: [자동 생성 날짜]
문서 ID: [자동 생성]

템플릿 스타일링

  • 제목: 18pt, 굵게, 중앙 정렬
  • 섹션 헤더: 14pt, 굵게, 파란색
  • 본문: 11pt, 맑은 고딕
  • 여백: 상하좌우 2.5cm

시스템 배포 및 테스트

Apps Script 배포

  1. Apps Script 편집기에서 "배포" → "새 배포" 클릭
  2. 유형: 웹 앱 선택
  3. 실행 계정: 나
  4. 액세스 권한: 모든 사용자
  5. 배포 후 웹 앱 URL 복사

GPTs Actions에 URL 등록

  • Apps Script 웹 앱 URL을 GPTs Actions 설정의 servers URL에 입력

테스트 시나리오

  1. 기본 기능 테스트: 간단한 회의 녹취록으로 전체 플로우 확인
  2. 복잡한 데이터 테스트: 다수 참석자, 복잡한 안건이 포함된 회의록
  3. 오류 처리 테스트: 잘못된 형식의 데이터 입력
  4. 성능 테스트: 대용량 녹취록 파일 처리

고급 기능 확장

이메일 자동 발송 기능

/**
 * 회의록 생성 후 참석자들에게 이메일 발송
 */
function sendMeetingMinutesEmail(documentId, attendees, subject) {
  const doc = DocumentApp.openById(documentId);
  const documentUrl = doc.getUrl();

  const emailSubject = `회의록: ${subject}`;
  const emailBody = `
안녕하세요,

${subject} 회의록이 생성되었습니다.

문서 링크: ${documentUrl}

감사합니다.
  `;

  // 참석자 이메일 주소 매핑 (실제 구현에서는 별도 설정 필요)
  const emailMapping = {
    '김철수': 'kim@company.com',
    '이영희': 'lee@company.com'
  };

  attendees.forEach(attendee => {
    const email = emailMapping[attendee];
    if (email) {
      GmailApp.sendEmail(email, emailSubject, emailBody);
    }
  });
}

캘린더 연동 기능

/**
 * 다음 회의 일정을 Google Calendar에 자동 등록
 */
function createNextMeetingEvent(nextMeetingInfo, attendees) {
  if (!nextMeetingInfo || !nextMeetingInfo.date) return;

  const calendar = CalendarApp.getDefaultCalendar();
  const eventDate = new Date(nextMeetingInfo.date);

  // 2시간 회의로 기본 설정
  const endDate = new Date(eventDate.getTime() + (2 * 60 * 60 * 1000));

  const event = calendar.createEvent(
    nextMeetingInfo.agenda || '팀 회의',
    eventDate,
    endDate,
    {
      description: `안건: ${nextMeetingInfo.agenda}`,
      guests: attendees.map(name => getEmailFromName(name)).join(',')
    }
  );

  return event.getId();
}

다국어 지원

/**
 * 언어별 템플릿 처리
 */
function getLocalizedTemplate(language = 'ko') {
  const templates = {
    'ko': {
      'meetingMinutes': '회의록',
      'meetingInfo': '회의 정보',
      'discussions': '주요 논의사항',
      'decisions': '결정사항',
      'actionItems': '액션 아이템'
    },
    'en': {
      'meetingMinutes': 'Meeting Minutes',
      'meetingInfo': 'Meeting Information',
      'discussions': 'Key Discussions',
      'decisions': 'Decisions',
      'actionItems': 'Action Items'
    }
  };

  return templates[language] || templates['ko'];
}

보안 및 권한 관리

접근 권한 설정

  • GPTs: 조직 내부 사용자만 접근 가능하도록 제한
  • Apps Script: 실행 권한을 특정 사용자 그룹으로 제한
  • Google Drive: 회의록 저장 폴더에 적절한 공유 권한 설정

데이터 보안

  • 민감한 회의 내용의 경우 추가적인 암호화 적용
  • 로그 관리 및 감사 추적 기능 구현
  • 정기적인 권한 검토 및 업데이트

비용 및 성능 최적화

GPT-4 사용료 최적화

  • 프롬프트 길이 최적화로 토큰 사용량 감소
  • 배치 처리를 통한 API 호출 횟수 감소

Apps Script 성능 개선

  • 비동기 처리로 응답 시간 단축
  • 캐싱 메커니즘 도입으로 반복 작업 최소화
  • 오류 처리 강화로 안정성 향상

플랫폼별 성능 및 비용 비교

처리 속도 비교

작업 단계 ChatGPT GPTs Google Gemini Gem
파일 업로드 3-5초 2-3초
텍스트 분석 15-20초 10-15초
문서 생성 10-15초 (API 호출) 5-8초 (네이티브)
이메일 발송 별도 구현 필요 2-3초 (통합)
캘린더 연동 별도 구현 필요 1-2초 (통합)
총 처리 시간 35-50초 20-30초

비용 구조 비교

항목 ChatGPT GPTs Google Gemini Gem
AI 모델 사용료 $20/월 (GPT-4) 무료 (고성능)
API 호출 비용 Google APIs 별도 통합 무료
개발 복잡성 높음 낮음
유지보수 비용 높음 낮음

기능 완성도 비교

기능 ChatGPT GPTs Google Gemini Gem
자연어 처리 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Workspace 통합 ⭐⭐⭐ ⭐⭐⭐⭐⭐
멀티모달 처리 ⭐⭐⭐ ⭐⭐⭐⭐⭐
실시간 데이터 ⭐⭐ ⭐⭐⭐⭐⭐
커스터마이징 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐

활용 효과 및 ROI 분석

시간 절약 효과 비교

ChatGPT GPTs 방식

  • 기존 방식: 90분 회의 → 회의록 작성 60분 (총 150분)
  • 자동화 후: 90분 회의 → 시스템 처리 5분 (총 95분)
  • 절약 시간: 회의당 55분 (약 63% 시간 단축)

Google Gemini Gem 방식 (권장)

  • 기존 방식: 90분 회의 → 회의록 작성 60분 (총 150분)
  • 자동화 후: 90분 회의 → 완전 자동화 2분 (총 92분)
  • 절약 시간: 회의당 58분 (약 67% 시간 단축)
  • 추가 혜택: 자동 이메일 발송, 캘린더 연동, 진행상황 추적

연간 ROI 계산 (10명 팀 기준)

비용 절감 효과

주간 회의 횟수: 5회
연간 회의 횟수: 260회
절약 시간: 58분/회의 × 260회 = 15,080분 (약 251시간)
시간당 인건비: 50,000원
연간 절약 비용: 251시간 × 50,000원 = 12,550,000원

시스템 도입 비용

ChatGPT GPTs: $240/년 + 개발비용 약 200만원 = 약 270만원
Google Gemini Gem: 무료 + 개발비용 약 100만원 = 약 100만원

순 ROI

ChatGPT GPTs: (12,550,000 - 2,700,000) / 2,700,000 × 100 = 365%
Google Gemini Gem: (12,550,000 - 1,000,000) / 1,000,000 × 100 = 1,155%

구현 권장사항

초보자 또는 소규모 팀

→ Google Gemini Gem 권장

  • 설정이 간단하고 즉시 사용 가능
  • 무료로 고성능 기능 이용
  • Google Workspace 사용 시 완벽한 통합

고급 사용자 또는 대규모 조직

→ ChatGPT GPTs + Gemini Gem 하이브리드

  • 복잡한 비즈니스 로직은 GPTs로 처리
  • 실행 단계는 Gemini Gem으로 자동화
  • 최고의 성능과 유연성 확보

AI 시대의 업무 혁신 전략

Google의 공격적인 AI 혁신 전략과 무료 고성능 서비스 제공은 업무 자동화의 패러다임을 완전히 바꾸고 있습니다. 특히 Gemini Gem과 Google Workspace의 완벽한 통합은 기존 ChatGPT 기반 솔루션보다 훨씬 효율적이고 경제적인 대안을 제공합니다. 현재 많은 사용자들이 Gemini로 이동하는 이유는 단순히 무료이기 때문이 아닙니다. Google 생태계의 완전한 통합, 멀티모달 처리 능력, 실시간 데이터 접근 등 종합적인 우수성 때문입니다.

구현 로드맵

  1. Google Gemini Gem 기본 설정 및 테스트
  2. Google Workspace API 연동 및 자동화 구현
  3. 고급 기능 (멀티모달, 실시간 데이터) 추가
  4. 팀 내 파일럿 테스트 및 피드백 수집
  5. 전사 확산 및 교육

이 시스템을 도입함으로써 단순 반복 업무에서 벗어나 더 가치 있는 창의적 업무에 집중할 수 있게 됩니다.

AI 시대의 업무 혁신, 지금 시작해보세요.

 

참고 자료

  • Google Gemini API 개발 가이드
  • Google Workspace API 참조
  • ChatGPT GPTs 개발 문서
  • AI 업무 자동화 베스트 프랙티스
728x90
그리드형(광고전용)

댓글