Chapter 1: ChatGPT로 VBA 시작하기
1. VBA란?
Visual Basic for Applications의 줄임말로, Excel에서 작업을 자동화할 수 있는 프로그래밍 언어입니다.
VBA 편집기 열기
  • Alt + F11 또는 개발 도구 → Visual Basic
학습 목표
  • Excel에서 VBA 개발 환경을 설정할 수 있다
  • ChatGPT에게 VBA 코드를 요청하는 기본 방법을 익힌다
  • 생성된 코드를 Excel에 적용하고 실행할 수 있다
  • 첫 번째 자동화 코드를 성공적으로 만들어본다
1단계: VBA 개발 환경 5분 셋업
1.1 개발자 도구 활성화
  1. Excel 실행 → 파일 → 옵션
  1. 리본 사용자 지정 클릭
  1. 개발 도구 체크박스 선택 → 확인
  1. 리본 메뉴에 개발 도구 탭이 생성됨을 확인
1.2 Visual Basic Editor 열기
  1. 개발 도구 탭 → Visual Basic 클릭
  1. VBA 편집기가 열리는 것을 확인
  1. Alt + F11 단축키로도 열고 닫을 수 있음
  1. 프로젝트 우클릭 → 삽입 → 모듈
2단계: ChatGPT에게 VBA 코드 요청하는 기본 방법
2.1 효과적인 첫 질문 방법
나쁜 예시:
VBA 코드 만들어줘
좋은 예시:
Excel VBA로 "안녕하세요!"라는 메시지 박스를 띄우는 코드를 만들어주세요. 초보자도 쉽게 따라할 수 있도록 단계별로 설명도 함께 부탁드립니다.
2.2 ChatGPT 프롬프트 템플릿
# 요청 사항: [구체적인 기능 설명] # 사용 환경: Excel VBA # 난이도: 초급자용 # 추가 요청: 코드 설명과 적용 방법도 함께 알려주세요
3단계: 생성된 코드를 Excel에 적용하는 과정
3.1 실습: Hello World 메시지 박스 만들기
ChatGPT에게 보낼 질문:
Excel VBA로 "Hello World!"라는 메시지 박스를 띄우는 간단한 코드를 만들어주세요. 초보자가 따라할 수 있도록 단계별 설명도 함께 부탁드립니다.
예상 ChatGPT 응답:
Sub HelloWorld() MsgBox "Hello World!" End Sub
3.2 코드 적용 단계
  1. Visual Basic Editor 열기 (Alt + F11)
  1. 삽입모듈 클릭하여 새 모듈 생성
  1. ChatGPT가 제공한 코드 복사 & 붙여넣기
  1. Ctrl + S로 저장
  1. F5 또는 실행 버튼 클릭하여 코드 실행
  1. "Hello World!" 메시지 박스가 나타나는지 확인
3.3 Excel에서 매크로 실행하기
  1. Excel 시트로 돌아가기 (Alt + F11)
  1. 개발 도구매크로 클릭
  1. HelloWorld 선택 → 실행 클릭
  1. 메시지 박스 확인
4단계: 첫 번째 실용적 코드 만들기
4.1 실습: 셀 값 변경 자동화
ChatGPT에게 보낼 질문:
Excel VBA로 A1 셀에 "오늘의 날짜"를 자동으로 입력하고, B1 셀에 "VBA 성공!"이라는 텍스트를 입력하는 코드를 만들어주세요.
예상 ChatGPT 응답:
Sub InsertDateAndText() Range("A1").Value = Date ' 오늘 날짜 입력 Range("B1").Value = "VBA 성공!" ' 텍스트 입력 End Sub
4.2 코드 적용 및 실행
  1. 새 모듈에 위 코드 입력
  1. 코드 실행 (F5)
  1. 결과 확인:
  • A1 셀: 오늘 날짜 자동 입력
  • B1 셀: "VBA 성공!" 텍스트 입력
5단계: 버튼으로 매크로 실행하기
5.1 버튼 추가하기
  1. 개발 도구삽입단추(양식 컨트롤) 선택
  1. 워크시트에서 드래그하여 버튼 생성
  1. 매크로 지정 대화상자에서 InsertDateAndText 선택
  1. 버튼 텍스트를 "자동화 실행"으로 변경
5.2 버튼 테스트
  1. 버튼 클릭
  1. 매크로가 자동 실행되는지 확인
추가 실습 과제
과제 1: 개인화된 인사말
ChatGPT 질문:
Excel VBA로 사용자 이름을 입력받아서 "안녕하세요, [이름]님!"이라는 메시지 박스를 띄우는 코드를 만들어주세요.
과제 2: 간단한 계산기
ChatGPT 질문:
Excel VBA로 A1과 B1 셀의 숫자를 더해서 C1 셀에 결과를 자동으로 입력하는 코드를 만들어주세요.
문제해결 가이드
자주 발생하는 오류와 해결법
오류 1: "매크로를 실행할 수 없습니다"
  • 원인: 매크로 보안 설정
  • 해결: 개발 도구 → 매크로 보안 → 경고와 함께 모든 매크로 사용
오류 2: "컴파일 오류"
  • 원인: 코드 복사 시 오타 또는 형식 문제
  • 해결: ChatGPT에게 "오류가 발생했어요, 다시 확인해주세요" 요청
오류 3: "개체가 필요합니다"
  • 원인: 잘못된 셀 참조
  • 해결: Range 문법 다시 확인
Chapter 2: Excel VBA 기초 수업자료
1. 프로시저란?
VBA에서 코드를 실행하는 단위입니다. 크게 두 종류가 있습니다.
Sub 프로시저 (서브루틴)
  • 작업을 수행하지만 값을 반환하지 않음
  • 매크로로 실행 가능
Sub 프로시저명() ' 실행할 코드 End Sub
Function 프로시저 (함수)
  • 계산 결과를 반환
  • 워크시트에서 함수처럼 사용 가능
Function 함수명(매개변수) As 데이터타입 ' 계산 코드 함수명 = 반환값 End Function
2. 첫 번째 매크로 만들기
Hello World 메시지
Sub HelloWorld() ' 메시지 박스를 띄워서 인사말 출력 ' MsgBox: 사용자에게 메시지를 보여주는 함수 MsgBox "안녕하세요! VBA입니다." End Sub
셀에 값 입력하기
Sub 셀값입력() ' Range: 셀 범위를 지정하는 객체 ' A1 셀에 텍스트 값을 입력 Range("A1").Value = "VBA로 입력한 값" End Sub
간단한 계산 함수
Function 두수더하기(숫자1 As Double, 숫자2 As Double) As Double ' 두 개의 숫자를 받아서 더한 결과를 반환 ' 워크시트에서 =두수더하기(10, 20) 형태로 사용 가능 두수더하기 = 숫자1 + 숫자2 End Function
3. 기본 문법
변수 선언
' Dim: 변수를 선언하는 키워드 ' As: 데이터 타입을 지정 Dim 이름 As String ' 문자열 변수 Dim 나이 As Integer ' 정수 변수 (-32,768 ~ 32,767) Dim 점수 As Double ' 실수 변수 (소수점 포함) ' 변수에 값 할당 이름 = "홍길동" ' 문자열은 따옴표로 감싸기 나이 = 25 ' 숫자는 그대로 입력 점수 = 95.5 ' 소수점 숫자
조건문
' If문: 조건에 따라 다른 작업 수행 If 점수 >= 90 Then MsgBox "A학점" ' 90점 이상 ElseIf 점수 >= 80 Then MsgBox "B학점" ' 80점 이상 90점 미만 Else MsgBox "재시험" ' 80점 미만 End If ' If문 종료
반복문
' For문: 정해진 횟수만큼 반복 For i = 1 To 10 ' i가 1부터 10까지 Cells(i, 1).Value = i ' A열(1열)의 i번째 행에 i값 입력 Next i ' 다음 i로 이동 ' Do While문: 조건이 참인 동안 계속 반복 Dim i As Integer i = 1 ' 시작값 설정 Do While i <= 10 ' i가 10 이하인 동안 Cells(i, 2).Value = i * 2 ' B열(2열)에 i의 2배 값 입력 i = i + 1 ' i값을 1 증가 Loop ' 조건 확인 후 반복
4. 자주 사용하는 기능
셀 선택과 값 조작
' 셀 선택하는 두 가지 방법 Range("A1").Select ' 범위로 선택 (A1 형태) Cells(1, 1).Select ' 행/열 번호로 선택 (1행 1열 = A1) ' 셀 값 읽기와 쓰기 Dim 값 As String ' 문자열 변수 선언 값 = Range("A1").Value ' A1 셀의 값을 변수에 저장 Range("B1").Value = 값 ' 변수의 값을 B1 셀에 입력 ' 여러 셀에 한번에 같은 값 입력 Range("A1:C3").Value = "같은값" ' A1부터 C3까지 모든 셀에 동일한 값
시트 조작
' 새 워크시트 추가하고 이름 지정 Sheets.Add.Name = "새시트" ' 새 시트 생성 후 이름을 "새시트"로 변경 ' 특정 시트 선택하기 Sheets("Sheet1").Select ' "Sheet1" 이름의 시트로 이동 ' 시트 삭제 (경고창 없이) Application.DisplayAlerts = False ' Excel 경고창 끄기 Sheets("Sheet1").Delete ' "Sheet1" 시트 삭제 Application.DisplayAlerts = True ' Excel 경고창 다시 켜기
행/열 조작
' 첫 번째 행에 새 행 삽입 Rows(1).Insert ' 1행 위에 빈 행 추가 ' A열 전체 삭제 Columns("A").Delete ' A열과 데이터 모두 삭제 ' 빈 행 자동 삭제 (A열 기준) Range("A1").CurrentRegion.SpecialCells(xlCellTypeBlanks).EntireRow.Delete ' CurrentRegion: 데이터가 있는 연속 범위 ' SpecialCells: 특정 조건의 셀들만 선택 ' xlCellTypeBlanks: 빈 셀들 ' EntireRow: 전체 행
5. 실용적인 예제
데이터 정리 자동화
Sub 데이터정리() ' 복합적인 데이터 정리 작업을 한번에 수행 ' 1단계: A열 기준으로 빈 행 삭제 ' SpecialCells로 빈 셀들을 찾아서 전체 행 삭제 Columns("A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete ' 2단계: 중복된 데이터 제거 ' CurrentRegion: 현재 셀 주변의 연속된 데이터 범위 ' RemoveDuplicates: Excel 내장 중복 제거 기능 ' Columns:=1: 첫 번째 열(A열) 기준으로 중복 판단 Range("A1").CurrentRegion.RemoveDuplicates Columns:=1 ' 3단계: 모든 셀의 앞뒤 공백 제거 For Each cell In Range("A:A") ' A열의 모든 셀을 하나씩 검사 If cell.Value <> "" Then ' 빈 셀이 아닌 경우에만 cell.Value = Trim(cell.Value) ' Trim: 앞뒤 공백 제거 함수 End If Next cell ' 다음 셀로 이동 ' 작업 완료 메시지 MsgBox "데이터 정리가 완료되었습니다." End Sub
조건부 데이터 복사
Sub 조건부복사() ' 특정 조건을 만족하는 행만 다른 시트로 복사 Dim i As Integer ' 현재 검사중인 행 번호 Dim 복사행 As Integer ' 결과 시트에서 붙여넣을 행 번호 복사행 = 1 ' 결과 시트의 첫 번째 행부터 시작 ' 원본 데이터의 2행부터 100행까지 검사 (1행은 보통 제목) For i = 2 To 100 ' A열의 값이 50보다 큰 행만 선택 If Cells(i, 1).Value > 50 Then ' 전체 행을 복사해서 "결과" 시트에 붙여넣기 Rows(i).Copy Destination:=Sheets("결과").Rows(복사행) 복사행 = 복사행 + 1 ' 다음 붙여넣을 위치로 이동 End If Next i ' 복사된 행의 개수 알려주기 MsgBox "조건을 만족하는 " & (복사행 - 1) & "개 행이 복사되었습니다." End Sub
급여 계산 자동화 함수
Function 실수령액계산(기본급 As Double) As Double ' 기본급을 받아서 세금을 제외한 실수령액 계산 Dim 국민연금 As Double ' 국민연금 (4.5%) Dim 건강보험 As Double ' 건강보험 (3.43%) Dim 소득세 As Double ' 소득세 (대략 10%) Dim 총공제액 As Double ' 총 공제 금액 ' 각종 공제액 계산 국민연금 = 기본급 * 0.045 ' 기본급의 4.5% 건강보험 = 기본급 * 0.0343 ' 기본급의 3.43% 소득세 = 기본급 * 0.1 ' 기본급의 10% (간단 계산) ' 총 공제액 합계 총공제액 = 국민연금 + 건강보험 + 소득세 ' 실수령액 = 기본급 - 총공제액 실수령액계산 = 기본급 - 총공제액 ' 이 함수는 워크시트에서 =실수령액계산(3000000) 형태로 사용 가능 End Function
6. 오류 처리
기본 오류 처리
Sub 안전한코드() ' On Error GoTo: 오류 발생시 특정 위치로 이동 On Error GoTo 오류처리 ' 의도적으로 오류를 발생시키는 코드 (0으로 나누기) Range("A1").Value = 100 / 0 ' 여기서 오류 발생! ' 정상 종료시 오류처리 부분을 건너뛰고 종료 Exit Sub ' 오류 발생시 실행되는 부분 (레이블) 오류처리: ' Err 객체: VBA의 오류 정보를 담고 있는 객체 ' Err.Description: 오류에 대한 설명 텍스트 MsgBox "오류가 발생했습니다: " & Err.Description ' 오류 정보 초기화 Err.Clear End Sub
고급 오류 처리
Sub 파일열기_안전하게() Dim 파일경로 As String 파일경로 = "C:\존재하지않는파일.xlsx" ' 오류 발생시 다음 줄로 계속 진행 On Error Resume Next ' 파일 열기 시도 Workbooks.Open 파일경로 ' 오류가 발생했는지 확인 If Err.Number <> 0 Then ' Err.Number: 오류 번호 (0이면 오류 없음) MsgBox "파일을 열 수 없습니다: " & Err.Description Err.Clear ' 오류 정보 초기화 Else MsgBox "파일이 성공적으로 열렸습니다." End If ' 오류 처리 모드 해제 (정상 모드로 복귀) On Error GoTo 0 End Sub
7. 매크로 실행 방법
개발 도구에서 실행
  1. 개발 도구 탭 → 매크로 버튼 클릭
  1. 실행할 매크로 선택 → 실행 버튼
  1. 또는 F5 키로 VBA 편집기에서 직접 실행
단축키 지정
  1. 개발 도구 → 매크로
  1. 매크로 선택 → 옵션 버튼
  1. Ctrl + 원하는 키 조합 입력 (예: Ctrl + Shift + A)
버튼으로 실행
  1. 개발 도구 → 삽입 → 양식 컨트롤의 단추 선택
  1. 워크시트에 버튼 그리기
  1. 매크로 지정 대화상자에서 연결할 매크로 선택
  1. 버튼 클릭시 해당 매크로 실행
자동 실행 매크로
' 워크북이 열릴 때 자동 실행 Sub Workbook_Open() ' 워크북을 열면 자동으로 실행되는 코드 MsgBox "워크북이 열렸습니다!" End Sub ' 워크시트가 변경될 때 자동 실행 Sub Worksheet_Change(ByVal Target As Range) ' 셀 값이 변경될 때마다 실행 ' Target: 변경된 셀의 정보 MsgBox Target.Address & " 셀이 변경되었습니다." End Sub
8. 주의사항
  • 매크로 실행 전 파일 백업
  • 매크로 보안 설정 확인
  • 큰 데이터 처리시 Application.ScreenUpdating = False 사용
  • 작업 완료 후 Application.ScreenUpdating = True
Chapter 3: 효과적인 VBA 프롬프트 작성법
학습 목표
  • ChatGPT가 이해하기 쉬운 명확한 요청 방법을 익힌다
  • 구체적인 조건과 예시를 포함한 프롬프트를 작성할 수 있다
  • 단계별 설명을 요청하는 고급 프롬프트 기법을 활용한다
  • 오류 발생 시 ChatGPT를 활용한 디버깅 방법을 습득한다
1단계: ChatGPT가 이해하기 쉬운 요청 방법
1.1 나쁜 프롬프트 vs 좋은 프롬프트
나쁜 프롬프트 예시들:
VBA 코드 좀 만들어줘 데이터 정리하는 코드 엑셀 자동화
좋은 프롬프트 예시들:
Excel VBA로 A열에 있는 고객 이름 중에서 "김"씨 성을 가진 고객만 찾아서 B열에 "VIP 고객"이라고 표시하는 코드를 만들어주세요. 워크시트의 1행부터 100행까지 중에서 빈 행을 모두 삭제하는 VBA 코드를 작성해주세요. 삭제 후 "완료되었습니다"라는 메시지도 띄워주세요.
1.2 명확한 프롬프트의 5가지 요소
  1. 대상 지정: 어떤 데이터/셀/범위를 다룰 것인가
  1. 작업 내용: 구체적으로 무엇을 할 것인가
  1. 조건 설정: 어떤 조건에서 실행할 것인가
  1. 결과 형태: 최종 결과가 어떻게 나와야 하는가
  1. 추가 요청: 메시지, 에러 처리 등 부가 기능
2단계: 구체적인 조건과 예시 제시하기
2.1 프롬프트 템플릿 활용
기본 템플릿:
[환경] Excel VBA를 사용해서 [대상] [구체적인 데이터/범위]에서 [조건] [특정 조건을 만족하는] [작업] [구체적인 작업]을 하는 [결과] 코드를 만들어주세요. [추가] [부가 기능이나 요청사항]
실제 적용 예시:
Excel VBA를 사용해서 A열의 1행부터 마지막 행까지 데이터에서 금액이 100,000원 이상인 항목만 C열에 "고액"이라고 표시하고 작업 완료 후 "처리 완료" 메시지를 띄우는 코드를 만들어주세요.
2.2 실습: 조건부 데이터 복사
우리의 목표: 특정 조건의 데이터만 다른 시트로 복사
ChatGPT에게 보낼 프롬프트:
Excel VBA로 다음 작업을 수행하는 코드를 만들어주세요: 1. Sheet1의 A열부터 C열까지, 1행부터 마지막 행까지의 데이터 중에서 2. B열(나이)이 30 이상인 행만 찾아서 3. 해당 행의 모든 데이터를 Sheet2로 복사해주세요 4. 복사 시 헤더(1행)도 함께 복사되어야 합니다 5. 작업 완료 후 "○○명의 데이터가 복사되었습니다" 메시지를 띄워주세요 6. 프로시저 명은 한글로 만들어주세요 예시 데이터: A열: 이름 (홍길동, 김철수, 이영희) B열: 나이 (25, 35, 40) C열: 부서 (영업, 기획, 인사)
예상 ChatGPT 응답:
Sub 조건부데이터복사() Dim ws1 As Worksheet, ws2 As Worksheet Dim lastRow As Long, copyCount As Long Dim i As Long Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet2") ' Sheet2 초기화 ws2.Cells.Clear ' 헤더 복사 ws1.Range("A1:C1").Copy ws2.Range("A1:C1") lastRow = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row copyCount = 0 For i = 2 To lastRow If ws1.Cells(i, 2).Value >= 30 Then copyCount = copyCount + 1 ws1.Range("A" & i & ":C" & i).Copy ws2.Range("A" & copyCount + 1 & ":C" & copyCount + 1) End If Next i MsgBox copyCount & "명의 데이터가 복사되었습니다" End Sub
3단계: 단계별 설명 요청하는 프롬프트 기법
3.1 복잡한 작업의 단계별 분해
한 번에 모든 것을 요청하지 말고:
고객관리 시스템 만들어줘
단계별로 요청:
1단계: 고객 데이터 입력 폼 만들기 2단계: 고객 검색 기능 추가 3단계: 고객 정보 수정 기능 4단계: 보고서 자동 생성
3.2 단계별 설명 요청 프롬프트
Excel VBA로 [원하는 기능]을 만들고 싶습니다. 다음과 같이 단계별로 나누어서 각 단계마다 코드와 설명을 제공해주세요: 1단계: [첫 번째 단계 설명] 2단계: [두 번째 단계 설명] 3단계: [세 번째 단계 설명] 각 단계마다 코드 실행 방법과 확인해야 할 포인트도 알려주세요.
3.3 실습: 데이터 정리 자동화 (단계별)
1단계 프롬프트:
Excel VBA로 데이터 정리 작업을 단계별로 진행하고 싶습니다. 먼저 1단계로 A열부터 E열까지의 모든 빈 행을 삭제하는 코드를 만들어주세요. 코드 설명과 실행 방법도 함께 알려주세요.
2단계 프롬프트:
1단계에 이어서 2단계로 중복된 행을 제거하는 기능을 추가해주세요. A열의 값을 기준으로 중복을 판단하고, 중복 시 첫 번째 행만 남기고 나머지는 삭제해주세요.
4단계: 오류 발생시 ChatGPT에게 디버깅 요청하기
4.1 효과적인 오류 보고 방법
나쁜 오류 보고:
코드가 안 돼요 에러가 나요
좋은 오류 보고:
제공해주신 VBA 코드를 실행했는데 다음과 같은 오류가 발생했습니다: 오류 메시지: "런타임 오류 1004: 응용 프로그램 정의 또는 개체 정의 오류" 오류 발생 줄: Range("A1:C" & lastRow).Copy 상황: 데이터가 100행 정도 있는 엑셀 파일에서 실행했습니다. 어떻게 수정해야 할까요?
4.2 디버깅 요청 프롬프트 템플릿
제공해주신 VBA 코드에서 문제가 발생했습니다: [코드 전체 붙여넣기] 오류 내용: - 오류 메시지: [정확한 오류 메시지] - 오류 발생 줄: [문제가 된 코드 줄] - 실행 환경: [Excel 버전, 데이터 상황 등] 코드를 수정해주시고, 왜 이런 오류가 발생했는지 설명도 부탁드립니다.
4.3 실습: 의도적 오류 생성 및 해결
의도적으로 잘못된 코드 요청:
Excel VBA로 A1셀의 값을 B1셀로 복사하는 코드를 만들어주세요. 그런데 A1셀이 비어있으면 "데이터 없음"이라고 B1에 표시해주세요.
오류 수정 요청:
위 코드에서 A1셀이 비어있을 때 오류가 발생합니다. Null 값 처리를 어떻게 해야 하나요? 코드를 수정해주세요.
5단계: 고급 프롬프트 기법
5.1 조건부 로직 요청
Excel VBA로 다음과 같은 복잡한 조건의 코드를 만들어주세요: 만약 A열이 "완료"이면서 B열이 100 이상이면 → C열에 "우수" 만약 A열이 "완료"이면서 B열이 100 미만이면 → C열에 "보통" 만약 A열이 "진행중"이면 → C열에 "대기" 그 외의 경우 → C열에 "확인필요" 이 조건들을 Select Case문을 사용해서 구현해주세요.
5.2 성능 최적화 요청
제공해주신 코드가 데이터가 많을 때 느린 것 같습니다. 다음과 같이 최적화해주세요: 1. 화면 업데이트 비활성화 2. 자동 계산 비활성화 3. 배열을 활용한 일괄 처리 4. 완료 후 설정 복원 최적화된 코드와 함께 성능 개선 포인트도 설명해주세요.
실전 연습 과제
과제 1: 상세한 조건부 서식
ChatGPT에게 보낼 프롬프트를 작성하세요:
  • 목표: 점수에 따라 등급을 자동 분류하고 색상 적용
  • 조건: 90점 이상(A-빨강), 80점 이상(B-주황), 70점 이상(C-노랑), 그 외(D-회색)
과제 2: 오류 처리 포함
ChatGPT에게 다음을 포함한 프롬프트를 작성하세요:
  • 파일이 존재하지 않을 때의 처리
  • 데이터가 없을 때의 처리
  • 권한이 없을 때의 처리
프롬프트 작성 체크리스트
요청 전 확인사항:
  • 구체적인 대상 지정했는가?
  • 작업 내용이 명확한가?
  • 조건이 구체적으로 제시되었는가?
  • 예시 데이터를 포함했는가?
  • 에러 처리나 메시지 요청을 포함했는가?
응답 받은 후 확인사항:
  • 코드가 이해되는가?
  • 설명이 충분한가?
  • 바로 적용 가능한가?
  • 추가 질문이 필요한가?
Chapter 4: 데이터 정리 자동화
학습 목표
  • ChatGPT를 활용해 데이터 정제 자동화 코드를 생성할 수 있다
  • 빈 행 삭제와 중복 제거를 자동화할 수 있다
  • 텍스트 데이터의 공백 제거와 대소문자 통일을 자동화할 수 있다
  • 날짜 형식을 일괄적으로 통일하는 방법을 익힌다
  • 종합적인 고객 명단 정리 시스템을 구축할 수 있다
실습 준비: 테스트 데이터 생성
ChatGPT 프롬프트
Excel VBA로 데이터 정리 실습을 위한 테스트 데이터를 자동 생성하는 코드를 만들어주세요: 생성할 데이터: - A열: 고객명 (20명 정도, 일부 중복 포함) - B열: 나이 (20-60세 랜덤) - C열: 가입일 (다양한 날짜 형식으로 생성) - D열: 전화번호 (하이픈 있는 것과 없는 것 혼재) - E열: 이메일 (대소문자 혼재, 앞뒤 공백 포함) 특징: - 중간중간 빈 행 삽입 (전체의 10% 정도) - 텍스트에 불규칙한 공백 포함 - 일부 중복 데이터 포함 - 다양한 날짜 형식 혼재 총 50행 정도의 테스트 데이터를 생성해주세요.
테스트 데이터 생성 코드
Sub 테스트데이터생성() Dim ws As Worksheet Dim i As Long, randomNum As Long Dim names As Variant, domains As Variant Dim dateFormats As Variant Set ws = ActiveSheet ' 기존 데이터 클리어 ws.Cells.Clear ' 헤더 생성 ws.Range("A1").Value = "고객명" ws.Range("B1").Value = "나이" ws.Range("C1").Value = "가입일" ws.Range("D1").Value = "전화번호" ws.Range("E1").Value = "이메일" ' 샘플 이름 배열 names = Array("김철수", " 이영희 ", "박민수", "최지은", " 정호영", _ "강미나", "윤서준 ", " 한지민", "임태현", "송유진", _ "오준석", " 배수지 ", "노영웅", " 구하나", "문성민", _ "김철수", "이영희 ", " 박민수", "최지은", "정호영") ' 이메일 도메인 배열 domains = Array("@GMAIL.COM", "@naver.com", " @DAUM.NET ", "@outlook.com", " @YAHOO.CO.KR ") ' 날짜 형식 배열 dateFormats = Array("2024/01/15", "2024-1-20", "24.3.10", "2024년 5월 8일", _ "2023/12/25", "23-11-30", "2024.2.14", "invalid_date", _ "2023년 9월 15일", "2024/6/22") Application.ScreenUpdating = False ' 데이터 생성 (50행) For i = 2 To 52 ' 랜덤으로 빈 행 생성 (10% 확률) If Int(Rnd() * 10) + 1 = 1 Then ' 빈 행 생성 (모든 셀 비우기) ws.Range("A" & i & ":E" & i).Value = "" Else ' 고객명 (공백 포함된 이름들) randomNum = Int(Rnd() * UBound(names)) + LBound(names) ws.Range("A" & i).Value = names(randomNum) ' 나이 (20-60세) ws.Range("B" & i).Value = Int(Rnd() * 41) + 20 ' 가입일 (다양한 형식) randomNum = Int(Rnd() * UBound(dateFormats)) + LBound(dateFormats) ws.Range("C" & i).Value = dateFormats(randomNum) ' 전화번호 (하이픈 있는 것과 없는 것) If Rnd() > 0.5 Then ws.Range("D" & i).Value = "010-" & Format(Int(Rnd() * 9000) + 1000, "0000") & "-" & Format(Int(Rnd() * 9000) + 1000, "0000") Else ws.Range("D" & i).Value = "010" & Format(Int(Rnd() * 90000000) + 10000000, "00000000") End If ' 이메일 (대소문자 혼재, 공백 포함) randomNum = Int(Rnd() * UBound(domains)) + LBound(domains) Dim emailName As String emailName = Replace(Trim(names(Int(Rnd() * UBound(names)) + LBound(names))), " ", "") If Rnd() > 0.5 Then ws.Range("E" & i).Value = " " & LCase(emailName) & domains(randomNum) & " " Else ws.Range("E" & i).Value = " " & UCase(emailName) & domains(randomNum) End If End If Next i ' 추가로 몇 개 문제가 있는 데이터 삽입 ws.Range("A53").Value = " KIM CHUL SOO " ' 영문 이름 ws.Range("B53").Value = "abc" ' 잘못된 나이 ws.Range("C53").Value = "잘못된날짜" ' 잘못된 날짜 ws.Range("D53").Value = "010 1234 5678" ' 공백이 있는 전화번호 ws.Range("E53").Value = " INVALID EMAIL " ' 잘못된 이메일 ws.Range("A54").Value = " john.doe " ' 영문 소문자 이름 ws.Range("B54").Value = 25 ws.Range("C54").Value = "2024-06-15" ws.Range("D54").Value = "010-9876-5432" ws.Range("E54").Value = "John.Doe@Company.COM " Application.ScreenUpdating = True ' 컬럼 폭 자동 조정 ws.Columns("A:E").AutoFit MsgBox "테스트 데이터 생성이 완료되었습니다!" & vbCrLf & _ "- 총 54행 (헤더 포함)" & vbCrLf & _ "- 빈 행, 중복 데이터, 형식 오류 포함" & vbCrLf & _ "- 이제 데이터 정리 실습을 시작하세요!" End Sub
고급 테스트 데이터 생성기
Sub 고급테스트데이터생성() Dim ws As Worksheet Dim i As Long, j As Long Dim koreanNames As Variant, englishNames As Variant Dim companies As Variant, domains As Variant Set ws = ActiveSheet ws.Cells.Clear ' 헤더 설정 With ws.Range("A1:E1") .Value = Array("고객명", "나이", "가입일", "전화번호", "이메일") .Font.Bold = True .Interior.Color = RGB(200, 200, 200) End With ' 다양한 이름 배열 koreanNames = Array("김철수", "이영희", "박민수", "최지은", "정호영", "강미나", "윤서준", "한지민", _ "임태현", "송유진", "오준석", "배수지", "노영웅", "구하나", "문성민", "장동건", _ "김태희", "이병헌", "전지현", "원빈") englishNames = Array("John Smith", "Jane Doe", "Michael Johnson", "Sarah Wilson", "David Brown", _ "Lisa Anderson", "Robert Taylor", "Emily Davis", "James Miller", "Jessica Garcia") ' 회사 도메인 companies = Array("company", "corp", "inc", "ltd", "group") domains = Array("gmail.com", "naver.com", "daum.net", "outlook.com", "yahoo.co.kr", "hotmail.com") Application.ScreenUpdating = False ' 100개 데이터 생성 For i = 2 To 101 ' 10% 확률로 빈 행 생성 If Int(Rnd() * 10) = 0 Then ' 완전히 빈 행 Continue For ElseIf Int(Rnd() * 20) = 0 Then ' 부분적으로 빈 행 (일부 셀만 채움) If Rnd() > 0.5 Then ws.Cells(i, 1).Value = " " & koreanNames(Int(Rnd() * UBound(koreanNames)) + 1) & " " End If Continue For End If ' 이름 생성 (한글/영문 혼재, 공백 문제 포함) If Rnd() > 0.3 Then ' 한글 이름 (70% 확률) Dim selectedName As String selectedName = koreanNames(Int(Rnd() * UBound(koreanNames)) + 1) ' 공백 문제 추가 Select Case Int(Rnd() * 5) Case 0: ws.Cells(i, 1).Value = " " & selectedName & " " ' 앞뒤 공백 Case 1: ws.Cells(i, 1).Value = " " & selectedName ' 앞 공백 Case 2: ws.Cells(i, 1).Value = selectedName & " " ' 뒤 공백 Case 3: ws.Cells(i, 1).Value = Replace(selectedName, Mid(selectedName, 2, 1), Mid(selectedName, 2, 1) & " ") ' 중간 공백 Case Else: ws.Cells(i, 1).Value = selectedName ' 정상 End Select Else ' 영문 이름 (30% 확률) selectedName = englishNames(Int(Rnd() * UBound(englishNames)) + 1) ' 대소문자 문제 추가 Select Case Int(Rnd() * 4) Case 0: ws.Cells(i, 1).Value = " " & UCase(selectedName) & " " ' 대문자 + 공백 Case 1: ws.Cells(i, 1).Value = LCase(selectedName) ' 소문자 Case 2: ws.Cells(i, 1).Value = " " & selectedName & " " ' 정상 + 공백 Case Else: ws.Cells(i, 1).Value = selectedName ' 정상 End Select End If ' 나이 생성 (일부 잘못된 데이터 포함) If Int(Rnd() * 20) = 0 Then ' 5% 확률로 잘못된 나이 데이터 Dim invalidAge As Variant invalidAge = Array("abc", "25세", "-5", "200", "N/A", "") ws.Cells(i, 2).Value = invalidAge(Int(Rnd() * UBound(invalidAge)) + 1) Else ws.Cells(i, 2).Value = Int(Rnd() * 50) + 20 ' 20-70세 End If ' 가입일 생성 (다양한 형식) Dim dateValue As Date dateValue = DateSerial(2020 + Int(Rnd() * 5), Int(Rnd() * 12) + 1, Int(Rnd() * 28) + 1) Select Case Int(Rnd() * 8) Case 0: ws.Cells(i, 3).Value = Format(dateValue, "yyyy/mm/dd") Case 1: ws.Cells(i, 3).Value = Format(dateValue, "yyyy-m-d") Case 2: ws.Cells(i, 3).Value = Format(dateValue, "yy.mm.dd") Case 3: ws.Cells(i, 3).Value = Format(dateValue, "yyyy년 m월 d일") Case 4: ws.Cells(i, 3).Value = Format(dateValue, "mm/dd/yyyy") Case 5: ws.Cells(i, 3).Value = Format(dateValue, "dd-mm-yyyy") Case 6: ws.Cells(i, 3).Value = "잘못된날짜" & Int(Rnd() * 100) ' 잘못된 데이터 Case Else: ws.Cells(i, 3).Value = dateValue ' Excel 날짜 형식 End Select ' 전화번호 생성 Dim phoneNum As String phoneNum = "010" & Format(Int(Rnd() * 90000000) + 10000000, "00000000") Select Case Int(Rnd() * 5) Case 0: ws.Cells(i, 4).Value = Left(phoneNum, 3) & "-" & Mid(phoneNum, 4, 4) & "-" & Right(phoneNum, 4) ' 하이픈 형식 Case 1: ws.Cells(i, 4).Value = phoneNum ' 숫자만 Case 2: ws.Cells(i, 4).Value = " " & Left(phoneNum, 3) & " " & Mid(phoneNum, 4, 4) & " " & Right(phoneNum, 4) & " " ' 공백 형식 Case 3: ws.Cells(i, 4).Value = "(" & Left(phoneNum, 3) & ")" & Mid(phoneNum, 4, 4) & "-" & Right(phoneNum, 4) ' 괄호 형식 Case Else: ws.Cells(i, 4).Value = Left(phoneNum, 3) & "-" & Mid(phoneNum, 4, 4) & "-" & Right(phoneNum, 4) End Select ' 이메일 생성 Dim emailPrefix As String, emailDomain As String ' 이름에서 이메일 접두사 생성 emailPrefix = Replace(Replace(Trim(ws.Cells(i, 1).Value), " ", ""), ".", "") If Len(emailPrefix) > 10 Then emailPrefix = Left(emailPrefix, 10) ' 도메인 선택 If Rnd() > 0.7 Then emailDomain = companies(Int(Rnd() * UBound(companies)) + 1) & ".com" Else emailDomain = domains(Int(Rnd() * UBound(domains)) + 1) End If ' 이메일 형식 다양화 Select Case Int(Rnd() * 6) Case 0: ws.Cells(i, 5).Value = " " & UCase(emailPrefix) & "@" & UCase(emailDomain) & " " ' 대문자 + 공백 Case 1: ws.Cells(i, 5).Value = LCase(emailPrefix) & "@" & emailDomain ' 정상 소문자 Case 2: ws.Cells(i, 5).Value = " " & emailPrefix & "@" & emailDomain & " " ' 공백 포함 Case 3: ws.Cells(i, 5).Value = emailPrefix & Int(Rnd() * 100) & "@" & emailDomain ' 숫자 포함 Case 4: ws.Cells(i, 5).Value = "잘못된이메일" & Int(Rnd() * 100) ' 잘못된 형식 Case Else: ws.Cells(i, 5).Value = emailPrefix & "@" & emailDomain ' 정상 End Select Next i ' 중복 데이터 의도적 생성 (5-10개 정도) For j = 1 To 7 Dim sourceRow As Long, targetRow As Long sourceRow = Int(Rnd() * 80) + 2 targetRow = Int(Rnd() * 80) + 2 If sourceRow <> targetRow Then ws.Rows(targetRow).Value = ws.Rows(sourceRow).Value ' 약간의 변형 추가 (공백 등) ws.Cells(targetRow, 1).Value = " " & Trim(ws.Cells(targetRow, 1).Value) & " " End If Next j Application.ScreenUpdating = True ' 컬럼 폭 자동 조정 ws.Columns("A:E").AutoFit ' 결과 메시지 Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row MsgBox "고급 테스트 데이터 생성 완료!" & vbCrLf & _ "총 " & (lastRow - 1) & "행의 데이터가 생성되었습니다." & vbCrLf & vbCrLf & _ "포함된 문제점들:" & vbCrLf & _ "• 빈 행 (약 10%)" & vbCrLf & _ "• 중복 데이터 (7개 정도)" & vbCrLf & _ "• 공백 문제 (앞뒤, 중간)" & vbCrLf & _ "• 대소문자 혼재" & vbCrLf & _ "• 다양한 날짜 형식" & vbCrLf & _ "• 전화번호 형식 다양화" & vbCrLf & _ "• 이메일 형식 문제" & vbCrLf & _ "• 잘못된 데이터 타입" End Sub
1단계: 빈 행 삭제 자동화
1.1 문제 상황 정의
  • Excel 파일에 중간중간 빈 행들이 섞여 있음
  • 수동으로 하나씩 삭제하기에는 시간이 너무 오래 걸림
  • 실수로 데이터가 있는 행을 삭제할 위험성
1.2 ChatGPT 프롬프트
Excel VBA로 다음과 같은 빈 행 삭제 자동화 코드를 만들어주세요: 조건: - A열부터 E열까지의 범위에서 모든 셀이 비어있는 행만 삭제 - 1행(헤더)은 삭제하지 않음 - 삭제된 행의 개수를 카운트해서 메시지로 표시 - 삭제 전에 "빈 행을 삭제하시겠습니까?" 확인 메시지 실행 예시: - 원본: 100행 중 15개 빈 행 - 결과: "15개의 빈 행이 삭제되었습니다" 메시지 코드 설명과 주의사항도 함께 알려주세요.
1.3 예상 응답 및 코드 적용
Sub 빈행삭제() Dim ws As Worksheet Dim lastRow As Long, i As Long Dim deletedCount As Long Dim isEmpty As Boolean Set ws = ActiveSheet ' 사용자 확인 If MsgBox("빈 행을 삭제하시겠습니까?", vbYesNo + vbQuestion) = vbNo Then Exit Sub End If ' 화면 업데이트 비활성화 (성능 향상) Application.ScreenUpdating = False lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 아래에서부터 위로 검사 (삭제 시 행 번호 변경 방지) For i = lastRow To 2 Step -1 isEmpty = True ' A열부터 E열까지 확인 If Not IsEmpty(ws.Cells(i, 1)) Or Not IsEmpty(ws.Cells(i, 2)) Or _ Not IsEmpty(ws.Cells(i, 3)) Or Not IsEmpty(ws.Cells(i, 4)) Or _ Not IsEmpty(ws.Cells(i, 5)) Then isEmpty = False End If ' 빈 행이면 삭제 If isEmpty Then ws.Rows(i).Delete deletedCount = deletedCount + 1 End If Next i ' 화면 업데이트 활성화 Application.ScreenUpdating = True MsgBox deletedCount & "개의 빈 행이 삭제되었습니다" End Sub
1.4 실습 데이터 준비 및 테스트
실습 순서:
  1. 테스트데이터생성() 또는 고급테스트데이터생성() 실행
  1. 생성된 데이터 확인
  1. 빈행삭제() 코드 실행
  1. 결과 확인
2단계: 중복 제거 자동화
2.1 ChatGPT 프롬프트
Excel VBA로 중복 데이터 제거 자동화 코드를 만들어주세요: 요구사항: - A열의 값을 기준으로 중복 판단 - 중복된 경우 첫 번째 행은 유지하고 나머지는 삭제 - 헤더(1행)는 삭제하지 않음 - 대소문자 구분하지 않고 비교 (예: "김철수"와 "김철수"는 같은 것으로 판단) - 삭제된 중복 행의 개수를 메시지로 표시 예시: 1행: 이름 (헤더) 2행: 김철수 3행: 이영희 4행: 김철수 (삭제 대상) 5행: 박민수 6행: 이영희 (삭제 대상) 결과: "2개의 중복 행이 삭제되었습니다"
2.2 예상 코드
Sub 중복제거() Dim ws As Worksheet Dim lastRow As Long, i As Long, j As Long Dim deletedCount As Long Dim nameArray() As String Dim isDuplicate As Boolean Set ws = ActiveSheet If MsgBox("중복 데이터를 제거하시겠습니까?", vbYesNo + vbQuestion) = vbNo Then Exit Sub End If Application.ScreenUpdating = False lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 아래에서부터 위로 검사 For i = lastRow To 3 Step -1 isDuplicate = False ' 현재 행 위의 모든 행과 비교 For j = 2 To i - 1 If UCase(Trim(ws.Cells(i, 1).Value)) = UCase(Trim(ws.Cells(j, 1).Value)) Then isDuplicate = True Exit For End If Next j ' 중복이면 삭제 If isDuplicate Then ws.Rows(i).Delete deletedCount = deletedCount + 1 End If Next i Application.ScreenUpdating = True MsgBox deletedCount & "개의 중복 행이 삭제되었습니다" End Sub
3단계: 텍스트 정리 자동화
3.1 ChatGPT 프롬프트
Excel VBA로 텍스트 데이터 정리 자동화 코드를 만들어주세요: 정리 작업: 1. 모든 텍스트의 앞뒤 공백 제거 (Trim) 2. 이름 컬럼(A열): 첫 글자만 대문자, 나머지는 소문자 3. 이메일 컬럼(E열): 모두 소문자로 변환 4. 전화번호 컬럼(D열): 하이픈(-) 제거하고 숫자만 남기기 대상 범위: A2부터 E열의 마지막 행까지 처리 완료 후: "텍스트 정리가 완료되었습니다" 메시지 예시: 변경 전: " 홍 길동 ", " HONG@GMAIL.COM ", "010-1234-5678" 변경 후: "홍길동", "hong@gmail.com", "01012345678"
3.2 예상 코드
Sub 텍스트정리() Dim ws As Worksheet Dim lastRow As Long, i As Long Dim cellValue As String Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row Application.ScreenUpdating = False For i = 2 To lastRow ' A열: 이름 정리 (Trim + Proper Case) If Not IsEmpty(ws.Cells(i, 1)) Then cellValue = Trim(ws.Cells(i, 1).Value) ws.Cells(i, 1).Value = StrConv(cellValue, vbProperCase) End If ' E열: 이메일 정리 (Trim + LowerCase) If Not IsEmpty(ws.Cells(i, 5)) Then cellValue = Trim(ws.Cells(i, 5).Value) ws.Cells(i, 5).Value = LCase(cellValue) End If ' D열: 전화번호 정리 (하이픈 제거) If Not IsEmpty(ws.Cells(i, 4)) Then cellValue = Trim(ws.Cells(i, 4).Value) cellValue = Replace(cellValue, "-", "") cellValue = Replace(cellValue, " ", "") ws.Cells(i, 4).Value = cellValue End If Next i Application.ScreenUpdating = True MsgBox "텍스트 정리가 완료되었습니다" End Sub
4단계: 날짜 형식 통일하기
4.1 ChatGPT 프롬프트
Excel VBA로 날짜 형식 통일 자동화 코드를 만들어주세요: 문제 상황: - C열에 다양한 형식의 날짜가 섞여 있음 - "2024/01/15", "2024-1-15", "24.1.15", "2024년 1월 15일" 등 요구사항: - 모든 날짜를 "YYYY-MM-DD" 형식으로 통일 - 날짜로 인식되지 않는 데이터는 빨간색으로 표시 - 변환된 날짜 개수와 오류 개수를 메시지로 표시 예시: - "2024/01/15" → "2024-01-15" - "24.1.15" → "2024-01-15" - "abc123" → 빨간색 표시 (오류) 변환 완료 메시지: "15개 변환 완료, 2개 오류 발견"
4.2 예상 코드
Sub 날짜형식통일() Dim ws As Worksheet Dim lastRow As Long, i As Long Dim cellValue As Variant Dim convertedCount As Long, errorCount As Long Dim dateValue As Date Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row Application.ScreenUpdating = False For i = 2 To lastRow If Not IsEmpty(ws.Cells(i, 3)) Then cellValue = ws.Cells(i, 3).Value ' 날짜 변환 시도 On Error Resume Next dateValue = CDate(cellValue) If Err.Number = 0 Then ' 변환 성공: YYYY-MM-DD 형식으로 설정 ws.Cells(i, 3).Value = Format(dateValue, "yyyy-mm-dd") ws.Cells(i, 3).Font.Color = RGB(0, 0, 0) ' 검은색 convertedCount = convertedCount + 1 Else ' 변환 실패: 빨간색으로 표시 ws.Cells(i, 3).Font.Color = RGB(255, 0, 0) ' 빨간색 errorCount = errorCount + 1 End If Err.Clear On Error GoTo 0 End If Next i Application.ScreenUpdating = True MsgBox convertedCount & "개 변환 완료, " & errorCount & "개 오류 발견" End Sub
5단계: 종합 실습 - 고객 명단 정리 완전 자동화
5.1 통합 자동화 시스템 설계
ChatGPT에게 보낼 종합 프롬프트:
Excel VBA로 고객 명단 정리 완전 자동화 시스템을 만들어주세요: 처리 순서: 1. 빈 행 삭제 2. 중복 데이터 제거 (이름 기준) 3. 텍스트 정리 (공백 제거, 대소문자 정리) 4. 날짜 형식 통일 5. 데이터 유효성 검증 (이메일 형식, 전화번호 자릿수) 데이터 구조: A열: 이름, B열: 나이, C열: 가입일, D열: 전화번호, E열: 이메일 각 단계별로 진행상황을 표시하고, 최종 결과를 요약해서 보여주는 코드를 만들어주세요. 추가 요구사항: - 처리 전 백업 시트 자동 생성 - 각 단계마다 진행률 표시 - 오류 발생 시 롤백 기능
5.2 마스터 자동화 코드
Sub 고객명단정리마스터() Dim ws As Worksheet, backupWs As Worksheet Dim lastRow As Long Dim totalSteps As Long: totalSteps = 5 Dim currentStep As Long: currentStep = 0 Set ws = ActiveSheet ' 시작 확인 If MsgBox("고객 명단 정리를 시작하시겠습니까?" & vbCrLf & _ "처리 전 백업이 자동으로 생성됩니다.", vbYesNo + vbQuestion) = vbNo Then Exit Sub End If Application.ScreenUpdating = False ' 1단계: 백업 생성 currentStep = 1 Application.StatusBar = "진행률: " & currentStep & "/" & totalSteps & " - 백업 생성 중..." ws.Copy After:=ws Set backupWs = ActiveSheet backupWs.Name = "백업_" & Format(Now, "yyyymmdd_hhmmss") ws.Activate ' 2단계: 빈 행 삭제 currentStep = 2 Application.StatusBar = "진행률: " & currentStep & "/" & totalSteps & " - 빈 행 삭제 중..." Call 빈행삭제_자동 ' 3단계: 중복 제거 currentStep = 3 Application.StatusBar = "진행률: " & currentStep & "/" & totalSteps & " - 중복 제거 중..." Call 중복제거_자동 ' 4단계: 텍스트 정리 currentStep = 4 Application.StatusBar = "진행률: " & currentStep & "/" & totalSteps & " - 텍스트 정리 중..." Call 텍스트정리_자동 ' 5단계: 날짜 형식 통일 currentStep = 5 Application.StatusBar = "진행률: " & currentStep & "/" & totalSteps & " - 날짜 형식 통일 중..." Call 날짜형식통일_자동 Application.ScreenUpdating = True Application.StatusBar = False MsgBox "고객 명단 정리가 완료되었습니다!" & vbCrLf & _ "백업 시트: " & backupWs.Name & vbCrLf & _ "처리된 데이터 행 수: " & (ws.Cells(ws.Rows.Count, "A").End(xlUp).Row - 1) End Sub
추가 실습 과제
과제 1: 데이터 유효성 검증
ChatGPT에게 다음 검증 기능을 요청해보세요:
  • 이메일 주소 형식 검증 (@와 . 포함 여부)
  • 전화번호 자릿수 검증 (10-11자리)
  • 나이 범위 검증 (0-120세)
과제 2: 고급 텍스트 처리
다음 기능을 추가 요청해보세요:
  • 특수문자 제거
  • 영문 이름의 경우 각 단어 첫 글자만 대문자
  • 한글 이름의 경우 성과 이름 사이 공백 제거
성능 최적화 팁
ChatGPT에게 성능 개선 요청하기
위에서 만든 코드들의 성능을 개선해주세요: 1. 대용량 데이터(10만 행 이상) 처리 시 속도 향상 방안 2. 메모리 사용량 최적화 3. 중간 결과 저장으로 안정성 향상 4. 사용자 취소 기능 추가 개선된 코드와 함께 성능 향상 이유도 설명해주세요.
Chapter 5: 계산과 집계 자동화
학습 목표
  • 조건부 합계와 평균을 자동으로 계산하는 방법을 익힌다
  • 여러 시트의 데이터를 통합하여 집계하는 자동화 기법을 습득한다
  • 월별/분기별 자동 요약 보고서를 생성할 수 있다
  • 비율 및 증감률을 자동으로 계산하는 시스템을 구축한다
  • 매출 데이터 월간 보고서 자동 생성 시스템을 완성한다
실습 준비: 매출 데이터 생성
ChatGPT 프롬프트
Excel VBA로 매출 데이터 집계 실습을 위한 테스트 데이터를 자동 생성하는 코드를 만들어주세요: 생성할 데이터: - A열: 거래일자 (2023년 1월 ~ 2024년 12월, 랜덤) - B열: 부서명 (영업, 기획, 인사, 개발) - C열: 담당자명 (각 부서별 5명씩 20명) - D열: 매출액 (10만원 ~ 500만원 랜덤) - E열: 지역 (서울, 부산, 대구, 인천) - F열: 거래처명 (A업체, B업체... Z업체) 특징: - 2년치 데이터 (약 500-800건) - 계절성 반영 (12월, 1월 매출 증가) - 부서별 매출 차이 반영 - 일부 고액 거래 포함 (100만원 이상) - 각 지점별 시트도 별도 생성 (서울지점, 부산지점, 대구지점, 인천지점) 총 5개 시트 생성: 통합매출데이터 + 지점별 4개 시트
매출 데이터 생성 코드
Sub 매출데이터생성() Dim mainWs As Worksheet Dim 부서명 As Variant, 담당자명 As Variant, 지역명 As Variant, 거래처명 As Variant Dim i As Long, 데이터건수 As Long ' 기존 시트들 삭제 Call 기존시트정리 ' 메인 시트 생성 Set mainWs = Sheets.Add mainWs.Name = "매출데이터" ' 샘플 데이터 정의 부서명 = Array("영업", "기획", "인사", "개발") 담당자명 = Array("김철수", "이영희", "박민수", "최지은", "정호영", _ "강미나", "윤서준", "한지민", "임태현", "송유진", _ "오준석", "배수지", "노영웅", "구하나", "문성민", _ "장동건", "김태희", "이병헌", "전지현", "원빈") 지역명 = Array("서울", "부산", "대구", "인천") 거래처명 = Array("A업체", "B업체", "C업체", "D업체", "E업체", "F업체", "G업체", "H업체", _ "I업체", "J업체", "K업체", "L업체", "M업체", "N업체", "O업체", "P업체", _ "Q업체", "R업체", "S업체", "T업체", "U업체", "V업체", "W업체", "X업체", "Y업체", "Z업체") ' 헤더 생성 With mainWs .Cells(1, 1).Value = "거래일자" .Cells(1, 2).Value = "부서명" .Cells(1, 3).Value = "담당자" .Cells(1, 4).Value = "매출액" .Cells(1, 5).Value = "지역" .Cells(1, 6).Value = "거래처" ' 헤더 서식 With .Range("A1:F1") .Font.Bold = True .Interior.Color = RGB(200, 200, 200) .Font.Color = RGB(0, 0, 0) End With End With Application.ScreenUpdating = False ' 랜덤 시드 초기화 Randomize ' 600건의 데이터 생성 For i = 2 To 601 Dim 거래일자 As Date Dim 선택부서 As String, 선택지역 As String Dim 매출액 As Long ' 거래일자 생성 (2023-01-01 ~ 2024-12-31) 거래일자 = DateSerial(2023 + Int(Rnd() * 2), Int(Rnd() * 12) + 1, Int(Rnd() * 28) + 1) ' 계절성 반영 (12월, 1월 매출 20% 증가) Dim 계절배수 As Double 계절배수 = 1 If Month(거래일자) = 12 Or Month(거래일자) = 1 Then 계절배수 = 1.2 End If ' 부서별 차등 매출 (영업 > 기획 > 개발 > 인사) 선택부서 = 부서명(Int(Rnd() * 4)) Dim 부서배수 As Double Select Case 선택부서 Case "영업": 부서배수 = 1.5 Case "기획": 부서배수 = 1.2 Case "개발": 부서배수 = 1.0 Case "인사": 부서배수 = 0.8 End Select ' 지역 선택 선택지역 = 지역명(Int(Rnd() * 4)) ' 매출액 계산 (10만원 ~ 500만원, 계절성 및 부서 반영) 매출액 = (Int(Rnd() * 4900000) + 100000) * 계절배수 * 부서배수 ' 5% 확률로 고액 거래 (100만원 이상 추가) If Rnd() < 0.05 Then 매출액 = 매출액 + Int(Rnd() * 5000000) + 1000000 End If ' 데이터 입력 mainWs.Cells(i, 1).Value = 거래일자 mainWs.Cells(i, 2).Value = 선택부서 mainWs.Cells(i, 3).Value = 담당자명(Int(Rnd() * 20)) mainWs.Cells(i, 4).Value = 매출액 mainWs.Cells(i, 5).Value = 선택지역 mainWs.Cells(i, 6).Value = 거래처명(Int(Rnd() * 26)) Next i ' 지점별 시트 생성 Call 지점별시트생성(mainWs) ' 컬럼 폭 자동 조정 mainWs.Columns("A:F").AutoFit Application.ScreenUpdating = True MsgBox "매출 데이터 생성 완료!" & vbCrLf & _ "생성된 시트:" & vbCrLf & _ "• 매출데이터 (통합, 600건)" & vbCrLf & _ "• 서울지점, 부산지점, 대구지점, 인천지점" & vbCrLf & _ "• 2023-2024년 데이터" & vbCrLf & _ "• 계절성 및 부서별 차등 반영" End Sub Sub 기존시트정리() Dim ws As Worksheet Dim 시트명목록 As Variant Dim i As Long 시트명목록 = Array("매출데이터", "서울지점", "부산지점", "대구지점", "인천지점", _ "집계결과", "통합집계", "월별요약", "분기별요약", "증감률분석", "경영진대시보드") Application.DisplayAlerts = False For i = 0 To UBound(시트명목록) On Error Resume Next Set ws = Sheets(시트명목록(i)) If Not ws Is Nothing Then ws.Delete Set ws = Nothing End If On Error GoTo 0 Next i Application.DisplayAlerts = True End Sub Sub 지점별시트생성(mainWs As Worksheet) Dim 지점명 As Variant Dim i As Long, j As Long Dim 지점시트 As Worksheet Dim lastRow As Long 지점명 = Array("서울지점", "부산지점", "대구지점", "인천지점") 지역코드 = Array("서울", "부산", "대구", "인천") lastRow = mainWs.Cells(mainWs.Rows.Count, "A").End(xlUp).Row For i = 0 To UBound(지점명) ' 지점별 시트 생성 Set 지점시트 = Sheets.Add(After:=mainWs) 지점시트.Name = 지점명(i) ' 헤더 복사 mainWs.Range("A1:F1").Copy 지점시트.Range("A1:F1") ' 해당 지역 데이터만 복사 Dim 지점Row As Long: 지점Row = 2 For j = 2 To lastRow If mainWs.Cells(j, 5).Value = 지역코드(i) Then mainWs.Range("A" & j & ":F" & j).Copy 지점시트.Range("A" & 지점Row & ":F" & 지점Row) 지점Row = 지점Row + 1 End If Next j ' 컬럼 폭 조정 지점시트.Columns("A:F").AutoFit Next i End Sub
1단계: 조건부 합계/평균 자동 계산
1.1 문제 상황 정의
  • 매출 데이터에서 특정 조건(부서별, 기간별, 금액별)에 따른 집계 필요
  • 매번 수동으로 필터링하고 계산하는 것은 비효율적
  • 조건이 바뀔 때마다 자동으로 재계산되는 시스템 필요
1.2 ChatGPT 프롬프트
Excel VBA로 조건부 집계 자동화 시스템을 만들어주세요: 데이터 구조: - A열: 날짜 (2024-01-01 형식) - B열: 부서명 (영업, 기획, 인사, 개발) - C열: 담당자 - D열: 매출액 - E열: 지역 (서울, 부산, 대구, 인천) 자동 계산 항목: 1. 부서별 총 매출액 2. 월별 평균 매출액 3. 지역별 매출 비중 4. 100만원 이상 고액 거래 건수 5. 각 부서의 월별 성장률 결과 출력: - 새로운 시트 "집계결과"에 정리된 표 형태로 출력 - 계산 일시와 총 데이터 건수도 함께 표시 사용자 편의 기능: - 특정 월을 선택해서 해당 월만 집계할 수 있는 옵션 - 부서를 선택해서 해당 부서만 분석할 수 있는 옵션
1.3 예상 코드 - 조건부 집계 기본
Sub 조건부집계자동화() Dim ws As Worksheet, resultWs As Worksheet Dim lastRow As Long, i As Long Dim 부서별합계 As Object Dim 월별합계 As Object Dim 지역별합계 As Object Dim 고액거래건수 As Long Set ws = Sheets("매출데이터") ' 결과 시트 생성 또는 초기화 On Error Resume Next Set resultWs = Sheets("집계결과") If resultWs Is Nothing Then Set resultWs = Sheets.Add(After:=ws) resultWs.Name = "집계결과" Else resultWs.Cells.Clear End If On Error GoTo 0 ' Dictionary 객체 생성 Set 부서별합계 = CreateObject("Scripting.Dictionary") Set 월별합계 = CreateObject("Scripting.Dictionary") Set 지역별합계 = CreateObject("Scripting.Dictionary") lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 데이터 집계 For i = 2 To lastRow Dim 날짜 As Date, 부서 As String, 매출액 As Double, 지역 As String Dim 월키 As String 날짜 = ws.Cells(i, 1).Value 부서 = ws.Cells(i, 2).Value 매출액 = ws.Cells(i, 4).Value 지역 = ws.Cells(i, 5).Value 월키 = Format(날짜, "yyyy-mm") ' 부서별 합계 If 부서별합계.Exists(부서) Then 부서별합계(부서) = 부서별합계(부서) + 매출액 Else 부서별합계.Add 부서, 매출액 End If ' 월별 합계 If 월별합계.Exists(월키) Then 월별합계(월키) = 월별합계(월키) + 매출액 Else 월별합계.Add 월키, 매출액 End If ' 지역별 합계 If 지역별합계.Exists(지역) Then 지역별합계(지역) = 지역별합계(지역) + 매출액 Else 지역별합계.Add 지역, 매출액 End If ' 고액 거래 건수 If 매출액 >= 1000000 Then 고액거래건수 = 고액거래건수 + 1 End If Next i ' 결과 출력 Call 집계결과출력(resultWs, 부서별합계, 월별합계, 지역별합계, 고액거래건수, lastRow - 1) End Sub Sub 집계결과출력(resultWs As Worksheet, 부서별합계 As Object, 월별합계 As Object, 지역별합계 As Object, 고액거래건수 As Long, 총건수 As Long) Dim row As Long: row = 1 ' 헤더 정보 resultWs.Cells(row, 1).Value = "매출 집계 보고서" resultWs.Cells(row, 1).Font.Bold = True resultWs.Cells(row, 1).Font.Size = 14 row = row + 2 resultWs.Cells(row, 1).Value = "생성일시: " & Now row = row + 1 resultWs.Cells(row, 1).Value = "총 데이터 건수: " & 총건수 & "건" row = row + 2 ' 부서별 집계 resultWs.Cells(row, 1).Value = "부서별 매출액" resultWs.Cells(row, 1).Font.Bold = True row = row + 1 Dim key As Variant For Each key In 부서별합계.Keys resultWs.Cells(row, 1).Value = key resultWs.Cells(row, 2).Value = Format(부서별합계(key), "#,##0") row = row + 1 Next key row = row + 1 ' 기타 결과들도 동일한 방식으로 출력... resultWs.Cells(row, 1).Value = "고액거래(100만원 이상): " & 고액거래건수 & "건" MsgBox "집계가 완료되었습니다. '집계결과' 시트를 확인하세요." End Sub
2단계: 여러 시트 데이터 통합 집계
2.1 ChatGPT 프롬프트
Excel VBA로 여러 시트의 데이터를 통합 집계하는 코드를 만들어주세요: 상황: - 각 지점별로 시트가 분리되어 있음 (서울지점, 부산지점, 대구지점, 인천지점) - 모든 시트의 데이터 구조는 동일함 - 각 시트의 데이터를 통합해서 전체 집계 생성 요구사항: 1. 모든 지점 시트에서 데이터 자동 수집 2. 지점별 순위 매기기 (매출액 기준) 3. 전체 합계와 평균 계산 4. 각 지점의 전체 대비 비중 계산 5. 증감률 분석 (전월 대비) 출력 형태: - "통합집계" 시트에 정리된 표 - 차트도 자동 생성 (막대그래프) 에러 처리: - 시트가 존재하지 않는 경우 경고 메시지 - 데이터가 없는 시트는 제외하고 처리
2.2 예상 코드 - 다중 시트 통합
Sub 다중시트통합집계() Dim 지점명 As Variant Dim i As Long, j As Long Dim ws As Worksheet, 통합시트 As Worksheet Dim 지점별데이터 As Object Dim 총매출 As Double ' 지점 목록 정의 지점명 = Array("서울지점", "부산지점", "대구지점", "인천지점") ' Dictionary 생성 Set 지점별데이터 = CreateObject("Scripting.Dictionary") ' 통합 시트 생성 On Error Resume Next Set 통합시트 = Sheets("통합집계") If 통합시트 Is Nothing Then Set 통합시트 = Sheets.Add 통합시트.Name = "통합집계" Else 통합시트.Cells.Clear End If On Error GoTo 0 ' 각 지점 데이터 수집 For i = 0 To UBound(지점명) On Error Resume Next Set ws = Sheets(지점명(i)) If Not ws Is Nothing Then Dim 지점매출 As Double Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row ' 해당 지점의 총 매출 계산 For j = 2 To lastRow If IsNumeric(ws.Cells(j, 4).Value) Then 지점매출 = 지점매출 + ws.Cells(j, 4).Value End If Next j ' Dictionary에 저장 지점별데이터.Add 지점명(i), 지점매출 총매출 = 총매출 + 지점매출 Set ws = Nothing Else MsgBox 지점명(i) & " 시트를 찾을 수 없습니다." End If On Error GoTo 0 Next i ' 결과 출력 Call 통합결과출력(통합시트, 지점별데이터, 총매출) ' 차트 생성 Call 집계차트생성(통합시트) End Sub Sub 통합결과출력(통합시트 As Worksheet, 지점별데이터 As Object, 총매출 As Double) Dim row As Long: row = 1 Dim key As Variant ' 헤더 통합시트.Cells(row, 1).Value = "지점별 통합 집계" 통합시트.Cells(row, 1).Font.Bold = True row = row + 2 통합시트.Cells(row, 1).Value = "지점명" 통합시트.Cells(row, 2).Value = "매출액" 통합시트.Cells(row, 3).Value = "비중(%)" 통합시트.Cells(row, 4).Value = "순위" ' 헤더 서식 With 통합시트.Range("A" & row & ":D" & row) .Font.Bold = True .Interior.Color = RGB(220, 220, 220) End With row = row + 1 ' 데이터 출력 (매출액 순으로 정렬) Dim 정렬배열() As Variant ReDim 정렬배열(지점별데이터.Count - 1, 1) Dim idx As Long: idx = 0 For Each key In 지점별데이터.Keys 정렬배열(idx, 0) = key 정렬배열(idx, 1) = 지점별데이터(key) idx = idx + 1 Next key ' 버블 정렬 (간단한 정렬) Dim k As Long, l As Long For k = 0 To UBound(정렬배열, 1) - 1 For l = k + 1 To UBound(정렬배열, 1) If 정렬배열(k, 1) < 정렬배열(l, 1) Then Dim temp지점 As String, temp매출 As Double temp지점 = 정렬배열(k, 0) temp매출 = 정렬배열(k, 1) 정렬배열(k, 0) = 정렬배열(l, 0) 정렬배열(k, 1) = 정렬배열(l, 1) 정렬배열(l, 0) = temp지점 정렬배열(l, 1) = temp매출 End If Next l Next k ' 정렬된 결과 출력 For k = 0 To UBound(정렬배열, 1) 통합시트.Cells(row, 1).Value = 정렬배열(k, 0) 통합시트.Cells(row, 2).Value = Format(정렬배열(k, 1), "#,##0") 통합시트.Cells(row, 3).Value = Format((정렬배열(k, 1) / 총매출) * 100, "0.0") & "%" 통합시트.Cells(row, 4).Value = k + 1 row = row + 1 Next k ' 총계 row = row + 1 통합시트.Cells(row, 1).Value = "총계" 통합시트.Cells(row, 2).Value = Format(총매출, "#,##0") 통합시트.Cells(row, 1).Font.Bold = True 통합시트.Cells(row, 2).Font.Bold = True End Sub
3단계: 월별/분기별 자동 요약
3.1 ChatGPT 프롬프트
Excel VBA로 월별/분기별 자동 요약 보고서를 생성하는 코드를 만들어주세요: 기능 요구사항: 1. 매출 데이터를 월별로 그룹화 2. 각 월별 총 매출, 평균 매출, 거래 건수 계산 3. 분기별 집계 (Q1, Q2, Q3, Q4) 4. 전월 대비 증감률 계산 5. 전년 동월 대비 증감률 계산 (데이터가 있는 경우) 추가 분석: - 최고 매출 월과 최저 매출 월 찾기 - 연간 매출 트렌드 분석 (상승/하락/정체) - 계절성 분석 (분기별 패턴) 출력 형태: - "월별요약" 시트와 "분기별요약" 시트 자동 생성 - 각 시트에 해당하는 차트도 자동 생성 - 요약 통계와 인사이트 텍스트도 포함 사용자 옵션: - 특정 연도만 분석할 수 있는 선택 기능 - 특정 부서만 분석할 수 있는 필터 기능
3.2 예상 코드 - 월별/분기별 요약
Sub 월별분기별요약() Dim ws As Worksheet Dim 월별요약시트 As Worksheet, 분기별요약시트 As Worksheet Dim 월별데이터 As Object, 분기별데이터 As Object Dim lastRow As Long, i As Long Set ws = Sheets("매출데이터") Set 월별데이터 = CreateObject("Scripting.Dictionary") Set 분기별데이터 = CreateObject("Scripting.Dictionary") ' 시트 생성 Call 요약시트생성(월별요약시트, 분기별요약시트) lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 데이터 집계 For i = 2 To lastRow Dim 날짜 As Date, 매출액 As Double Dim 월키 As String, 분기키 As String 날짜 = ws.Cells(i, 1).Value 매출액 = ws.Cells(i, 4).Value 월키 = Format(날짜, "yyyy-mm") 분기키 = Format(날짜, "yyyy") & "-Q" & Int((Month(날짜) - 1) / 3) + 1 ' 월별 집계 If 월별데이터.Exists(월키) Then 월별데이터(월키) = Array(월별데이터(월키)(0) + 매출액, 월별데이터(월키)(1) + 1) Else 월별데이터.Add 월키, Array(매출액, 1) End If ' 분기별 집계 If 분기별데이터.Exists(분기키) Then 분기별데이터(분기키) = Array(분기별데이터(분기키)(0) + 매출액, 분기별데이터(분기키)(1) + 1) Else 분기별데이터.Add 분기키, Array(매출액, 1) End If Next i ' 결과 출력 Call 월별결과출력(월별요약시트, 월별데이터) Call 분기별결과출력(분기별요약시트, 분기별데이터) MsgBox "월별/분기별 요약이 완료되었습니다." End Sub Sub 요약시트생성(월별요약시트 As Worksheet, 분기별요약시트 As Worksheet) ' 월별 요약 시트 On Error Resume Next Set 월별요약시트 = Sheets("월별요약") If 월별요약시트 Is Nothing Then Set 월별요약시트 = Sheets.Add 월별요약시트.Name = "월별요약" Else 월별요약시트.Cells.Clear End If ' 분기별 요약 시트 Set 분기별요약시트 = Sheets("분기별요약") If 분기별요약시트 Is Nothing Then Set 분기별요약시트 = Sheets.Add 분기별요약시트.Name = "분기별요약" Else 분기별요약시트.Cells.Clear End If On Error GoTo 0 End Sub
4단계: 비율 및 증감률 자동 계산
4.1 ChatGPT 프롬프트
Excel VBA로 비율과 증감률을 자동으로 계산하는 고급 분석 시스템을 만들어주세요: 계산 항목: 1. 전월 대비 증감률 (%) 2. 전년 동월 대비 증감률 (%) 3. 연초 대비 누적 증감률 (%) 4. 목표 대비 달성률 (%) 5. 각 부서의 전체 대비 기여도 (%) 추가 분석: - 증감률 트렌드 분석 (3개월, 6개월, 12개월 이동평균) - 변동성 분석 (표준편차) - 성장세 분류 (급성장, 완만성장, 정체, 감소) 시각화: - 증감률 차트 (선 그래프) - 비율 차트 (파이 차트) - 트렌드 차트 (복합 차트) 특별 기능: - 음수 증감률은 빨간색, 양수는 파란색으로 표시 - 10% 이상 증가는 녹색 배경으로 하이라이트 - 경고 수준 (-20% 이하 감소) 자동 표시
4.2 예상 코드 - 증감률 계산
Sub 비율증감률분석() Dim ws As Worksheet, 분석시트 As Worksheet Dim 월별데이터 As Object Dim lastRow As Long, i As Long Set ws = Sheets("매출데이터") Set 월별데이터 = CreateObject("Scripting.Dictionary") ' 분석 시트 생성 On Error Resume Next Set 분석시트 = Sheets("증감률분석") If 분석시트 Is Nothing Then Set 분석시트 = Sheets.Add 분석시트.Name = "증감률분석" Else 분석시트.Cells.Clear End If On Error GoTo 0 ' 월별 데이터 수집 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For i = 2 To lastRow Dim 날짜 As Date, 매출액 As Double Dim 월키 As String 날짜 = ws.Cells(i, 1).Value 매출액 = ws.Cells(i, 4).Value 월키 = Format(날짜, "yyyy-mm") If 월별데이터.Exists(월키) Then 월별데이터(월키) = 월별데이터(월키) + 매출액 Else 월별데이터.Add 월키, 매출액 End If Next i ' 증감률 계산 및 출력 Call 증감률계산출력(분석시트, 월별데이터) ' 조건부 서식 적용 Call 증감률조건부서식(분석시트) MsgBox "비율 및 증감률 분석이 완료되었습니다." End Sub Sub 증감률계산출력(분석시트 As Worksheet, 월별데이터 As Object) Dim row As Long: row = 1 Dim 월배열() As String Dim 매출배열() As Double Dim i As Long, key As Variant ' 데이터를 배열로 변환하여 정렬 ReDim 월배열(월별데이터.Count - 1) ReDim 매출배열(월별데이터.Count - 1) i = 0 For Each key In 월별데이터.Keys 월배열(i) = key 매출배열(i) = 월별데이터(key) i = i + 1 Next key ' 월순으로 정렬 (간단한 버블 정렬) For i = 0 To UBound(월배열) - 1 For Dim j As Long j = i + 1 Do While j <= UBound(월배열) If 월배열(i) > 월배열(j) Then Dim temp월 As String, temp매출 As Double temp월 = 월배열(i) temp매출 = 매출배열(i) 월배열(i) = 월배열(j) 매출배열(i) = 매출배열(j) 월배열(j) = temp월 매출배열(j) = temp매출 End If j = j + 1 Loop Next i ' 헤더 출력 분석시트.Cells(row, 1).Value = "월" 분석시트.Cells(row, 2).Value = "매출액" 분석시트.Cells(row, 3).Value = "전월대비(%)" 분석시트.Cells(row, 4).Value = "전년동월대비(%)" 분석시트.Cells(row, 5).Value = "트렌드" With 분석시트.Range("A" & row & ":E" & row) .Font.Bold = True .Interior.Color = RGB(220, 220, 220) End With row = row + 1 ' 데이터 출력 및 증감률 계산 For i = 0 To UBound(월배열) 분석시트.Cells(row, 1).Value = 월배열(i) 분석시트.Cells(row, 2).Value = Format(매출배열(i), "#,##0") ' 전월 대비 증감률 If i > 0 Then Dim 전월증감률 As Double 전월증감률 = ((매출배열(i) - 매출배열(i - 1)) / 매출배열(i - 1)) * 100 분석시트.Cells(row, 3).Value = Format(전월증감률, "0.0") & "%" ' 트렌드 분석 If 전월증감률 > 10 Then 분석시트.Cells(row, 5).Value = "급성장" 분석시트.Cells(row, 5).Interior.Color = RGB(144, 238, 144) ElseIf 전월증감률 > 0 Then 분석시트.Cells(row, 5).Value = "성장" 분석시트.Cells(row, 5).Interior.Color = RGB(173, 216, 230) ElseIf 전월증감률 > -10 Then 분석시트.Cells(row, 5).Value = "정체" 분석시트.Cells(row, 5).Interior.Color = RGB(255, 255, 224) Else 분석시트.Cells(row, 5).Value = "감소" 분석시트.Cells(row, 5).Interior.Color = RGB(255, 182, 193) End If End If ' 전년 동월 대비 (12개월 전 데이터가 있는 경우) If i >= 12 Then Dim 전년증감률 As Double 전년증감률 = ((매출배열(i) - 매출배열(i - 12)) / 매출배열(i - 12)) * 100 분석시트.Cells(row, 4).Value = Format(전년증감률, "0.0") & "%" End If row = row + 1 Next i End Sub
5단계: 매출 데이터 월간 보고서 자동 생성
5.1 최종 통합 시스템 프롬프트
Excel VBA로 매출 데이터 월간 보고서 완전 자동 생성 시스템을 만들어주세요: 통합 기능: 1. 모든 이전 단계의 분석을 하나의 보고서로 통합 2. 경영진용 대시보드 형태로 구성 3. 핵심 지표와 인사이트를 한 눈에 볼 수 있게 배치 4. 자동 차트 생성 (5-6개의 다양한 차트) 보고서 구성: - 페이지 1: 전체 요약 (핵심 KPI) - 페이지 2: 부서별 상세 분석 - 페이지 3: 트렌드 및 예측 - 페이지 4: 액션 아이템 및 권장사항 자동화 기능: - 매월 1일에 자동 실행되도록 스케줄링 - 이메일로 자동 발송 (PDF 첨부) - 이전 월 데이터 자동 백업 - 에러 발생 시 관리자에게 알림 고급 기능: - 데이터 품질 체크 (누락, 이상치 탐지) - 자동 인사이트 생성 (텍스트) - 목표 대비 달성률 분석 - 다음 달 예측 (간단한 트렌드 기반)
5.2 마스터 보고서 생성 코드
Sub 매출보고서마스터생성() Dim 시작시간 As Date 시작시간 = Now Application.ScreenUpdating = False Application.DisplayAlerts = False ' 진행상황 표시 Application.StatusBar = "매출 보고서 생성 중... (1/8) 데이터 검증" ' 1단계: 데이터 품질 체크 If Not 데이터품질체크() Then MsgBox "데이터에 문제가 발견되었습니다. 보고서 생성을 중단합니다." Exit Sub End If ' 2단계: 기본 집계 Application.StatusBar = "매출 보고서 생성 중... (2/8) 기본 집계" Call 조건부집계자동화 ' 3단계: 다중 시트 통합 Application.StatusBar = "매출 보고서 생성 중... (3/8) 시트 통합" Call 다중시트통합집계 ' 4단계: 월별/분기별 요약 Application.StatusBar = "매출 보고서 생성 중... (4/8) 기간별 요약" Call 월별분기별요약 ' 5단계: 증감률 분석 Application.StatusBar = "매출 보고서 생성 중... (5/8) 증감률 분석" Call 비율증감률분석 ' 6단계: 대시보드 생성 Application.StatusBar = "매출 보고서 생성 중... (6/8) 대시보드 생성" Call 경영진대시보드생성 ' 7단계: 차트 생성 Application.StatusBar = "매출 보고서 생성 중... (7/8) 차트 생성" Call 종합차트생성 ' 8단계: 최종 정리 Application.StatusBar = "매출 보고서 생성 중... (8/8) 최종 정리" Call 보고서최종정리 Application.ScreenUpdating = True Application.DisplayAlerts = True Application.StatusBar = False Dim 소요시간 As String 소요시간 = Format(Now - 시작시간, "nn:ss") MsgBox "매출 보고서가 완성되었습니다!" & vbCrLf & _ "소요시간: " & 소요시간 & vbCrLf & _ "'경영진대시보드' 시트를 확인하세요." End Sub Function 데이터품질체크() As Boolean Dim ws As Worksheet Dim lastRow As Long, i As Long Dim 오류개수 As Long Set ws = Sheets("매출데이터") lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For i = 2 To lastRow ' 날짜 검증 If Not IsDate(ws.Cells(i, 1).Value) Then 오류개수 = 오류개수 + 1 End If ' 매출액 검증 If Not IsNumeric(ws.Cells(i, 4).Value) Or ws.Cells(i, 4).Value < 0 Then 오류개수 = 오류개수 + 1 End If Next i If 오류개수 > 0 Then MsgBox "데이터 품질 문제: " & 오류개수 & "개의 오류가 발견되었습니다." 데이터품질체크 = False Else 데이터품질체크 = True End If End Function Sub 경영진대시보드생성() Dim 대시보드 As Worksheet ' 대시보드 시트 생성 On Error Resume Next Set 대시보드 = Sheets("경영진대시보드") If 대시보드 Is Nothing Then Set 대시보드 = Sheets.Add 대시보드.Name = "경영진대시보드" Else 대시보드.Cells.Clear End If On Error GoTo 0 ' 제목 대시보드.Cells(1, 1).Value = "매출 현황 대시보드" 대시보드.Cells(1, 1).Font.Size = 20 대시보드.Cells(1, 1).Font.Bold = True 대시보드.Cells(2, 1).Value = "생성일: " & Format(Now, "yyyy년 mm월 dd일") ' 핵심 KPI 영역 대시보드.Cells(4, 1).Value = "핵심 지표 (Key Performance Indicators)" 대시보드.Cells(4, 1).Font.Bold = True 대시보드.Cells(4, 1).Font.Size = 14 ' 실제 KPI 값들은 다른 시트에서 가져와서 표시 Call KPI값표시(대시보드) End Sub
ChatGPT API 토큰 생성 가이드 (부록)
1. OpenAI 계정 생성
계정 가입
  1. OpenAI 웹사이트 접속: https://platform.openai.com
초기 설정
  • 프로필 정보 입력
  • 사용 목적 선택 (개인용/업무용)
  • 약관 동의
2. API 키 생성하기
API 키 관리
API 키 발급 절차
  1. OpenAI 플랫폼 로그인: https://platform.openai.com
  1. 우측 상단 프로필 아이콘 클릭
  1. View API keys 선택
  1. Create new secret key 버튼 클릭
  1. 키 이름 입력 (예: "VBA-Project-2024")
  1. 프로젝트 선택 (신규 기능)
  1. Create secret key 확인
API 키 관리
생성된 키 형태: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
중요 사항:
  • API 키는 생성 즉시 한 번만 표시됩니다
  • 반드시 안전한 곳에 복사하여 저장하세요
  • 키를 분실하면 새로 생성해야 합니다
3. 요금제 및 사용량 설정
최신 요금 정보
2024년 7월 대폭 가격 인하! 최대 90% 절약
추천 모델: GPT-4o-mini (신규 출시)
  • 입력: $0.15/100만 토큰 (기존 GPT-3.5보다 60% 저렴!)
  • 출력: $0.60/100만 토큰
  • 성능: GPT-3.5보다 우수하면서 더 저렴
기타 주요 모델:
  • GPT-3.5-turbo: 입력 $0.50, 출력 $1.50 (100만 토큰당)
  • GPT-4o: 입력 $3.00, 출력 $10.00 (90% 가격 인하!)
  • GPT-4 Turbo: 입력 $10.00, 출력 $30.00
중요 변경사항
무료 크레딧 중단: 2024년부터 신규 가입자 무료 크레딧 제공 중단 즉시 결제 필요: 계정 생성 시 결제 수단을 반드시 등록해야 함
사용량 한도 설정
  1. SettingsBilling 이동
  1. Usage limits 설정
  1. 월 사용 한도 금액 입력 (예: $10-20 추천)
  1. 알림 임계값 설정 (예: 80% 도달시 알림)
결제 방법 등록 (필수)
  1. BillingPayment methods
  1. 신용카드 정보 입력 (필수)
  1. 자동 충전 설정 (선택사항)
4. API 키 테스트
기본 연결 테스트 코드 (GPT-4o-mini 사용)
Sub API키테스트() Dim apiKey As String Dim url As String Dim headers As String Dim jsonData As String ' API 키 입력 (실제 사용시에는 안전한 방법으로 관리) apiKey = "여기에_실제_API키_입력" ' OpenAI API 엔드포인트 url = "https://api.openai.com/v1/chat/completions" ' HTTP 헤더 설정 headers = "Content-Type: application/json" & vbCrLf & _ "Authorization: Bearer " & apiKey ' 요청 데이터 (JSON 형태) - 2024년 최신 모델 사용 jsonData = "{" & _ """model"": ""gpt-4o-mini""," & _ """messages"": [{" & _ """role"": ""user""," & _ """content"": ""안녕하세요! API 연결 테스트입니다.""" & _ "}]," & _ """max_tokens"": 100," & _ """temperature"": 0.7" & _ "}" ' 예상 비용: 약 0.00001달러 (매우 저렴!) MsgBox "API 키 설정이 완료되었습니다. GPT-4o-mini 모델로 테스트 준비 완료!" End Sub
ChatGPT로 배우는 Google Apps Script
Chapter 1: ChatGPT로 Google Apps Script 시작하기
학습 목표
  • Google Apps Script 개발 환경을 설정할 수 있다
  • ChatGPT를 활용해 첫 번째 스크립트를 작성할 수 있다
  • Google Sheets와 연결된 기본 자동화를 구현할 수 있다
  • 스크립트 실행과 디버깅 방법을 익힌다
1단계: Google Apps Script란?
Google Apps Script는 Google Workspace(Gmail, Sheets, Docs, Drive 등)를 자동화할 수 있는 클라우드 기반 JavaScript 플랫폼입니다.
VBA와의 주요 차이점:
  • 설치 불필요: 브라우저만 있으면 어디서든 개발 가능
  • 클라우드 실행: Google 서버에서 실행되어 24/7 작동 가능
  • 무료 사용: Gmail 계정만으로 모든 기능 이용
  • 실시간 협업: 여러 개발자가 동시 작업 가능
2단계: 개발 환경 5분 셋업
2.1 Google Apps Script 에디터 접근하기
방법 1: 직접 접근
  1. 브라우저에서 script.google.com 접속
  1. Google 계정으로 로그인
  1. "새 프로젝트" 클릭
방법 2: Google Sheets에서 접근
  1. 새 Google Sheets 생성
  1. 확장 프로그램 → Apps Script 클릭
  1. 스크립트 에디터가 열리는 것을 확인
2.2 첫 번째 프로젝트 생성
  1. 프로젝트 이름을 "내첫번째자동화"로 변경
  1. 기본 myFunction() 확인
  1. 저장 버튼 클릭 (Ctrl + S)
3단계: ChatGPT에게 첫 스크립트 요청하기
3.1 효과적인 첫 질문 방법
나쁜 예시:
Google Apps Script 코드 만들어줘
좋은 예시:
Google Apps Script로 Google Sheets의 A1 셀에 "Hello World!"를 입력하는 간단한 코드를 만들어주세요. 초보자도 따라할 수 있도록 단계별 설명도 함께 부탁드립니다.
3.2 ChatGPT 프롬프트 템플릿
# 요청 사항: [구체적인 기능 설명] # 사용 환경: Google Apps Script + Google Sheets # 난이도: 초급자용 # 추가 요청: 코드 설명과 실행 방법도 함께 알려주세요
4단계: 첫 번째 실습 - Hello World 만들기
4.1 ChatGPT에게 보낼 질문
Google Apps Script로 다음 작업을 수행하는 코드를 만들어주세요: 1. 현재 활성화된 Google Sheets의 A1 셀에 "Hello World!" 입력 2. B1 셀에 현재 날짜와 시간 입력 3. C1 셀에 "자동화 성공!" 메시지 입력 4. 작업 완료 후 "스크립트 실행 완료" 알림창 띄우기 함수명은 helloWorld로 만들어주세요.
4.2 예상 ChatGPT 응답
function helloWorld() { // 현재 활성화된 스프레드시트 가져오기 var sheet = SpreadsheetApp.getActiveSheet(); // A1 셀에 "Hello World!" 입력 sheet.getRange("A1").setValue("Hello World!"); // B1 셀에 현재 날짜와 시간 입력 sheet.getRange("B1").setValue(new Date()); // C1 셀에 "자동화 성공!" 메시지 입력 sheet.getRange("C1").setValue("자동화 성공!"); // 완료 알림창 띄우기 SpreadsheetApp.getUi().alert("스크립트 실행 완료"); }
4.3 코드 적용 단계
  1. 코드 입력: ChatGPT가 제공한 코드를 에디터에 복사&붙여넣기
  1. 저장: Ctrl + S로 저장
  1. 실행: 재생 버튼() 클릭 또는 F5
  1. 권한 승인: 처음 실행 시 권한 승인 필요
  1. 결과 확인: Google Sheets에서 A1, B1, C1 셀 확인
5단계: 실용적인 두 번째 실습
5.1 실습: 학생 성적 자동 계산
ChatGPT에게 보낼 질문:
Google Apps Script로 학생 성적을 자동 계산하는 코드를 만들어주세요: 데이터 구조: - A1: "이름", B1: "중간고사", C1: "기말고사", D1: "총점", E1: "평균", F1: "등급" - A2부터: 학생 데이터 (홍길동, 85, 90 형태) 기능: 1. D열에 중간고사 + 기말고사 총점 자동 계산 2. E열에 평균 점수 계산 (총점/2) 3. F열에 등급 계산 (90점 이상 A, 80점 이상 B, 70점 이상 C, 나머지 F) 4. 계산된 행의 개수를 알림창으로 표시 함수명은 calculateGrades로 만들어주세요.
5.2 예상 응답 및 적용
function calculateGrades() { var sheet = SpreadsheetApp.getActiveSheet(); // 헤더 설정 var headers = ["이름", "중간고사", "기말고사", "총점", "평균", "등급"]; sheet.getRange("A1:F1").setValues([headers]); // 데이터 범위 찾기 (A2부터 마지막 행까지) var lastRow = sheet.getLastRow(); var dataRange = sheet.getRange("A2:C" + lastRow); var data = dataRange.getValues(); var processedCount = 0; // 각 학생별 계산 for (var i = 0; i < data.length; i++) { var row = i + 2; // 실제 행 번호 var midterm = data[i][1]; // B열 (중간고사) var final = data[i][2]; // C열 (기말고사) // 숫자인지 확인 if (typeof midterm === 'number' && typeof final === 'number') { // 총점 계산 var total = midterm + final; sheet.getRange("D" + row).setValue(total); // 평균 계산 var average = total / 2; sheet.getRange("E" + row).setValue(average); // 등급 계산 var grade; if (average >= 90) grade = "A"; else if (average >= 80) grade = "B"; else if (average >= 70) grade = "C"; else grade = "F"; sheet.getRange("F" + row).setValue(grade); processedCount++; } } // 결과 알림 SpreadsheetApp.getUi().alert(processedCount + "명의 성적이 계산되었습니다."); }
6단계: 버튼으로 스크립트 실행하기
6.1 커스텀 메뉴 추가
ChatGPT에게 요청:
Google Sheets에 커스텀 메뉴를 추가하여 방금 만든 함수들을 쉽게 실행할 수 있도록 하는 코드를 만들어주세요. 메뉴명: "자동화 도구" 항목: 1. "Hello World 실행" → helloWorld 함수 실행 2. "성적 계산" → calculateGrades 함수 실행 3. "구분선" 4. "도움말" → 사용법 안내 알림창
예상 응답:
function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('자동화 도구') .addItem('Hello World 실행', 'helloWorld') .addItem('성적 계산', 'calculateGrades') .addSeparator() .addItem('도움말', 'showHelp') .addToUi(); } function showHelp() { var ui = SpreadsheetApp.getUi(); var helpText = "자동화 도구 사용법:\n\n" + "1. Hello World 실행: A1~C1에 테스트 데이터 입력\n" + "2. 성적 계산: A열에 이름, B열에 중간고사, C열에 기말고사 점수 입력 후 실행\n\n" + "문제가 있으면 개발자에게 문의하세요."; ui.alert("도움말", helpText, ui.ButtonSet.OK); }
7단계: 추가 실습 과제
과제 1: 개인화된 인사말 생성기
ChatGPT 질문:
Google Apps Script로 다음 기능을 하는 코드를 만들어주세요: 1. 사용자에게 이름을 입력받는 대화상자 표시 2. 입력받은 이름으로 "안녕하세요, [이름]님! 오늘도 좋은 하루 되세요!" 메시지 생성 3. 현재 시간에 따라 인사말 변경 (오전: 좋은 아침, 오후: 좋은 오후, 저녁: 좋은 저녁) 4. A1 셀에 개인화된 인사말 입력
과제 2: 간단한 재고 관리 시스템
ChatGPT 질문:
Google Apps Script로 간단한 재고 관리 시스템을 만들어주세요: 데이터 구조: - A열: 상품명, B열: 현재고, C열: 최소재고, D열: 상태 기능: 1. 현재고가 최소재고보다 적으면 D열에 "재주문 필요" 표시 (빨간색) 2. 현재고가 충분하면 "정상" 표시 (녹색) 3. 재주문이 필요한 상품 개수를 알림창으로 표시
Chapter 2: Google Sheets 고급 자동화
학습 목표
  • 복잡한 데이터 처리와 분석을 자동화할 수 있다
  • 동적 차트와 대시보드를 생성할 수 있다
  • 데이터 검증과 조건부 서식을 적용할 수 있다
  • 대용량 데이터를 효율적으로 처리할 수 있다
1단계: 실습 데이터 생성 자동화
1.1 ChatGPT에게 테스트 데이터 생성 요청
프롬프트:
Google Apps Script로 매출 데이터 분석 실습을 위한 테스트 데이터를 자동 생성하는 코드를 만들어주세요: 생성할 데이터: - A열: 날짜 (2024년 1월~12월, 랜덤) - B열: 지역 (서울, 부산, 대구, 대전 중 랜덤) - C열: 담당자 (김철수, 이영희, 박민수, 최지은 중 랜덤) - D열: 상품명 (제품A, 제품B, 제품C 중 랜덤) - E열: 수량 (1~100 랜덤) - F열: 단가 (1000~50000 랜덤) - G열: 매출액 (수량 × 단가 자동 계산) 특징: - 헤더 포함 총 100행 생성 - 날짜는 YYYY-MM-DD 형식 - 매출액에는 천 단위 콤마 적용
1.2 예상 응답 및 활용
function generateSalesData() { var sheet = SpreadsheetApp.getActiveSheet(); // 기존 데이터 삭제 sheet.clear(); // 헤더 설정 var headers = ["날짜", "지역", "담당자", "상품명", "수량", "단가", "매출액"]; sheet.getRange("A1:G1").setValues([headers]); // 헤더 스타일링 var headerRange = sheet.getRange("A1:G1"); headerRange.setFontWeight("bold"); headerRange.setBackground("#4CAF50"); headerRange.setFontColor("white"); // 샘플 데이터 배열 var regions = ["서울", "부산", "대구", "대전"]; var managers = ["김철수", "이영희", "박민수", "최지은"]; var products = ["제품A", "제품B", "제품C"]; // 99행의 데이터 생성 var data = []; for (var i = 0; i < 99; i++) { // 랜덤 날짜 생성 (2024년) var randomMonth = Math.floor(Math.random() * 12) + 1; var randomDay = Math.floor(Math.random() * 28) + 1; var dateStr = "2024-" + (randomMonth < 10 ? "0" + randomMonth : randomMonth) + "-" + (randomDay < 10 ? "0" + randomDay : randomDay); // 랜덤 데이터 생성 var region = regions[Math.floor(Math.random() * regions.length)]; var manager = managers[Math.floor(Math.random() * managers.length)]; var product = products[Math.floor(Math.random() * products.length)]; var quantity = Math.floor(Math.random() * 100) + 1; var unitPrice = (Math.floor(Math.random() * 50) + 1) * 1000; var revenue = quantity * unitPrice; data.push([dateStr, region, manager, product, quantity, unitPrice, revenue]); } // 데이터 입력 sheet.getRange("A2:G100").setValues(data); // 매출액 열에 천 단위 콤마 적용 sheet.getRange("F2:G100").setNumberFormat("#,##0"); // 컬럼 폭 자동 조정 sheet.autoResizeColumns(1, 7); SpreadsheetApp.getUi().alert("테스트 데이터 생성 완료!\n99개의 매출 데이터가 생성되었습니다."); }
2단계: 데이터 분석 자동화
2.1 지역별/월별 매출 집계
ChatGPT 프롬프트:
방금 생성한 매출 데이터를 분석하는 Google Apps Script 코드를 만들어주세요: 기능: 1. 새로운 시트 "분석결과" 생성 2. 지역별 총 매출액과 평균 매출액 계산 3. 월별 매출 추이 계산 4. 상품별 판매량과 매출액 계산 5. 담당자별 성과 분석 6. 결과를 정리된 표 형태로 출력 7. 분석 완료 시간도 함께 표시 모든 계산은 원본 데이터 시트의 데이터를 참조해서 수행하세요.
2.2 예상 응답
function analyzeSalesData() { var sourceSheet = SpreadsheetApp.getActiveSheet(); var ss = SpreadsheetApp.getActiveSpreadsheet(); // 분석결과 시트 생성 또는 기존 시트 사용 var analysisSheet; try { analysisSheet = ss.getSheetByName("분석결과"); analysisSheet.clear(); } catch (e) { analysisSheet = ss.insertSheet("분석결과"); } // 원본 데이터 가져오기 var dataRange = sourceSheet.getRange("A2:G100"); var data = dataRange.getValues(); // 분석 결과 저장할 객체들 var regionStats = {}; var monthStats = {}; var productStats = {}; var managerStats = {}; // 데이터 분석 data.forEach(function(row) { var date = new Date(row[0]); var region = row[1]; var manager = row[2]; var product = row[3]; var quantity = row[4]; var unitPrice = row[5]; var revenue = row[6]; var month = date.getMonth() + 1; // 1-12월 // 지역별 집계 if (!regionStats[region]) { regionStats[region] = { revenue: 0, count: 0 }; } regionStats[region].revenue += revenue; regionStats[region].count += 1; // 월별 집계 if (!monthStats[month]) { monthStats[month] = 0; } monthStats[month] += revenue; // 상품별 집계 if (!productStats[product]) { productStats[product] = { revenue: 0, quantity: 0 }; } productStats[product].revenue += revenue; productStats[product].quantity += quantity; // 담당자별 집계 if (!managerStats[manager]) { managerStats[manager] = { revenue: 0, count: 0 }; } managerStats[manager].revenue += revenue; managerStats[manager].count += 1; }); // 결과 출력 var row = 1; // 제목 analysisSheet.getRange("A" + row).setValue("매출 데이터 분석 보고서"); analysisSheet.getRange("A" + row).setFontSize(16).setFontWeight("bold"); row += 2; // 분석 시간 analysisSheet.getRange("A" + row).setValue("분석 시간: " + new Date()); row += 2; // 지역별 분석 analysisSheet.getRange("A" + row).setValue("지역별 매출 분석"); analysisSheet.getRange("A" + row).setFontWeight("bold").setBackground("#E3F2FD"); row++; analysisSheet.getRange("A" + row + ":C" + row).setValues([["지역", "총 매출액", "평균 매출액"]]); analysisSheet.getRange("A" + row + ":C" + row).setFontWeight("bold"); row++; for (var region in regionStats) { var total = regionStats[region].revenue; var avg = total / regionStats[region].count; analysisSheet.getRange("A" + row + ":C" + row).setValues([[region, total, avg]]); row++; } row += 2; // 월별 분석 analysisSheet.getRange("A" + row).setValue("월별 매출 추이"); analysisSheet.getRange("A" + row).setFontWeight("bold").setBackground("#E8F5E8"); row++; analysisSheet.getRange("A" + row + ":B" + row).setValues([["월", "매출액"]]); analysisSheet.getRange("A" + row + ":B" + row).setFontWeight("bold"); row++; for (var month = 1; month <= 12; month++) { var monthRevenue = monthStats[month] || 0; analysisSheet.getRange("A" + row + ":B" + row).setValues([[month + "월", monthRevenue]]); row++; } // 숫자 형식 적용 analysisSheet.getRange("B:C").setNumberFormat("#,##0"); // 컬럼 폭 조정 analysisSheet.autoResizeColumns(1, 3); SpreadsheetApp.getUi().alert("데이터 분석 완료!\n'분석결과' 시트를 확인하세요."); }
3단계: 동적 차트 생성
3.1 차트 자동 생성 요청
ChatGPT 프롬프트:
분석결과 시트의 데이터를 바탕으로 차트를 자동 생성하는 Google Apps Script 코드를 만들어주세요: 생성할 차트: 1. 지역별 매출액 파이차트 2. 월별 매출 추이 선형차트 3. 상품별 판매량 막대차트 차트 특성: - 각 차트마다 적절한 제목과 범례 포함 - 차트 크기는 400x300 픽셀 - 분석결과 시트의 빈 공간에 배치 - 차트 생성 후 위치 자동 조정
3.2 예상 응답
function createAnalysisCharts() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var analysisSheet = ss.getSheetByName("분석결과"); if (!analysisSheet) { SpreadsheetApp.getUi().alert("먼저 데이터 분석을 실행해주세요."); return; } // 기존 차트 삭제 var charts = analysisSheet.getCharts(); charts.forEach(function(chart) { analysisSheet.removeChart(chart); }); // 지역별 데이터 범위 찾기 (동적으로 찾기) var regionDataRange = null; var monthDataRange = null; // 데이터 범위 자동 감지 var data = analysisSheet.getDataRange().getValues(); var regionStartRow = -1; var monthStartRow = -1; for (var i = 0; i < data.length; i++) { if (data[i][0] === "지역별 매출 분석") { regionStartRow = i + 2; // 헤더 다음 행 } if (data[i][0] === "월별 매출 추이") { monthStartRow = i + 2; // 헤더 다음 행 break; } } // 지역별 매출 파이차트 if (regionStartRow > 0) { var regionEndRow = monthStartRow - 3; // 월별 데이터 시작 전까지 regionDataRange = analysisSheet.getRange(regionStartRow, 1, regionEndRow - regionStartRow + 1, 2); var pieChart = analysisSheet.newChart() .setChartType(Charts.ChartType.PIE) .addRange(regionDataRange) .setPosition(5, 5, 0, 0) // 5행 5열 위치 .setOption('title', '지역별 매출 비중') .setOption('width', 400) .setOption('height', 300) .setOption('is3D', true) .build(); analysisSheet.insertChart(pieChart); } // 월별 매출 선형차트 if (monthStartRow > 0) { monthDataRange = analysisSheet.getRange(monthStartRow, 1, 12, 2); // 12개월 데이터 var lineChart = analysisSheet.newChart() .setChartType(Charts.ChartType.LINE) .addRange(monthDataRange) .setPosition(5, 8, 0, 0) // 5행 8열 위치 .setOption('title', '월별 매출 추이') .setOption('width', 400) .setOption('height', 300) .setOption('curveType', 'smooth') .setOption('pointSize', 5) .build(); analysisSheet.insertChart(lineChart); } SpreadsheetApp.getUi().alert("차트 생성 완료!\n지역별 파이차트와 월별 선형차트가 생성되었습니다."); }
4단계: 데이터 검증과 조건부 서식
4.1 고급 데이터 검증 시스템
ChatGPT 프롬프트:
원본 매출 데이터에 데이터 검증과 조건부 서식을 적용하는 Google Apps Script 코드를 만들어주세요: 데이터 검증: 1. 날짜 열: 유효한 날짜 형식만 허용 2. 지역 열: "서울,부산,대구,대전" 중에서만 선택 가능 (드롭다운) 3. 수량 열: 1~1000 사이의 숫자만 허용 4. 단가 열: 1000~100000 사이의 숫자만 허용 조건부 서식: 1. 매출액 상위 10% → 녹색 배경 2. 매출액 하위 10% → 빨간색 배경 3. 수량이 50 이상 → 파란색 글자 4. 단가가 30000 이상 → 굵은 글씨 적용 후 검증 규칙과 서식이 제대로 적용되었는지 확인하는 메시지도 표시해주세요.
4.2 예상 응답
function applyDataValidationAndFormatting() { var sheet = SpreadsheetApp.getActiveSheet(); var dataRange = sheet.getRange("A2:G100"); // 데이터 범위 (헤더 제외) // 1. 데이터 검증 규칙 적용 // 지역 열에 드롭다운 검증 var regionValidation = SpreadsheetApp.newDataValidation() .requireValueInList(['서울', '부산', '대구', '대전']) .setAllowInvalid(false) .setHelpText('서울, 부산, 대구, 대전 중에서 선택하세요') .build(); sheet.getRange("B2:B100").setDataValidation(regionValidation); // 수량 열에 숫자 범위 검증 var quantityValidation = SpreadsheetApp.newDataValidation() .requireNumberBetween(1, 1000) .setAllowInvalid(false) .setHelpText('1~1000 사이의 숫자를 입력하세요') .build(); sheet.getRange("E2:E100").setDataValidation(quantityValidation); // 단가 열에 숫자 범위 검증 var priceValidation = SpreadsheetApp.newDataValidation() .requireNumberBetween(1000, 100000) .setAllowInvalid(false) .setHelpText('1,000~100,000 사이의 숫자를 입력하세요') .build(); sheet.getRange("F2:F100").setDataValidation(priceValidation); // 2. 조건부 서식 적용 // 매출액 데이터 가져오기 var revenueData = sheet.getRange("G2:G100").getValues(); var revenues = revenueData.map(function(row) { return row[0]; }).filter(function(val) { return val > 0; }); revenues.sort(function(a, b) { return b - a; }); // 내림차순 정렬 var top10Percent = revenues[Math.floor(revenues.length * 0.1)]; var bottom10Percent = revenues[Math.floor(revenues.length * 0.9)]; // 매출액 상위 10% - 녹색 배경 var topRule = SpreadsheetApp.newConditionalFormatRule() .whenNumberGreaterThanOrEqualTo(top10Percent) .setBackground("#C8E6C9") .setRanges([sheet.getRange("G2:G100")]) .build(); // 매출액 하위 10% - 빨간색 배경 var bottomRule = SpreadsheetApp.newConditionalFormatRule() .whenNumberLessThanOrEqualTo(bottom10Percent) .setBackground("#FFCDD2") .setRanges([sheet.getRange("G2:G100")]) .build(); // 수량 50 이상 - 파란색 글자 var quantityRule = SpreadsheetApp.newConditionalFormatRule() .whenNumberGreaterThanOrEqualTo(50) .setFontColor("#1976D2") .setRanges([sheet.getRange("E2:E100")]) .build(); // 단가 30000 이상 - 굵은 글씨 var priceRule = SpreadsheetApp.newConditionalFormatRule() .whenNumberGreaterThanOrEqualTo(30000) .setBold(true) .setRanges([sheet.getRange("F2:F100")]) .build(); // 조건부 서식 규칙 적용 var rules = sheet.getConditionalFormatRules(); rules.push(topRule, bottomRule, quantityRule, priceRule); sheet.setConditionalFormatRules(rules); // 결과 확인 메시지 var ui = SpreadsheetApp.getUi(); var message = "데이터 검증 및 조건부 서식 적용 완료!\n\n" + "적용된 규칙:\n" + "✓ 지역: 드롭다운 목록\n" + "✓ 수량: 1~1000 범위 검증\n" + "✓ 단가: 1,000~100,000 범위 검증\n" + "✓ 매출액 상위 10%: 녹색 배경\n" + "✓ 매출액 하위 10%: 빨간색 배경\n" + "✓ 수량 50 이상: 파란색 글자\n" + "✓ 단가 30,000 이상: 굵은 글씨"; ui.alert("적용 완료", message, ui.ButtonSet.OK); }
5단계: 종합 실습 과제
과제 1: 스마트 대시보드 생성기
ChatGPT에게 요청할 과제:
지금까지 배운 모든 기능을 종합하여 "스마트 매출 대시보드"를 만드는 Google Apps Script를 작성해주세요: 통합 기능: 1. 테스트 데이터 자동 생성 (1000행) 2. 실시간 데이터 분석 (지역별, 월별, 상품별) 3. 동적 차트 생성 (파이, 선형, 막대차트) 4. 핵심 KPI 자동 계산 (평균, 증감률, 상위실적자) 5. 이상 데이터 자동 감지 및 알림 6. 원클릭 보고서 생성 및 이메일 발송 7. 사용자 친화적 메뉴 시스템 실행 시간 최적화와 에러 처리도 포함해주세요.
과제 2: 실시간 모니터링 시스템
도전 과제:
매출 데이터가 업데이트될 때마다 자동으로 분석하고 특정 조건에서 알림을 보내는 시스템을 만들어주세요: 트리거 기능: 1. 새 데이터 입력 시 자동 분석 실행 2. 일일 매출이 목표치 미달 시 알림 3. 주간 매출 보고서 자동 생성 (매주 월요일) 4. 이상 패턴 감지 시 즉시 알림 사용할 트리거: - onEdit (데이터 편집 시) - 시간 기반 트리거 (정기 실행) - 이메일 트리거 (외부 데이터 수신 시)
Chapter 3: Google Forms 연동 자동화
학습 목표
  • Google Forms를 프로그래밍으로 생성하고 관리할 수 있다
  • 폼 응답을 실시간으로 처리하고 분석할 수 있다
  • 응답자에게 자동 피드백 이메일을 발송할 수 있다
  • 다단계 설문조사와 조건부 로직을 구현할 수 있다
1단계: 프로그래밍으로 Google Forms 생성하기
1.1 기본 설문조사 폼 자동 생성
ChatGPT 프롬프트:
Google Apps Script로 고객 만족도 설문조사 폼을 자동 생성하는 코드를 만들어주세요: 폼 구성: 1. 폼 제목: "2024 고객 만족도 조사" 2. 설명: "소중한 의견을 들려주세요. 설문에는 약 5분이 소요됩니다." 질문 구성: 1. 이름 (단답형, 필수) 2. 이메일 (이메일 형식, 필수) 3. 나이대 (객관식: 20대, 30대, 40대, 50대 이상) 4. 이용 서비스 (체크박스: 웹사이트, 모바일앱, 고객지원, 배송서비스) 5. 만족도 (선형배율: 1~5점, 1=매우불만족, 5=매우만족) 6. 개선사항 (장문형, 선택사항) 7. 추천의향 (객관식: 매우 그렇다, 그렇다, 보통, 아니다, 전혀 아니다) 추가 설정: - 응답자가 답변을 수정할 수 있도록 설정 - 응답 후 확인 메시지 표시 - 응답 데이터는 Google Sheets에 자동 저장
1.2 예상 응답 및 구현
function createCustomerSurveyForm() { try { // 새 폼 생성 var form = FormApp.create('2024 고객 만족도 조사'); // 폼 설명 설정 form.setDescription('소중한 의견을 들려주세요. 설문에는 약 5분이 소요됩니다.'); // 응답자가 답변을 수정할 수 있도록 설정 form.setAllowResponseEdits(true); // 응답 후 확인 메시지 설정 form.setConfirmationMessage('설문에 참여해 주셔서 감사합니다! 귀하의 소중한 의견은 서비스 개선에 반영될 예정입니다.'); // 1. 이름 (단답형, 필수) var nameItem = form.addTextItem(); nameItem.setTitle('이름') .setHelpText('실명을 입력해주세요') .setRequired(true); // 2. 이메일 (이메일 형식, 필수) var emailItem = form.addTextItem(); emailItem.setTitle('이메일 주소') .setHelpText('결과 안내를 위한 이메일 주소를 입력해주세요') .setRequired(true); // 이메일 검증 추가 var emailValidation = FormApp.createTextValidation() .requireTextIsEmail() .setHelpText('올바른 이메일 형식으로 입력해주세요 (예: example@email.com)') .build(); emailItem.setValidation(emailValidation); // 3. 나이대 (객관식) var ageItem = form.addMultipleChoiceItem(); ageItem.setTitle('나이대') .setChoices([ ageItem.createChoice('20대'), ageItem.createChoice('30대'), ageItem.createChoice('40대'), ageItem.createChoice('50대 이상') ]) .setRequired(true); // 4. 이용 서비스 (체크박스) var serviceItem = form.addCheckboxItem(); serviceItem.setTitle('현재 이용하고 계신 서비스를 모두 선택해주세요') .setChoices([ serviceItem.createChoice('웹사이트'), serviceItem.createChoice('모바일 앱'), serviceItem.createChoice('고객지원'), serviceItem.createChoice('배송서비스') ]) .setRequired(true); // 5. 만족도 (선형배율) var satisfactionItem = form.addScaleItem(); satisfactionItem.setTitle('전반적인 서비스 만족도를 평가해주세요') .setBounds(1, 5) .setLabels('매우 불만족', '매우 만족') .setRequired(true); // 6. 개선사항 (장문형, 선택사항) var improvementItem = form.addParagraphTextItem(); improvementItem.setTitle('서비스 개선을 위한 제안사항') .setHelpText('개선이 필요한 부분이나 추가 요청사항을 자유롭게 작성해주세요') .setRequired(false); // 7. 추천의향 (객관식) var recommendItem = form.addMultipleChoiceItem(); recommendItem.setTitle('우리 서비스를 다른 사람에게 추천하시겠습니까?') .setChoices([ recommendItem.createChoice('매우 그렇다'), recommendItem.createChoice('그렇다'), recommendItem.createChoice('보통이다'), recommendItem.createChoice('아니다'), recommendItem.createChoice('전혀 아니다') ]) .setRequired(true); // 응답을 Google Sheets에 저장하도록 설정 var spreadsheet = SpreadsheetApp.create('고객만족도조사_응답데이터_' + Utilities.formatDate(new Date(), 'Asia/Seoul', 'yyyyMMdd')); form.setDestination(FormApp.DestinationType.SPREADSHEET, spreadsheet.getId()); // 폼 URL과 스프레드시트 URL 가져오기 var formUrl = form.getPublishedUrl(); var spreadsheetUrl = spreadsheet.getUrl(); // 결과 안내 var ui = SpreadsheetApp.getUi(); var message = '고객 만족도 설문조사 폼이 생성되었습니다!\n\n' + '폼 URL: ' + formUrl + '\n\n' + '응답 데이터 시트: ' + spreadsheetUrl + '\n\n' + '폼을 공유하여 응답을 수집하세요.'; ui.alert('폼 생성 완료', message, ui.ButtonSet.OK); // 생성된 정보를 로그에도 기록 Logger.log('폼 생성 완료'); Logger.log('폼 URL: ' + formUrl); Logger.log('스프레드시트 URL: ' + spreadsheetUrl); return { formUrl: formUrl, spreadsheetUrl: spreadsheetUrl, formId: form.getId(), spreadsheetId: spreadsheet.getId() }; } catch (error) { Logger.log('폼 생성 중 오류 발생: ' + error.toString()); SpreadsheetApp.getUi().alert('오류 발생', '폼 생성 중 오류가 발생했습니다: ' + error.message, SpreadsheetApp.getUi().ButtonSet.OK); } }
2단계: 응답 실시간 처리 시스템
2.1 폼 응답 자동 처리 및 분석
ChatGPT 프롬프트:
방금 생성한 설문조사 폼의 응답을 실시간으로 처리하는 시스템을 만들어주세요: 실시간 처리 기능: 1. 새 응답이 제출될 때마다 자동 실행 (onFormSubmit 트리거) 2. 응답 데이터 검증 및 정리 3. 응답 통계 자동 업데이트 (별도 시트에) 4. 만족도 점수별 자동 분류 5. 이상 응답 감지 (예: 동일 이메일 중복 응답) 6. 실시간 대시보드 업데이트 통계 항목: - 총 응답 수 - 나이대별 분포 - 평균 만족도 점수 - 서비스별 이용률 - 추천의향 분포 - 시간대별 응답 패턴 응답자에게는 즉시 확인 이메일도 발송해주세요.
2.2 실시간 응답 처리 시스템
3단계: 조건부 질문과 고급 폼 로직
3.1 다단계 설문조사 생성
ChatGPT 프롬프트:
복잡한 조건부 로직을 가진 다단계 설문조사를 생성하는 Google Apps Script를 만들어주세요: 설문 시나리오: "제품 사용 경험 조사" 1단계: 기본 정보 - 제품 사용 경험 (예/아니오) 2단계: 조건부 분기 - 사용 경험이 "예"인 경우: - 사용 기간 (1개월 미만, 1-6개월, 6개월-1년, 1년 이상) - 사용 빈도 (매일, 주 2-3회, 주 1회, 월 1회) - 만족도 평가 (1-5점 척도) - 재구매 의향 (예/아니오) - 사용 경험이 "아니오"인 경우: - 미사용 이유 (가격, 필요성 부족, 인지 부족, 기타) - 향후 구매 의향 (매우 높음, 높음, 보통, 낮음, 매우 낮음) - 구매 고려 요소 (가격, 품질, 브랜드, 추천) 3단계: 공통 질문 - 연령대, 성별, 직업 - 추가 의견 (자유 응답) 폼의 조건부 로직과 섹션 분리를 구현해주세요.
3.2 조건부 로직 구현 코드
function createConditionalSurveyForm() { try { var form = FormApp.create('제품 사용 경험 조사 - 조건부 설문'); form.setDescription('귀하의 제품 사용 경험에 따라 맞춤형 질문이 제공됩니다. 솔직한 답변 부탁드립니다.'); // 섹션 1: 기본 정보 var section1 = form.addPageBreakItem() .setTitle('기본 정보') .setHelpText('먼저 기본적인 정보를 확인하겠습니다.'); // 제품 사용 경험 (핵심 분기점) var experienceItem = form.addMultipleChoiceItem(); experienceItem.setTitle('저희 제품을 사용해보신 경험이 있으신가요?') .setRequired(true); // 섹션 2A: 사용 경험자용 (예) var section2A = form.addPageBreakItem() .setTitle('사용 경험자 설문') .setHelpText('제품 사용 경험에 대해 자세히 알려주세요.'); // 사용 기간 var usagePeriodItem = form.addMultipleChoiceItem(); usagePeriodItem.setTitle('제품을 얼마나 오래 사용하셨나요?') .setChoices([ usagePeriodItem.createChoice('1개월 미만'), usagePeriodItem.createChoice('1-6개월'), usagePeriodItem.createChoice('6개월-1년'), usagePeriodItem.createChoice('1년 이상') ]) .setRequired(true); // 사용 빈도 var frequencyItem = form.addMultipleChoiceItem(); frequencyItem.setTitle('제품을 얼마나 자주 사용하시나요?') .setChoices([ frequencyItem.createChoice('매일'), frequencyItem.createChoice('주 2-3회'), frequencyItem.createChoice('주 1회'), frequencyItem.createChoice('월 1회 이하') ]) .setRequired(true); // 만족도 평가 var satisfactionItem = form.addScaleItem(); satisfactionItem.setTitle('제품에 대한 전반적인 만족도를 평가해주세요') .setBounds(1, 5) .setLabels('매우 불만족', '매우 만족') .setRequired(true); // 재구매 의향 var repurchaseItem = form.addMultipleChoiceItem(); repurchaseItem.setTitle('이 제품을 다시 구매하실 의향이 있으신가요?') .setChoices([ repurchaseItem.createChoice('예, 확실히 구매하겠습니다'), repurchaseItem.createChoice('아마도 구매할 것 같습니다'), repurchaseItem.createChoice('잘 모르겠습니다'), repurchaseItem.createChoice('아마도 구매하지 않을 것 같습니다'), repurchaseItem.createChoice('아니요, 구매하지 않겠습니다') ]) .setRequired(true); // 섹션 2B: 미사용자용 (아니오) var section2B = form.addPageBreakItem() .setTitle('미사용자 설문') .setHelpText('제품을 사용하지 않으신 이유와 향후 의향을 알려주세요.'); // 미사용 이유 var reasonItem = form.addCheckboxItem(); reasonItem.setTitle('제품을 사용하지 않으신 주된 이유는 무엇인가요? (복수 선택 가능)') .setChoices([ reasonItem.createChoice('가격이 부담스러워서'), reasonItem.createChoice('필요성을 느끼지 못해서'), reasonItem.createChoice('제품에 대해 잘 몰라서'), reasonItem.createChoice('다른 제품을 사용하고 있어서'), reasonItem.createChoice('품질에 대한 의구심'), reasonItem.createChoice('기타') ]) .setRequired(true); // 향후 구매 의향 var futureIntentItem = form.addMultipleChoiceItem(); futureIntentItem.setTitle('향후 이 제품을 구매할 의향이 어느 정도이신가요?') .setChoices([ futureIntentItem.createChoice('매우 높음'), futureIntentItem.createChoice('높음'), futureIntentItem.createChoice('보통'), futureIntentItem.createChoice('낮음'), futureIntentItem.createChoice('매우 낮음') ]) .setRequired(true); // 구매 고려 요소 var considerationItem = form.addCheckboxItem(); considerationItem.setTitle('제품 구매 시 가장 중요하게 고려하는 요소는 무엇인가요? (복수 선택 가능)') .setChoices([ considerationItem.createChoice('가격'), considerationItem.createChoice('품질'), considerationItem.createChoice('브랜드 신뢰도'), considerationItem.createChoice('지인 추천'), considerationItem.createChoice('온라인 리뷰'), considerationItem.createChoice('A/S 서비스'), considerationItem.createChoice('디자인') ]) .setRequired(true); // 섹션 3: 공통 질문 var section3 = form.addPageBreakItem() .setTitle('개인 정보') .setHelpText('마지막으로 통계 분석을 위한 기본 정보를 알려주세요.'); // 연령대 var ageItem = form.addMultipleChoiceItem(); ageItem.setTitle('연령대') .setChoices([ ageItem.createChoice('20대'), ageItem.createChoice('30대'), ageItem.createChoice('40대'), ageItem.createChoice('50대'), ageItem.createChoice('60대 이상') ]) .setRequired(true); // 성별 var genderItem = form.addMultipleChoiceItem(); genderItem.setTitle('성별') .setChoices([ genderItem.createChoice('남성'), genderItem.createChoice('여성'), genderItem.createChoice('기타'), genderItem.createChoice('응답하지 않음') ]) .setRequired(true); // 직업 var jobItem = form.addMultipleChoiceItem(); jobItem.setTitle('직업') .setChoices([ jobItem.createChoice('학생'), jobItem.createChoice('회사원'), jobItem.createChoice('공무원'), jobItem.createChoice('자영업'), jobItem.createChoice('전문직'), jobItem.createChoice('주부'), jobItem.createChoice('기타') ]) .setRequired(true); // 추가 의견 var additionalItem = form.addParagraphTextItem(); additionalItem.setTitle('추가 의견이나 제안사항') .setHelpText('제품이나 설문에 대한 추가 의견이 있으시면 자유롭게 작성해주세요') .setRequired(false); // 조건부 로직 설정 setupConditionalLogic(form, experienceItem, section2A, section2B, section3); // 응답 저장 설정 var spreadsheet = SpreadsheetApp.create('제품사용경험조사_' + Utilities.formatDate(new Date(), 'Asia/Seoul', 'yyyyMMdd_HHmmss')); form.setDestination(FormApp.DestinationType.SPREADSHEET, spreadsheet.getId()); // 결과 안내 var formUrl = form.getPublishedUrl(); var spreadsheetUrl = spreadsheet.getUrl(); SpreadsheetApp.getUi().alert( '조건부 설문조사 생성 완료!', '폼 URL: ' + formUrl + '\n\n' + '응답 데이터: ' + spreadsheetUrl + '\n\n' + '사용 경험에 따라 다른 질문이 표시됩니다.', SpreadsheetApp.getUi().ButtonSet.OK ); return { formUrl: formUrl, spreadsheetUrl: spreadsheetUrl }; } catch (error) { Logger.log('조건부 폼 생성 오류: ' + error.toString()); SpreadsheetApp.getUi().alert('오류', '폼 생성 중 오류가 발생했습니다: ' + error.message, SpreadsheetApp.getUi().ButtonSet.OK); } } function setupConditionalLogic(form, experienceItem, section2A, section2B, section3) { // "예" 선택 시 사용 경험자 섹션으로 이동 var yesChoice = experienceItem.createChoice('예', FormApp.PageNavigationType.GO_TO_PAGE, section2A); // "아니오" 선택 시 미사용자 섹션으로 이동 var noChoice = experienceItem.createChoice('아니오', FormApp.PageNavigationType.GO_TO_PAGE, section2B); experienceItem.setChoices([yesChoice, noChoice]); // 각 섹션의 마지막에서 공통 질문 섹션으로 이동 section2A.setGoToPage(FormApp.PageNavigationType.GO_TO_PAGE, section3); section2B.setGoToPage(FormApp.PageNavigationType.GO_TO_PAGE, section3); }
Chapter 4: Google Docs 자동화 마스터
학습 목표
  • Google Docs를 프로그래밍으로 생성하고 편집할 수 있다
  • 템플릿 기반 문서 자동 생성 시스템을 구축할 수 있다
  • 문서 내용을 동적으로 변경하고 서식을 적용할 수 있다
  • 여러 데이터 소스를 결합하여 보고서를 자동 생성할 수 있다
1단계: 프로그래밍으로 Google Docs 생성하기
1.1 기본 문서 자동 생성
ChatGPT 프롬프트:
Google Apps Script로 회사 업무 보고서 템플릿을 자동 생성하는 코드를 만들어주세요: 문서 구성: 1. 제목: "주간 업무 보고서 - [현재 날짜]" 2. 부제목: 작성자, 작성일, 보고 기간 3. 본문 섹션: - 주요 성과 - 진행 중인 업무 - 다음 주 계획 - 건의사항 4. 각 섹션은 번호가 매겨진 목록으로 구성 5. 문서 하단에 서명란 추가 서식 요구사항: - 제목: 18pt, 굵게, 가운데 정렬 - 부제목: 12pt, 기울임 - 섹션 제목: 14pt, 굵게 - 본문: 11pt, 줄 간격 1.5 - 페이지 여백: 상하좌우 2.5cm
예상 응답:
function createWeeklyReportTemplate() { try { // 현재 날짜 정보 var today = new Date(); var dateStr = Utilities.formatDate(today, 'Asia/Seoul', 'yyyy년 MM월 dd일'); // 새 문서 생성 var doc = DocumentApp.create('주간 업무 보고서 - ' + dateStr); var body = doc.getBody(); // 페이지 설정 (여백: 2.5cm = 70.8pt) var style = {}; style[DocumentApp.Attribute.MARGIN_TOP] = 70.8; style[DocumentApp.Attribute.MARGIN_BOTTOM] = 70.8; style[DocumentApp.Attribute.MARGIN_LEFT] = 70.8; style[DocumentApp.Attribute.MARGIN_RIGHT] = 70.8; body.setAttributes(style); // 제목 추가 var title = body.appendParagraph('주간 업무 보고서'); title.setHeading(DocumentApp.ParagraphHeading.TITLE); var titleStyle = {}; titleStyle[DocumentApp.Attribute.FONT_SIZE] = 18; titleStyle[DocumentApp.Attribute.BOLD] = true; titleStyle[DocumentApp.Attribute.HORIZONTAL_ALIGNMENT] = DocumentApp.HorizontalAlignment.CENTER; title.setAttributes(titleStyle); // 빈 줄 추가 body.appendParagraph(''); // 부제목 정보 var subtitle = body.appendParagraph('작성자: [이름 입력]\n작성일: ' + dateStr + '\n보고 기간: [기간 입력]'); var subtitleStyle = {}; subtitleStyle[DocumentApp.Attribute.FONT_SIZE] = 12; subtitleStyle[DocumentApp.Attribute.ITALIC] = true; subtitleStyle[DocumentApp.Attribute.HORIZONTAL_ALIGNMENT] = DocumentApp.HorizontalAlignment.CENTER; subtitle.setAttributes(subtitleStyle); // 구분선 추가 body.appendHorizontalRule(); body.appendParagraph(''); // 섹션 1: 주요 성과 var section1 = body.appendParagraph('1. 주요 성과'); var sectionStyle = {}; sectionStyle[DocumentApp.Attribute.FONT_SIZE] = 14; sectionStyle[DocumentApp.Attribute.BOLD] = true; section1.setAttributes(sectionStyle); // 성과 목록 for (var i = 1; i <= 3; i++) { var item = body.appendListItem('성과 ' + i + ': [내용 입력]'); item.setGlyphType(DocumentApp.GlyphType.NUMBER); item.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 11}); } body.appendParagraph(''); // 섹션 2: 진행 중인 업무 var section2 = body.appendParagraph('2. 진행 중인 업무'); section2.setAttributes(sectionStyle); for (var i = 1; i <= 3; i++) { var item = body.appendListItem('업무 ' + i + ': [내용 입력]'); item.setGlyphType(DocumentApp.GlyphType.NUMBER); item.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 11}); } body.appendParagraph(''); // 섹션 3: 다음 주 계획 var section3 = body.appendParagraph('3. 다음 주 계획'); section3.setAttributes(sectionStyle); for (var i = 1; i <= 3; i++) { var item = body.appendListItem('계획 ' + i + ': [내용 입력]'); item.setGlyphType(DocumentApp.GlyphType.NUMBER); item.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 11}); } body.appendParagraph(''); // 섹션 4: 건의사항 var section4 = body.appendParagraph('4. 건의사항'); section4.setAttributes(sectionStyle); var suggestion = body.appendParagraph('[건의사항이 있는 경우 작성]'); suggestion.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 11}); // 서명란 body.appendParagraph(''); body.appendParagraph(''); var signature = body.appendParagraph('작성자 서명: _________________ 날짜: _________________'); signature.setAttributes({ [DocumentApp.Attribute.FONT_SIZE]: 11, [DocumentApp.Attribute.HORIZONTAL_ALIGNMENT]: DocumentApp.HorizontalAlignment.RIGHT }); // 줄 간격 설정 var paragraphs = body.getParagraphs(); paragraphs.forEach(function(paragraph) { paragraph.setLineSpacing(1.5); }); // 문서 URL 반환 var docUrl = doc.getUrl(); // 완료 로그 Logger.log('문서 생성 완료: ' + docUrl); // UI 알림 (가능한 경우에만) try { SpreadsheetApp.getUi().alert( '문서 생성 완료!', '주간 업무 보고서 템플릿이 생성되었습니다.\n\n문서 URL: ' + docUrl, SpreadsheetApp.getUi().ButtonSet.OK ); } catch (uiError) { Logger.log('UI 알림을 표시할 수 없습니다. 문서 URL: ' + docUrl); } return docUrl; } catch (error) { Logger.log('문서 생성 오류: ' + error.toString()); // UI 오류 처리도 try-catch로 감싸기 try { SpreadsheetApp.getUi().alert('오류', '문서 생성 중 오류가 발생했습니다: ' + error.message, SpreadsheetApp.getUi().ButtonSet.OK); } catch (uiError) { Logger.log('UI 오류 메시지를 표시할 수 없습니다. 오류: ' + error.message); } throw error; } } // 독립형 스크립트용 버전 (UI 없음) function createWeeklyReportTemplateStandalone() { try { // 현재 날짜 정보 var today = new Date(); var dateStr = Utilities.formatDate(today, 'Asia/Seoul', 'yyyy년 MM월 dd일'); // 새 문서 생성 var doc = DocumentApp.create('주간 업무 보고서 - ' + dateStr); var body = doc.getBody(); // 페이지 설정 (여백: 2.5cm = 70.8pt) var style = {}; style[DocumentApp.Attribute.MARGIN_TOP] = 70.8; style[DocumentApp.Attribute.MARGIN_BOTTOM] = 70.8; style[DocumentApp.Attribute.MARGIN_LEFT] = 70.8; style[DocumentApp.Attribute.MARGIN_RIGHT] = 70.8; body.setAttributes(style); // 제목 추가 var title = body.appendParagraph('주간 업무 보고서'); title.setHeading(DocumentApp.ParagraphHeading.TITLE); var titleStyle = {}; titleStyle[DocumentApp.Attribute.FONT_SIZE] = 18; titleStyle[DocumentApp.Attribute.BOLD] = true; titleStyle[DocumentApp.Attribute.HORIZONTAL_ALIGNMENT] = DocumentApp.HorizontalAlignment.CENTER; title.setAttributes(titleStyle); // 빈 줄 추가 body.appendParagraph(''); // 부제목 정보 var subtitle = body.appendParagraph('작성자: [이름 입력]\n작성일: ' + dateStr + '\n보고 기간: [기간 입력]'); var subtitleStyle = {}; subtitleStyle[DocumentApp.Attribute.FONT_SIZE] = 12; subtitleStyle[DocumentApp.Attribute.ITALIC] = true; subtitleStyle[DocumentApp.Attribute.HORIZONTAL_ALIGNMENT] = DocumentApp.HorizontalAlignment.CENTER; subtitle.setAttributes(subtitleStyle); // 구분선 추가 body.appendHorizontalRule(); body.appendParagraph(''); // 섹션 1: 주요 성과 var section1 = body.appendParagraph('1. 주요 성과'); var sectionStyle = {}; sectionStyle[DocumentApp.Attribute.FONT_SIZE] = 14; sectionStyle[DocumentApp.Attribute.BOLD] = true; section1.setAttributes(sectionStyle); // 성과 목록 for (var i = 1; i <= 3; i++) { var item = body.appendListItem('성과 ' + i + ': [내용 입력]'); item.setGlyphType(DocumentApp.GlyphType.NUMBER); item.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 11}); } body.appendParagraph(''); // 섹션 2: 진행 중인 업무 var section2 = body.appendParagraph('2. 진행 중인 업무'); section2.setAttributes(sectionStyle); for (var i = 1; i <= 3; i++) { var item = body.appendListItem('업무 ' + i + ': [내용 입력]'); item.setGlyphType(DocumentApp.GlyphType.NUMBER); item.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 11}); } body.appendParagraph(''); // 섹션 3: 다음 주 계획 var section3 = body.appendParagraph('3. 다음 주 계획'); section3.setAttributes(sectionStyle); for (var i = 1; i <= 3; i++) { var item = body.appendListItem('계획 ' + i + ': [내용 입력]'); item.setGlyphType(DocumentApp.GlyphType.NUMBER); item.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 11}); } body.appendParagraph(''); // 섹션 4: 건의사항 var section4 = body.appendParagraph('4. 건의사항'); section4.setAttributes(sectionStyle); var suggestion = body.appendParagraph('[건의사항이 있는 경우 작성]'); suggestion.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 11}); // 서명란 body.appendParagraph(''); body.appendParagraph(''); var signature = body.appendParagraph('작성자 서명: _________________ 날짜: _________________'); signature.setAttributes({ [DocumentApp.Attribute.FONT_SIZE]: 11, [DocumentApp.Attribute.HORIZONTAL_ALIGNMENT]: DocumentApp.HorizontalAlignment.RIGHT }); // 줄 간격 설정 var paragraphs = body.getParagraphs(); paragraphs.forEach(function(paragraph) { paragraph.setLineSpacing(1.5); }); // 문서 URL 반환 var docUrl = doc.getUrl(); // 완료 로그 Logger.log('문서 생성 완료: ' + docUrl); console.log('문서 URL: ' + docUrl); return docUrl; } catch (error) { Logger.log('문서 생성 오류: ' + error.toString()); console.error('문서 생성 오류: ' + error.toString()); throw error; } } // 맞춤형 주간 보고서 생성 함수 (더 상세한 템플릿) function createDetailedWeeklyReport() { try { var today = new Date(); var dateStr = Utilities.formatDate(today, 'Asia/Seoul', 'yyyy년 MM월 dd일'); var doc = DocumentApp.create('상세 주간 업무 보고서 - ' + dateStr); var body = doc.getBody(); // 페이지 설정 var style = {}; style[DocumentApp.Attribute.MARGIN_TOP] = 70.8; style[DocumentApp.Attribute.MARGIN_BOTTOM] = 70.8; style[DocumentApp.Attribute.MARGIN_LEFT] = 70.8; style[DocumentApp.Attribute.MARGIN_RIGHT] = 70.8; body.setAttributes(style); // 제목 var title = body.appendParagraph('주간 업무 보고서'); title.setHeading(DocumentApp.ParagraphHeading.TITLE); title.setAttributes({ [DocumentApp.Attribute.FONT_SIZE]: 20, [DocumentApp.Attribute.BOLD]: true, [DocumentApp.Attribute.HORIZONTAL_ALIGNMENT]: DocumentApp.HorizontalAlignment.CENTER }); body.appendParagraph(''); // 기본 정보 테이블 var infoTable = body.appendTable(); infoTable.appendTableRow().appendTableCell('작성자').appendTableCell('[이름 입력]'); infoTable.appendTableRow().appendTableCell('부서/팀').appendTableCell('[부서명 입력]'); infoTable.appendTableRow().appendTableCell('작성일').appendTableCell(dateStr); infoTable.appendTableRow().appendTableCell('보고 기간').appendTableCell('[시작일 ~ 종료일]'); // 테이블 스타일 설정 infoTable.setBorderWidth(1); for (var i = 0; i < infoTable.getNumRows(); i++) { var row = infoTable.getRow(i); row.getCell(0).setAttributes({ [DocumentApp.Attribute.BOLD]: true, [DocumentApp.Attribute.BACKGROUND_COLOR]: '#F0F0F0' }); } body.appendParagraph(''); body.appendHorizontalRule(); body.appendParagraph(''); // 섹션별 내용 var sections = [ { title: '1. 주요 성과 및 완료 업무', items: [ '주요 프로젝트 완료 현황', '목표 달성률 및 성과 지표', '고객/상사로부터 받은 긍정적 피드백' ] }, { title: '2. 진행 중인 업무 현황', items: [ '현재 진행률 및 예상 완료일', '직면한 과제 및 해결 방안', '필요한 지원사항' ] }, { title: '3. 다음 주 계획 및 목표', items: [ '우선순위별 업무 계획', '예상 결과물 및 마일스톤', '새로운 업무 시작 예정' ] }, { title: '4. 이슈 및 건의사항', items: [ '업무 진행 중 발생한 문제점', '개선이 필요한 프로세스', '추가 리소스 요청사항' ] } ]; sections.forEach(function(section) { // 섹션 제목 var sectionTitle = body.appendParagraph(section.title); sectionTitle.setAttributes({ [DocumentApp.Attribute.FONT_SIZE]: 14, [DocumentApp.Attribute.BOLD]: true, [DocumentApp.Attribute.FOREGROUND_COLOR]: '#1a73e8' }); // 항목별 내용 section.items.forEach(function(item, index) { var listItem = body.appendListItem('(' + item + ')'); listItem.setGlyphType(DocumentApp.GlyphType.BULLET); listItem.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 11}); // 내용 입력 공간 body.appendParagraph(' └ [구체적인 내용을 입력하세요]').setAttributes({ [DocumentApp.Attribute.FONT_SIZE]: 10, [DocumentApp.Attribute.ITALIC]: true, [DocumentApp.Attribute.FOREGROUND_COLOR]: '#666666' }); }); body.appendParagraph(''); }); // 서명 및 승인란 body.appendParagraph(''); body.appendHorizontalRule(); body.appendParagraph(''); var signatureTable = body.appendTable(); var signRow1 = signatureTable.appendTableRow(); signRow1.appendTableCell('작성자').appendTableCell('확인자 (팀장)').appendTableCell('승인자 (부서장)'); var signRow2 = signatureTable.appendTableRow(); signRow2.appendTableCell('\n\n서명: ___________\n날짜: ___________'); signRow2.appendTableCell('\n\n서명: ___________\n날짜: ___________'); signRow2.appendTableCell('\n\n서명: ___________\n날짜: ___________'); signatureTable.setBorderWidth(1); // 줄 간격 설정 var paragraphs = body.getParagraphs(); paragraphs.forEach(function(paragraph) { paragraph.setLineSpacing(1.4); }); var docUrl = doc.getUrl(); Logger.log('상세 문서 생성 완료: ' + docUrl); console.log('상세 문서 URL: ' + docUrl); return docUrl; } catch (error) { Logger.log('상세 문서 생성 오류: ' + error.toString()); console.error('상세 문서 생성 오류: ' + error.toString()); throw error; } }
2단계: 실용적인 실습 과제
과제 1: 회의록 자동 생성 시스템
ChatGPT 프롬프트:
Google Apps Script로 회의 정보를 입력받아 표준화된 회의록을 자동 생성하는 시스템을 만들어주세요: 입력 정보: - 회의명, 일시, 장소, 참석자, 안건 회의록 구성: 1. 회의 기본 정보 2. 참석자 목록 3. 안건별 논의 내용 및 결론 4. 액션 아이템 (담당자, 마감일) 5. 다음 회의 일정 특별 기능: - 참석자에게 자동 이메일 발송 - 액션 아이템을 캘린더에 자동 등록 - 회의록을 팀 드라이브에 자동 저장
Chapter 5: Google Slides 프레젠테이션 자동화
학습 목표
  • Google Slides를 프로그래밍으로 생성하고 편집할 수 있다
  • 데이터 기반 프레젠테이션을 자동 생성할 수 있다
  • 차트와 이미지를 동적으로 삽입할 수 있다
  • 템플릿 기반 대량 프레젠테이션 생성 시스템을 구축할 수 있다
1단계: 프로그래밍으로 Google Slides 생성하기
1.1 기본 프레젠테이션 자동 생성
ChatGPT 프롬프트:
Google Apps Script로 회사 소개 프레젠테이션을 자동 생성하는 코드를 만들어주세요: 슬라이드 구성: 1. 제목 슬라이드 (회사명, 로고, 날짜) 2. 회사 개요 (설립연도, 비전, 미션) 3. 주요 서비스 (3-4개 서비스, 각각 이미지와 설명) 4. 팀 소개 (구성원별 사진과 역할) 5. 연락처 정보 디자인 요구사항: - 전문적인 테마 적용 - 일관된 폰트와 색상 사용 - 각 슬라이드마다 적절한 레이아웃 적용 - 애니메이션 효과 추가 - 회사 로고를 모든 슬라이드에 워터마크로 삽입
1.2 예상 응답
function createCompanyPresentation() { try { // 새 프레젠테이션 생성 var presentation = SlidesApp.create('회사 소개 프레젠테이션 - ' + Utilities.formatDate(new Date(), 'Asia/Seoul', 'yyyy.MM.dd')); // 기본 설정 var slides = presentation.getSlides(); var firstSlide = slides[0]; // 기본 생성되는 슬라이드 // 테마 및 색상 설정 var brandColor = '#1E88E5'; // 회사 브랜드 색상 var textColor = '#333333'; var accentColor = '#FFC107'; // 1. 제목 슬라이드 생성 createTitleSlide(firstSlide, brandColor); // 2. 회사 개요 슬라이드 var overviewSlide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); createOverviewSlide(overviewSlide, brandColor, textColor); // 3. 주요 서비스 슬라이드들 var serviceSlide1 = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); var serviceSlide2 = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); createServiceSlides(serviceSlide1, serviceSlide2, brandColor); // 4. 팀 소개 슬라이드 var teamSlide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); createTeamSlide(teamSlide, brandColor); // 5. 연락처 슬라이드 var contactSlide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); createContactSlide(contactSlide, brandColor); // 프레젠테이션 URL 가져오기 var presentationUrl = presentation.getUrl(); // 완료 로그 Logger.log('프레젠테이션 생성 완료! URL: ' + presentationUrl); // UI 알림 (가능한 경우에만) try { SpreadsheetApp.getUi().alert( '프레젠테이션 생성 완료!', '회사 소개 프레젠테이션이 생성되었습니다.\n\n' + 'URL: ' + presentationUrl, SpreadsheetApp.getUi().ButtonSet.OK ); } catch (uiError) { Logger.log('UI 알림을 표시할 수 없습니다. 프레젠테이션 URL: ' + presentationUrl); } return presentationUrl; } catch (error) { Logger.log('프레젠테이션 생성 오류: ' + error.toString()); try { SpreadsheetApp.getUi().alert('오류', '프레젠테이션 생성 중 오류가 발생했습니다: ' + error.message, SpreadsheetApp.getUi().ButtonSet.OK); } catch (uiError) { Logger.log('UI 오류 메시지를 표시할 수 없습니다. 오류: ' + error.message); } throw error; } } // 독립형 스크립트용 버전 (UI 없음) function createCompanyPresentationStandalone() { try { // 새 프레젠테이션 생성 var presentation = SlidesApp.create('회사 소개 프레젠테이션 - ' + Utilities.formatDate(new Date(), 'Asia/Seoul', 'yyyy.MM.dd')); // 기본 설정 var slides = presentation.getSlides(); var firstSlide = slides[0]; // 테마 및 색상 설정 var brandColor = '#1E88E5'; var textColor = '#333333'; var accentColor = '#FFC107'; // 슬라이드 생성 createTitleSlide(firstSlide, brandColor); var overviewSlide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); createOverviewSlide(overviewSlide, brandColor, textColor); var serviceSlide1 = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); var serviceSlide2 = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); createServiceSlides(serviceSlide1, serviceSlide2, brandColor); var teamSlide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); createTeamSlide(teamSlide, brandColor); var contactSlide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); createContactSlide(contactSlide, brandColor); var presentationUrl = presentation.getUrl(); Logger.log('프레젠테이션 생성 완료! URL: ' + presentationUrl); console.log('프레젠테이션 URL: ' + presentationUrl); return presentationUrl; } catch (error) { Logger.log('프레젠테이션 생성 오류: ' + error.toString()); console.error('프레젠테이션 생성 오류: ' + error.toString()); throw error; } } function createTitleSlide(slide, brandColor) { // 기존 요소 제거 var elements = slide.getPageElements(); elements.forEach(function(element) { element.remove(); }); // 배경색 설정 slide.getBackground().setSolidFill(brandColor); // 회사명 제목 var titleBox = slide.insertTextBox('우리 회사', 50, 150, 600, 100); var titleText = titleBox.getText(); titleText.getTextStyle() .setFontSize(48) .setBold(true) .setForegroundColor('#FFFFFF'); titleText.getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER); // 부제목 var subtitleBox = slide.insertTextBox('혁신적인 솔루션으로 미래를 만들어갑니다', 100, 280, 500, 50); var subtitleText = subtitleBox.getText(); subtitleText.getTextStyle() .setFontSize(20) .setForegroundColor('#E3F2FD'); subtitleText.getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER); // 날짜 var dateBox = slide.insertTextBox( Utilities.formatDate(new Date(), 'Asia/Seoul', 'yyyy년 MM월 dd일'), 250, 400, 200, 30 ); var dateText = dateBox.getText(); dateText.getTextStyle() .setFontSize(14) .setForegroundColor('#FFFFFF'); dateText.getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER); } function createOverviewSlide(slide, brandColor, textColor) { // 제목 직접 삽입 var titleBox = slide.insertTextBox('회사 개요', 50, 50, 600, 80); var titleText = titleBox.getText(); titleText.getTextStyle() .setFontSize(32) .setBold(true) .setForegroundColor(brandColor); titleText.getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER); // 본문 내용 직접 삽입 var bodyText = '• 설립연도: 2020년\n\n' + '• 비전: 혁신적인 기술로 고객의 성공을 이끌어내는 글로벌 리더\n\n' + '• 미션: 최고의 품질과 서비스로 고객 만족을 실현\n\n' + '• 핵심가치: 혁신, 신뢰, 협력, 성장'; var bodyBox = slide.insertTextBox(bodyText, 80, 150, 540, 300); var bodyTextObj = bodyBox.getText(); bodyTextObj.getTextStyle() .setFontSize(18) .setForegroundColor(textColor); } function createServiceSlides(slide1, slide2, brandColor) { // 서비스 슬라이드 1 var title1Box = slide1.insertTextBox('주요 서비스', 50, 50, 600, 80); var title1Text = title1Box.getText(); title1Text.getTextStyle() .setFontSize(32) .setBold(true) .setForegroundColor(brandColor); title1Text.getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER); // 왼쪽 컬럼 var leftText1 = '웹 개발 서비스\n\n• 반응형 웹사이트\n• 전자상거래 솔루션\n• 웹 애플리케이션'; var leftBox1 = slide1.insertTextBox(leftText1, 50, 150, 300, 250); leftBox1.getText().getTextStyle().setFontSize(16).setForegroundColor('#333333'); // 오른쪽 컬럼 var rightText1 = '모바일 앱 개발\n\n• iOS/Android 네이티브 앱\n• 하이브리드 앱\n• UI/UX 디자인'; var rightBox1 = slide1.insertTextBox(rightText1, 380, 150, 300, 250); rightBox1.getText().getTextStyle().setFontSize(16).setForegroundColor('#333333'); // 서비스 슬라이드 2 var title2Box = slide2.insertTextBox('추가 서비스', 50, 50, 600, 80); var title2Text = title2Box.getText(); title2Text.getTextStyle() .setFontSize(32) .setBold(true) .setForegroundColor(brandColor); title2Text.getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER); // 왼쪽 컬럼 var leftText2 = '클라우드 솔루션\n\n• AWS/GCP 구축\n• 데이터 마이그레이션\n• 인프라 관리'; var leftBox2 = slide2.insertTextBox(leftText2, 50, 150, 300, 250); leftBox2.getText().getTextStyle().setFontSize(16).setForegroundColor('#333333'); // 오른쪽 컬럼 var rightText2 = '컨설팅 서비스\n\n• 디지털 전환 컨설팅\n• 프로세스 개선\n• 기술 자문'; var rightBox2 = slide2.insertTextBox(rightText2, 380, 150, 300, 250); rightBox2.getText().getTextStyle().setFontSize(16).setForegroundColor('#333333'); } function createTeamSlide(slide, brandColor) { // 제목 var titleBox = slide.insertTextBox('우리 팀', 50, 50, 600, 80); var titleText = titleBox.getText(); titleText.getTextStyle() .setFontSize(32) .setBold(true) .setForegroundColor(brandColor); titleText.getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER); // 팀원 정보 (2x2 그리드) - 개별 텍스트 박스로 생성 var teamMembers = [ { name: '김대표', role: 'CEO', desc: '전략 수립 및 경영 총괄' }, { name: '이개발', role: 'CTO', desc: '기술 개발 및 아키텍처 설계' }, { name: '박디자인', role: 'Design Lead', desc: 'UI/UX 디자인 및 브랜딩' }, { name: '최마케팅', role: 'Marketing Manager', desc: '마케팅 전략 및 고객 관리' } ]; for (var i = 0; i < teamMembers.length; i++) { var member = teamMembers[i]; var x = (i % 2) * 350 + 50; var y = Math.floor(i / 2) * 200 + 150; // 이름 박스 (큰 글씨, 굵게) var nameBox = slide.insertTextBox(member.name, x, y, 300, 40); var nameText = nameBox.getText(); nameText.getTextStyle() .setFontSize(18) .setBold(true) .setForegroundColor(brandColor); // 역할 박스 (중간 글씨, 이탤릭) var roleBox = slide.insertTextBox(member.role, x, y + 35, 300, 30); var roleText = roleBox.getText(); roleText.getTextStyle() .setFontSize(16) .setItalic(true) .setForegroundColor('#666666'); // 설명 박스 (일반 글씨) var descBox = slide.insertTextBox(member.desc, x, y + 75, 300, 60); var descText = descBox.getText(); descText.getTextStyle() .setFontSize(14) .setForegroundColor('#333333'); } } function createContactSlide(slide, brandColor) { // 제목 var titleBox = slide.insertTextBox('연락처 정보', 50, 50, 600, 80); var titleText = titleBox.getText(); titleText.getTextStyle() .setFontSize(32) .setBold(true) .setForegroundColor(brandColor); titleText.getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER); // 연락처 정보 var contactText = ' 주소: 서울특별시 강남구 테헤란로 123\n\n' + ' 전화: 02-1234-5678\n\n' + ' 이메일: contact@company.com\n\n' + ' 웹사이트: www.company.com'; var contactBox = slide.insertTextBox(contactText, 100, 150, 500, 250); var contactTextObj = contactBox.getText(); contactTextObj.getTextStyle() .setFontSize(20) .setForegroundColor('#333333'); // 감사합니다 메시지를 별도 박스로 생성 var thanksBox = slide.insertTextBox('감사합니다!', 200, 420, 300, 60); var thanksText = thanksBox.getText(); thanksText.getTextStyle() .setFontSize(24) .setBold(true) .setForegroundColor(brandColor); thanksText.getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER); }
2단계: 데이터 기반 프레젠테이션 생성
2.1 매출 보고서 자동 생성
ChatGPT 프롬프트:
Google Sheets의 매출 데이터를 바탕으로 월간 매출 보고서 프레젠테이션을 자동 생성하는 코드를 만들어주세요: 데이터 구조: - 월별 매출액, 지역별 실적, 상품별 판매량, 목표 대비 달성률 프레젠테이션 구성: 1. 커버 슬라이드 (보고 기간, 작성일) 2. 요약 슬라이드 (핵심 KPI) 3. 월별 매출 추이 (차트) 4. 지역별 실적 분석 (파이차트) 5. 상품별 성과 (막대차트) 6. 목표 달성률 현황 7. 인사이트 및 개선 방안 기능: - 자동 차트 생성 및 삽입 - 조건부 색상 코딩 (목표 달성/미달성) - 동적 텍스트 생성 (성과 분석 코멘트)
3단계: 실용적인 실습 과제
과제 1: 교육 자료 자동 생성 시스템
ChatGPT 프롬프트:
교육 과정별로 맞춤형 교육 자료를 자동 생성하는 시스템을 만들어주세요: 입력 데이터: - 과정명, 학습목표, 교육내용, 실습과제, 참고자료 생성할 슬라이드: 1. 과정 소개 2. 학습 목표 3. 교육 내용 (챕터별) 4. 실습 과제 5. 퀴즈/평가 6. 참고 자료 특별 기능: - 과정별 테마 적용 - 인터랙티브 요소 추가 - 진도율 추적 슬라이드 - 수료증 템플릿 생성
Chapter 6: 트리거 기반 자동화 시스템
학습 목표
  • 다양한 트리거를 활용한 자동화 시스템을 구축할 수 있다
  • 폼 제출, 시간 기반, 편집 이벤트 트리거를 활용할 수 있다
  • 통합 워크플로우를 설계하고 구현할 수 있다
  • 실무에 바로 적용 가능한 자동화 시스템을 만들 수 있다
1단계: 회의실 예약 시스템 구축
1.1 전체 시스템 설계
ChatGPT 프롬프트:
Google Forms + Sheets + Calendar + Gmail을 연동한 완전 자동화 회의실 예약 시스템을 만들어주세요: 시스템 구성: 1. Google Forms: 회의실 예약 신청서 2. Google Sheets: 예약 현황 관리 3. Google Calendar: 자동 일정 등록 4. Gmail: 확인 및 알림 이메일 예약 폼 항목: - 예약자명, 이메일, 연락처 - 회의명, 회의실 선택, 날짜, 시작시간, 종료시간 - 참석자 수, 필요 장비, 추가 요청사항 자동화 기능: 1. 폼 제출 시 즉시 처리 (onFormSubmit 트리거) 2. 중복 예약 검증 3. 캘린더에 자동 일정 생성 4. 예약자에게 확인 이메일 발송 5. 관리자에게 알림 이메일 발송 6. 회의 1시간 전 리마인더 이메일 코드를 단계별로 나누어서 작성해주세요.
2단계: 리마인더 및 추가 자동화
2.1 회의 전 알림 시스템
ChatGPT 프롬프트:
회의실 예약 시스템에 다음 기능들을 추가해주세요: 리마인더 시스템: 1. 회의 1시간 전 알림 (예약자에게) 2. 회의 당일 오전 9시 일일 예약 현황 (관리자에게) 3. 회의 종료 후 사용 확인 요청 (30분 후) 추가 자동화: 1. 시간 기반 트리거로 매일 정리 작업 2. 예약 취소 기능 (이메일 응답으로) 3. 회의실 사용률 통계 자동 생성 (월말) 4. 장비 고장 신고 시 해당 회의실 임시 차단 모든 기능에 대한 상세한 코드를 제공해주세요.
3단계: 종합 실습 과제
과제 1: 완전 자동화 출장 신청 시스템
ChatGPT 프롬프트:
회의실 예약 시스템을 참고하여 출장 신청 자동화 시스템을 만들어주세요: 시스템 구성: 1. 출장 신청 폼 (Google Forms) 2. 승인 워크플로우 (다단계 승인) 3. 출장비 자동 계산 4. 캘린더 일정 등록 5. 호텔/교통편 예약 안내 이메일 6. 출장 보고서 템플릿 자동 생성 자동화 기능: - 폼 제출 → 1차 승인자에게 이메일 - 승인 완료 → 출장자에게 안내 메일 - 출장 전날 → 준비사항 리마인더 - 출장 복귀 → 보고서 작성 요청 - 월말 → 출장비 정산 자료 생성
과제 2: 스마트 재고 관리 시스템
ChatGPT 프롬프트:
재고 관리 자동화 시스템을 구축해주세요: 기능: 1. 재고 입출고 기록 (폼) 2. 실시간 재고 현황 업데이트 3. 최소 재고량 도달 시 자동 알림 4. 발주 요청서 자동 생성 5. 재고 실사 일정 자동 스케줄링 6. 월간 재고 보고서 자동 생성 트리거 활용: - 재고 변동 시 즉시 처리 - 매일 재고 상태 점검 - 주간 발주 계획 생성 - 월간 재고 분석 보고서