VBA 코드 만들어줘
Excel VBA로 "안녕하세요!"라는 메시지 박스를 띄우는 코드를 만들어주세요.
초보자도 쉽게 따라할 수 있도록 단계별로 설명도 함께 부탁드립니다.
# 요청 사항: [구체적인 기능 설명]
# 사용 환경: Excel VBA
# 난이도: 초급자용
# 추가 요청: 코드 설명과 적용 방법도 함께 알려주세요
Excel VBA로 "Hello World!"라는 메시지 박스를 띄우는 간단한 코드를 만들어주세요.
초보자가 따라할 수 있도록 단계별 설명도 함께 부탁드립니다.
Sub HelloWorld()
MsgBox "Hello World!"
End Sub
Excel VBA로 A1 셀에 "오늘의 날짜"를 자동으로 입력하고,
B1 셀에 "VBA 성공!"이라는 텍스트를 입력하는 코드를 만들어주세요.
Sub InsertDateAndText()
Range("A1").Value = Date ' 오늘 날짜 입력
Range("B1").Value = "VBA 성공!" ' 텍스트 입력
End Sub
Excel VBA로 사용자 이름을 입력받아서 "안녕하세요, [이름]님!"이라는
메시지 박스를 띄우는 코드를 만들어주세요.
Excel VBA로 A1과 B1 셀의 숫자를 더해서 C1 셀에 결과를
자동으로 입력하는 코드를 만들어주세요.
Sub 프로시저명()
' 실행할 코드
End Sub
Function 함수명(매개변수) As 데이터타입
' 계산 코드
함수명 = 반환값
End Function
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
' 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 ' 조건 확인 후 반복
' 셀 선택하는 두 가지 방법
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: 전체 행
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
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
' 워크북이 열릴 때 자동 실행
Sub Workbook_Open()
' 워크북을 열면 자동으로 실행되는 코드
MsgBox "워크북이 열렸습니다!"
End Sub
' 워크시트가 변경될 때 자동 실행
Sub Worksheet_Change(ByVal Target As Range)
' 셀 값이 변경될 때마다 실행
' Target: 변경된 셀의 정보
MsgBox Target.Address & " 셀이 변경되었습니다."
End Sub
VBA 코드 좀 만들어줘
데이터 정리하는 코드
엑셀 자동화
Excel VBA로 A열에 있는 고객 이름 중에서 "김"씨 성을 가진 고객만
찾아서 B열에 "VIP 고객"이라고 표시하는 코드를 만들어주세요.
워크시트의 1행부터 100행까지 중에서 빈 행을 모두 삭제하는
VBA 코드를 작성해주세요. 삭제 후 "완료되었습니다"라는 메시지도 띄워주세요.
[환경] Excel VBA를 사용해서
[대상] [구체적인 데이터/범위]에서
[조건] [특정 조건을 만족하는]
[작업] [구체적인 작업]을 하는
[결과] 코드를 만들어주세요.
[추가] [부가 기능이나 요청사항]
Excel VBA를 사용해서
A열의 1행부터 마지막 행까지 데이터에서
금액이 100,000원 이상인 항목만
C열에 "고액"이라고 표시하고
작업 완료 후 "처리 완료" 메시지를 띄우는
코드를 만들어주세요.
Excel VBA로 다음 작업을 수행하는 코드를 만들어주세요:
1. Sheet1의 A열부터 C열까지, 1행부터 마지막 행까지의 데이터 중에서
2. B열(나이)이 30 이상인 행만 찾아서
3. 해당 행의 모든 데이터를 Sheet2로 복사해주세요
4. 복사 시 헤더(1행)도 함께 복사되어야 합니다
5. 작업 완료 후 "○○명의 데이터가 복사되었습니다" 메시지를 띄워주세요
6. 프로시저 명은 한글로 만들어주세요
예시 데이터:
A열: 이름 (홍길동, 김철수, 이영희)
B열: 나이 (25, 35, 40)
C열: 부서 (영업, 기획, 인사)
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
고객관리 시스템 만들어줘
1단계: 고객 데이터 입력 폼 만들기
2단계: 고객 검색 기능 추가
3단계: 고객 정보 수정 기능
4단계: 보고서 자동 생성
Excel VBA로 [원하는 기능]을 만들고 싶습니다.
다음과 같이 단계별로 나누어서 각 단계마다 코드와 설명을 제공해주세요:
1단계: [첫 번째 단계 설명]
2단계: [두 번째 단계 설명]
3단계: [세 번째 단계 설명]
각 단계마다 코드 실행 방법과 확인해야 할 포인트도 알려주세요.
Excel VBA로 데이터 정리 작업을 단계별로 진행하고 싶습니다.
먼저 1단계로 A열부터 E열까지의 모든 빈 행을 삭제하는 코드를 만들어주세요.
코드 설명과 실행 방법도 함께 알려주세요.
1단계에 이어서 2단계로 중복된 행을 제거하는 기능을 추가해주세요.
A열의 값을 기준으로 중복을 판단하고, 중복 시 첫 번째 행만 남기고 나머지는 삭제해주세요.
코드가 안 돼요
에러가 나요
제공해주신 VBA 코드를 실행했는데 다음과 같은 오류가 발생했습니다:
오류 메시지: "런타임 오류 1004: 응용 프로그램 정의 또는 개체 정의 오류"
오류 발생 줄: Range("A1:C" & lastRow).Copy
상황: 데이터가 100행 정도 있는 엑셀 파일에서 실행했습니다.
어떻게 수정해야 할까요?
제공해주신 VBA 코드에서 문제가 발생했습니다:
[코드 전체 붙여넣기]
오류 내용:
- 오류 메시지: [정확한 오류 메시지]
- 오류 발생 줄: [문제가 된 코드 줄]
- 실행 환경: [Excel 버전, 데이터 상황 등]
코드를 수정해주시고, 왜 이런 오류가 발생했는지 설명도 부탁드립니다.
Excel VBA로 A1셀의 값을 B1셀로 복사하는 코드를 만들어주세요.
그런데 A1셀이 비어있으면 "데이터 없음"이라고 B1에 표시해주세요.
위 코드에서 A1셀이 비어있을 때 오류가 발생합니다.
Null 값 처리를 어떻게 해야 하나요? 코드를 수정해주세요.
Excel VBA로 다음과 같은 복잡한 조건의 코드를 만들어주세요:
만약 A열이 "완료"이면서 B열이 100 이상이면 → C열에 "우수"
만약 A열이 "완료"이면서 B열이 100 미만이면 → C열에 "보통"
만약 A열이 "진행중"이면 → C열에 "대기"
그 외의 경우 → C열에 "확인필요"
이 조건들을 Select Case문을 사용해서 구현해주세요.
제공해주신 코드가 데이터가 많을 때 느린 것 같습니다.
다음과 같이 최적화해주세요:
1. 화면 업데이트 비활성화
2. 자동 계산 비활성화
3. 배열을 활용한 일괄 처리
4. 완료 후 설정 복원
최적화된 코드와 함께 성능 개선 포인트도 설명해주세요.
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
Excel VBA로 다음과 같은 빈 행 삭제 자동화 코드를 만들어주세요:
조건:
- A열부터 E열까지의 범위에서 모든 셀이 비어있는 행만 삭제
- 1행(헤더)은 삭제하지 않음
- 삭제된 행의 개수를 카운트해서 메시지로 표시
- 삭제 전에 "빈 행을 삭제하시겠습니까?" 확인 메시지
실행 예시:
- 원본: 100행 중 15개 빈 행
- 결과: "15개의 빈 행이 삭제되었습니다" 메시지
코드 설명과 주의사항도 함께 알려주세요.
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
테스트데이터생성()
또는 고급테스트데이터생성()
실행빈행삭제()
코드 실행Excel VBA로 중복 데이터 제거 자동화 코드를 만들어주세요:
요구사항:
- A열의 값을 기준으로 중복 판단
- 중복된 경우 첫 번째 행은 유지하고 나머지는 삭제
- 헤더(1행)는 삭제하지 않음
- 대소문자 구분하지 않고 비교 (예: "김철수"와 "김철수"는 같은 것으로 판단)
- 삭제된 중복 행의 개수를 메시지로 표시
예시:
1행: 이름 (헤더)
2행: 김철수
3행: 이영희
4행: 김철수 (삭제 대상)
5행: 박민수
6행: 이영희 (삭제 대상)
결과: "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
Excel VBA로 텍스트 데이터 정리 자동화 코드를 만들어주세요:
정리 작업:
1. 모든 텍스트의 앞뒤 공백 제거 (Trim)
2. 이름 컬럼(A열): 첫 글자만 대문자, 나머지는 소문자
3. 이메일 컬럼(E열): 모두 소문자로 변환
4. 전화번호 컬럼(D열): 하이픈(-) 제거하고 숫자만 남기기
대상 범위: A2부터 E열의 마지막 행까지
처리 완료 후: "텍스트 정리가 완료되었습니다" 메시지
예시:
변경 전: " 홍 길동 ", " HONG@GMAIL.COM ", "010-1234-5678"
변경 후: "홍길동", "hong@gmail.com", "01012345678"
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
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개 오류 발견"
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
Excel VBA로 고객 명단 정리 완전 자동화 시스템을 만들어주세요:
처리 순서:
1. 빈 행 삭제
2. 중복 데이터 제거 (이름 기준)
3. 텍스트 정리 (공백 제거, 대소문자 정리)
4. 날짜 형식 통일
5. 데이터 유효성 검증 (이메일 형식, 전화번호 자릿수)
데이터 구조:
A열: 이름, B열: 나이, C열: 가입일, D열: 전화번호, E열: 이메일
각 단계별로 진행상황을 표시하고,
최종 결과를 요약해서 보여주는 코드를 만들어주세요.
추가 요구사항:
- 처리 전 백업 시트 자동 생성
- 각 단계마다 진행률 표시
- 오류 발생 시 롤백 기능
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. 대용량 데이터(10만 행 이상) 처리 시 속도 향상 방안
2. 메모리 사용량 최적화
3. 중간 결과 저장으로 안정성 향상
4. 사용자 취소 기능 추가
개선된 코드와 함께 성능 향상 이유도 설명해주세요.
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
Excel VBA로 조건부 집계 자동화 시스템을 만들어주세요:
데이터 구조:
- A열: 날짜 (2024-01-01 형식)
- B열: 부서명 (영업, 기획, 인사, 개발)
- C열: 담당자
- D열: 매출액
- E열: 지역 (서울, 부산, 대구, 인천)
자동 계산 항목:
1. 부서별 총 매출액
2. 월별 평균 매출액
3. 지역별 매출 비중
4. 100만원 이상 고액 거래 건수
5. 각 부서의 월별 성장률
결과 출력:
- 새로운 시트 "집계결과"에 정리된 표 형태로 출력
- 계산 일시와 총 데이터 건수도 함께 표시
사용자 편의 기능:
- 특정 월을 선택해서 해당 월만 집계할 수 있는 옵션
- 부서를 선택해서 해당 부서만 분석할 수 있는 옵션
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
Excel VBA로 여러 시트의 데이터를 통합 집계하는 코드를 만들어주세요:
상황:
- 각 지점별로 시트가 분리되어 있음 (서울지점, 부산지점, 대구지점, 인천지점)
- 모든 시트의 데이터 구조는 동일함
- 각 시트의 데이터를 통합해서 전체 집계 생성
요구사항:
1. 모든 지점 시트에서 데이터 자동 수집
2. 지점별 순위 매기기 (매출액 기준)
3. 전체 합계와 평균 계산
4. 각 지점의 전체 대비 비중 계산
5. 증감률 분석 (전월 대비)
출력 형태:
- "통합집계" 시트에 정리된 표
- 차트도 자동 생성 (막대그래프)
에러 처리:
- 시트가 존재하지 않는 경우 경고 메시지
- 데이터가 없는 시트는 제외하고 처리
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
Excel VBA로 월별/분기별 자동 요약 보고서를 생성하는 코드를 만들어주세요:
기능 요구사항:
1. 매출 데이터를 월별로 그룹화
2. 각 월별 총 매출, 평균 매출, 거래 건수 계산
3. 분기별 집계 (Q1, Q2, Q3, Q4)
4. 전월 대비 증감률 계산
5. 전년 동월 대비 증감률 계산 (데이터가 있는 경우)
추가 분석:
- 최고 매출 월과 최저 매출 월 찾기
- 연간 매출 트렌드 분석 (상승/하락/정체)
- 계절성 분석 (분기별 패턴)
출력 형태:
- "월별요약" 시트와 "분기별요약" 시트 자동 생성
- 각 시트에 해당하는 차트도 자동 생성
- 요약 통계와 인사이트 텍스트도 포함
사용자 옵션:
- 특정 연도만 분석할 수 있는 선택 기능
- 특정 부서만 분석할 수 있는 필터 기능
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
Excel VBA로 비율과 증감률을 자동으로 계산하는 고급 분석 시스템을 만들어주세요:
계산 항목:
1. 전월 대비 증감률 (%)
2. 전년 동월 대비 증감률 (%)
3. 연초 대비 누적 증감률 (%)
4. 목표 대비 달성률 (%)
5. 각 부서의 전체 대비 기여도 (%)
추가 분석:
- 증감률 트렌드 분석 (3개월, 6개월, 12개월 이동평균)
- 변동성 분석 (표준편차)
- 성장세 분류 (급성장, 완만성장, 정체, 감소)
시각화:
- 증감률 차트 (선 그래프)
- 비율 차트 (파이 차트)
- 트렌드 차트 (복합 차트)
특별 기능:
- 음수 증감률은 빨간색, 양수는 파란색으로 표시
- 10% 이상 증가는 녹색 배경으로 하이라이트
- 경고 수준 (-20% 이하 감소) 자동 표시
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
Excel VBA로 매출 데이터 월간 보고서 완전 자동 생성 시스템을 만들어주세요:
통합 기능:
1. 모든 이전 단계의 분석을 하나의 보고서로 통합
2. 경영진용 대시보드 형태로 구성
3. 핵심 지표와 인사이트를 한 눈에 볼 수 있게 배치
4. 자동 차트 생성 (5-6개의 다양한 차트)
보고서 구성:
- 페이지 1: 전체 요약 (핵심 KPI)
- 페이지 2: 부서별 상세 분석
- 페이지 3: 트렌드 및 예측
- 페이지 4: 액션 아이템 및 권장사항
자동화 기능:
- 매월 1일에 자동 실행되도록 스케줄링
- 이메일로 자동 발송 (PDF 첨부)
- 이전 월 데이터 자동 백업
- 에러 발생 시 관리자에게 알림
고급 기능:
- 데이터 품질 체크 (누락, 이상치 탐지)
- 자동 인사이트 생성 (텍스트)
- 목표 대비 달성률 분석
- 다음 달 예측 (간단한 트렌드 기반)
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
생성된 키 형태: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
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
script.google.com
접속myFunction()
확인Google Apps Script 코드 만들어줘
Google Apps Script로 Google Sheets의 A1 셀에 "Hello World!"를
입력하는 간단한 코드를 만들어주세요.
초보자도 따라할 수 있도록 단계별 설명도 함께 부탁드립니다.
# 요청 사항: [구체적인 기능 설명]
# 사용 환경: Google Apps Script + Google Sheets
# 난이도: 초급자용
# 추가 요청: 코드 설명과 실행 방법도 함께 알려주세요
Google Apps Script로 다음 작업을 수행하는 코드를 만들어주세요:
1. 현재 활성화된 Google Sheets의 A1 셀에 "Hello World!" 입력
2. B1 셀에 현재 날짜와 시간 입력
3. C1 셀에 "자동화 성공!" 메시지 입력
4. 작업 완료 후 "스크립트 실행 완료" 알림창 띄우기
함수명은 helloWorld로 만들어주세요.
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("스크립트 실행 완료");
}
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로 만들어주세요.
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 + "명의 성적이 계산되었습니다.");
}
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);
}
Google Apps Script로 다음 기능을 하는 코드를 만들어주세요:
1. 사용자에게 이름을 입력받는 대화상자 표시
2. 입력받은 이름으로 "안녕하세요, [이름]님! 오늘도 좋은 하루 되세요!" 메시지 생성
3. 현재 시간에 따라 인사말 변경 (오전: 좋은 아침, 오후: 좋은 오후, 저녁: 좋은 저녁)
4. A1 셀에 개인화된 인사말 입력
Google Apps Script로 간단한 재고 관리 시스템을 만들어주세요:
데이터 구조:
- A열: 상품명, B열: 현재고, C열: 최소재고, D열: 상태
기능:
1. 현재고가 최소재고보다 적으면 D열에 "재주문 필요" 표시 (빨간색)
2. 현재고가 충분하면 "정상" 표시 (녹색)
3. 재주문이 필요한 상품 개수를 알림창으로 표시
Google Apps Script로 매출 데이터 분석 실습을 위한 테스트 데이터를
자동 생성하는 코드를 만들어주세요:
생성할 데이터:
- A열: 날짜 (2024년 1월~12월, 랜덤)
- B열: 지역 (서울, 부산, 대구, 대전 중 랜덤)
- C열: 담당자 (김철수, 이영희, 박민수, 최지은 중 랜덤)
- D열: 상품명 (제품A, 제품B, 제품C 중 랜덤)
- E열: 수량 (1~100 랜덤)
- F열: 단가 (1000~50000 랜덤)
- G열: 매출액 (수량 × 단가 자동 계산)
특징:
- 헤더 포함 총 100행 생성
- 날짜는 YYYY-MM-DD 형식
- 매출액에는 천 단위 콤마 적용
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개의 매출 데이터가 생성되었습니다.");
}
방금 생성한 매출 데이터를 분석하는 Google Apps Script 코드를 만들어주세요:
기능:
1. 새로운 시트 "분석결과" 생성
2. 지역별 총 매출액과 평균 매출액 계산
3. 월별 매출 추이 계산
4. 상품별 판매량과 매출액 계산
5. 담당자별 성과 분석
6. 결과를 정리된 표 형태로 출력
7. 분석 완료 시간도 함께 표시
모든 계산은 원본 데이터 시트의 데이터를 참조해서 수행하세요.
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'분석결과' 시트를 확인하세요.");
}
분석결과 시트의 데이터를 바탕으로 차트를 자동 생성하는
Google Apps Script 코드를 만들어주세요:
생성할 차트:
1. 지역별 매출액 파이차트
2. 월별 매출 추이 선형차트
3. 상품별 판매량 막대차트
차트 특성:
- 각 차트마다 적절한 제목과 범례 포함
- 차트 크기는 400x300 픽셀
- 분석결과 시트의 빈 공간에 배치
- 차트 생성 후 위치 자동 조정
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지역별 파이차트와 월별 선형차트가 생성되었습니다.");
}
원본 매출 데이터에 데이터 검증과 조건부 서식을 적용하는
Google Apps Script 코드를 만들어주세요:
데이터 검증:
1. 날짜 열: 유효한 날짜 형식만 허용
2. 지역 열: "서울,부산,대구,대전" 중에서만 선택 가능 (드롭다운)
3. 수량 열: 1~1000 사이의 숫자만 허용
4. 단가 열: 1000~100000 사이의 숫자만 허용
조건부 서식:
1. 매출액 상위 10% → 녹색 배경
2. 매출액 하위 10% → 빨간색 배경
3. 수량이 50 이상 → 파란색 글자
4. 단가가 30000 이상 → 굵은 글씨
적용 후 검증 규칙과 서식이 제대로 적용되었는지 확인하는 메시지도 표시해주세요.
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);
}
지금까지 배운 모든 기능을 종합하여 "스마트 매출 대시보드"를
만드는 Google Apps Script를 작성해주세요:
통합 기능:
1. 테스트 데이터 자동 생성 (1000행)
2. 실시간 데이터 분석 (지역별, 월별, 상품별)
3. 동적 차트 생성 (파이, 선형, 막대차트)
4. 핵심 KPI 자동 계산 (평균, 증감률, 상위실적자)
5. 이상 데이터 자동 감지 및 알림
6. 원클릭 보고서 생성 및 이메일 발송
7. 사용자 친화적 메뉴 시스템
실행 시간 최적화와 에러 처리도 포함해주세요.
매출 데이터가 업데이트될 때마다 자동으로 분석하고
특정 조건에서 알림을 보내는 시스템을 만들어주세요:
트리거 기능:
1. 새 데이터 입력 시 자동 분석 실행
2. 일일 매출이 목표치 미달 시 알림
3. 주간 매출 보고서 자동 생성 (매주 월요일)
4. 이상 패턴 감지 시 즉시 알림
사용할 트리거:
- onEdit (데이터 편집 시)
- 시간 기반 트리거 (정기 실행)
- 이메일 트리거 (외부 데이터 수신 시)
Google Apps Script로 고객 만족도 설문조사 폼을 자동 생성하는 코드를 만들어주세요:
폼 구성:
1. 폼 제목: "2024 고객 만족도 조사"
2. 설명: "소중한 의견을 들려주세요. 설문에는 약 5분이 소요됩니다."
질문 구성:
1. 이름 (단답형, 필수)
2. 이메일 (이메일 형식, 필수)
3. 나이대 (객관식: 20대, 30대, 40대, 50대 이상)
4. 이용 서비스 (체크박스: 웹사이트, 모바일앱, 고객지원, 배송서비스)
5. 만족도 (선형배율: 1~5점, 1=매우불만족, 5=매우만족)
6. 개선사항 (장문형, 선택사항)
7. 추천의향 (객관식: 매우 그렇다, 그렇다, 보통, 아니다, 전혀 아니다)
추가 설정:
- 응답자가 답변을 수정할 수 있도록 설정
- 응답 후 확인 메시지 표시
- 응답 데이터는 Google Sheets에 자동 저장
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);
}
}
방금 생성한 설문조사 폼의 응답을 실시간으로 처리하는 시스템을 만들어주세요:
실시간 처리 기능:
1. 새 응답이 제출될 때마다 자동 실행 (onFormSubmit 트리거)
2. 응답 데이터 검증 및 정리
3. 응답 통계 자동 업데이트 (별도 시트에)
4. 만족도 점수별 자동 분류
5. 이상 응답 감지 (예: 동일 이메일 중복 응답)
6. 실시간 대시보드 업데이트
통계 항목:
- 총 응답 수
- 나이대별 분포
- 평균 만족도 점수
- 서비스별 이용률
- 추천의향 분포
- 시간대별 응답 패턴
응답자에게는 즉시 확인 이메일도 발송해주세요.
복잡한 조건부 로직을 가진 다단계 설문조사를 생성하는 Google Apps Script를 만들어주세요:
설문 시나리오: "제품 사용 경험 조사"
1단계: 기본 정보
- 제품 사용 경험 (예/아니오)
2단계: 조건부 분기
- 사용 경험이 "예"인 경우:
- 사용 기간 (1개월 미만, 1-6개월, 6개월-1년, 1년 이상)
- 사용 빈도 (매일, 주 2-3회, 주 1회, 월 1회)
- 만족도 평가 (1-5점 척도)
- 재구매 의향 (예/아니오)
- 사용 경험이 "아니오"인 경우:
- 미사용 이유 (가격, 필요성 부족, 인지 부족, 기타)
- 향후 구매 의향 (매우 높음, 높음, 보통, 낮음, 매우 낮음)
- 구매 고려 요소 (가격, 품질, 브랜드, 추천)
3단계: 공통 질문
- 연령대, 성별, 직업
- 추가 의견 (자유 응답)
폼의 조건부 로직과 섹션 분리를 구현해주세요.
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);
}
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;
}
}
Google Apps Script로 회의 정보를 입력받아 표준화된 회의록을 자동 생성하는 시스템을 만들어주세요:
입력 정보:
- 회의명, 일시, 장소, 참석자, 안건
회의록 구성:
1. 회의 기본 정보
2. 참석자 목록
3. 안건별 논의 내용 및 결론
4. 액션 아이템 (담당자, 마감일)
5. 다음 회의 일정
특별 기능:
- 참석자에게 자동 이메일 발송
- 액션 아이템을 캘린더에 자동 등록
- 회의록을 팀 드라이브에 자동 저장
Google Apps Script로 회사 소개 프레젠테이션을 자동 생성하는 코드를 만들어주세요:
슬라이드 구성:
1. 제목 슬라이드 (회사명, 로고, 날짜)
2. 회사 개요 (설립연도, 비전, 미션)
3. 주요 서비스 (3-4개 서비스, 각각 이미지와 설명)
4. 팀 소개 (구성원별 사진과 역할)
5. 연락처 정보
디자인 요구사항:
- 전문적인 테마 적용
- 일관된 폰트와 색상 사용
- 각 슬라이드마다 적절한 레이아웃 적용
- 애니메이션 효과 추가
- 회사 로고를 모든 슬라이드에 워터마크로 삽입
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);
}
Google Sheets의 매출 데이터를 바탕으로 월간 매출 보고서 프레젠테이션을 자동 생성하는 코드를 만들어주세요:
데이터 구조:
- 월별 매출액, 지역별 실적, 상품별 판매량, 목표 대비 달성률
프레젠테이션 구성:
1. 커버 슬라이드 (보고 기간, 작성일)
2. 요약 슬라이드 (핵심 KPI)
3. 월별 매출 추이 (차트)
4. 지역별 실적 분석 (파이차트)
5. 상품별 성과 (막대차트)
6. 목표 달성률 현황
7. 인사이트 및 개선 방안
기능:
- 자동 차트 생성 및 삽입
- 조건부 색상 코딩 (목표 달성/미달성)
- 동적 텍스트 생성 (성과 분석 코멘트)
교육 과정별로 맞춤형 교육 자료를 자동 생성하는 시스템을 만들어주세요:
입력 데이터:
- 과정명, 학습목표, 교육내용, 실습과제, 참고자료
생성할 슬라이드:
1. 과정 소개
2. 학습 목표
3. 교육 내용 (챕터별)
4. 실습 과제
5. 퀴즈/평가
6. 참고 자료
특별 기능:
- 과정별 테마 적용
- 인터랙티브 요소 추가
- 진도율 추적 슬라이드
- 수료증 템플릿 생성
Google Forms + Sheets + Calendar + Gmail을 연동한 완전 자동화 회의실 예약 시스템을 만들어주세요:
시스템 구성:
1. Google Forms: 회의실 예약 신청서
2. Google Sheets: 예약 현황 관리
3. Google Calendar: 자동 일정 등록
4. Gmail: 확인 및 알림 이메일
예약 폼 항목:
- 예약자명, 이메일, 연락처
- 회의명, 회의실 선택, 날짜, 시작시간, 종료시간
- 참석자 수, 필요 장비, 추가 요청사항
자동화 기능:
1. 폼 제출 시 즉시 처리 (onFormSubmit 트리거)
2. 중복 예약 검증
3. 캘린더에 자동 일정 생성
4. 예약자에게 확인 이메일 발송
5. 관리자에게 알림 이메일 발송
6. 회의 1시간 전 리마인더 이메일
코드를 단계별로 나누어서 작성해주세요.
회의실 예약 시스템에 다음 기능들을 추가해주세요:
리마인더 시스템:
1. 회의 1시간 전 알림 (예약자에게)
2. 회의 당일 오전 9시 일일 예약 현황 (관리자에게)
3. 회의 종료 후 사용 확인 요청 (30분 후)
추가 자동화:
1. 시간 기반 트리거로 매일 정리 작업
2. 예약 취소 기능 (이메일 응답으로)
3. 회의실 사용률 통계 자동 생성 (월말)
4. 장비 고장 신고 시 해당 회의실 임시 차단
모든 기능에 대한 상세한 코드를 제공해주세요.
회의실 예약 시스템을 참고하여 출장 신청 자동화 시스템을 만들어주세요:
시스템 구성:
1. 출장 신청 폼 (Google Forms)
2. 승인 워크플로우 (다단계 승인)
3. 출장비 자동 계산
4. 캘린더 일정 등록
5. 호텔/교통편 예약 안내 이메일
6. 출장 보고서 템플릿 자동 생성
자동화 기능:
- 폼 제출 → 1차 승인자에게 이메일
- 승인 완료 → 출장자에게 안내 메일
- 출장 전날 → 준비사항 리마인더
- 출장 복귀 → 보고서 작성 요청
- 월말 → 출장비 정산 자료 생성
재고 관리 자동화 시스템을 구축해주세요:
기능:
1. 재고 입출고 기록 (폼)
2. 실시간 재고 현황 업데이트
3. 최소 재고량 도달 시 자동 알림
4. 발주 요청서 자동 생성
5. 재고 실사 일정 자동 스케줄링
6. 월간 재고 보고서 자동 생성
트리거 활용:
- 재고 변동 시 즉시 처리
- 매일 재고 상태 점검
- 주간 발주 계획 생성
- 월간 재고 분석 보고서