이 ICS CSV 변환기는 iCalendar(.ics) 파일을 읽어 VEVENT마다 한 행인 CSV를 씁니다. 열은 UID, Summary, Start, End, All day, Timezone, Location, Description, Recurrence, Status, EXDATE, RDATE, Recurrence ID 열세 가지입니다. 캘린더 내보내기를 점검하거나, 회의 수를 세거나, 엑셀이나 구글 시트에서 일정을 필터링하거나, 일정 데이터를 다른 시스템으로 옮기려는 사람에게 알맞습니다.
날짜는 하나의 시간대로 뭉개지지 않고 iCalendar의 의미를 유지합니다. TZID가 있는 시각은 현지 시각과 시간대 이름을 보여 주고, UTC 시각은 Z로 끝나며, 종일 일정은 날짜만 보입니다. 반복 일정은 모든 회차로 펼쳐지지 않고 RRULE과 함께 한 행으로 남습니다. 스프레드시트가 수식으로 실행할 수 있는 텍스트에는 앞에 작은따옴표를 붙여서, 제목이 =SUM(A1:A9)인 일정이 있어도 파일을 열 때 실행되지 않습니다.
입력한 내용은 브라우저 안에서 처리되며 서버로 전송되지 않습니다. 캘린더는 이 탭 안에서 ical.js 라이브러리로 파싱되고, 텍스트가 바뀌면 CSV와 일정 표가 바로 갱신됩니다. 한도는 입력 5 MiB, 일정 50,000개, CSV 20 MiB입니다.
사용 방법
.ics로 캘린더 내보내기
캘린더 앱에서 .ics 내보내기를 받거나 그 텍스트를 복사합니다. 변환기는 캘린더 URL을 가져오지 않습니다.
파일 열기 또는 붙여 넣기
파일 열기를 누르거나 .ics 파일을 편집기에 끌어다 놓거나 내용을 붙여 넣습니다. 처음에는 올바른 캘린더 예제가 들어 있습니다. 빈 입력, 5 MiB를 넘는 파일, 해석할 수 없는 파일, 일정이 없는 파일은 각각 편집기 아래에 따로 메시지가 나옵니다.
결과 확인
events.csv 보기에 CSV가 바로 나타나고 일정, 열, 크기 숫자가 함께 표시됩니다. 그 아래 일정 표는 제목, 시작, 종료처럼 읽기 쉬운 열 이름으로 처음 100개 일정을 보여 주므로 저장하기 전에 제목과 시각을 훑어볼 수 있습니다.
CSV 복사 또는 다운로드
CSV를 클립보드로 복사하거나 events.csv로 내려받습니다. 표에는 처음 100개만 보여도 파일에는 모든 일정이 들어갑니다.
스프레드시트에서 열기
엑셀이나 구글 시트에서 CSV를 엽니다. 내려받은 파일에는 기본으로 BOM이 붙어 엑셀에서 한글 등이 올바르게 보입니다. "엑셀 호환 (UTF-8 BOM)"을 껐거나 복사한 텍스트를 직접 파일로 저장해서 깨져 보이면 파일을 더블클릭하지 말고 데이터 탭에서 UTF-8 텍스트로 가져오세요.
작동 원리
열세 가지 열
VEVENT마다 한 행이 됩니다. 텍스트 값은 이스케이프가 풀려서 iCalendar의 Room 4\, floor 2는 Room 4, floor 2로, \n으로 쓴 줄바꿈은 따옴표 CSV 셀 안의 실제 줄바꿈으로 나옵니다. 쉼표, 따옴표, 줄바꿈이 든 셀은 따옴표로 감싸고, 파일은 CRLF 줄바꿈을 씁니다. 내려받는 파일은 엑셀이 올바르게 읽도록 UTF-8 BOM으로 시작하며, "엑셀 호환 (UTF-8 BOM)" 스위치는 기본으로 켜져 있고 다운로드에만 적용되어 복사한 텍스트는 바뀌지 않습니다.
| 열 | 출처 | 비고 |
|---|---|---|
| UID | UID | 일정에 없으면 비어 있음 |
| Summary | SUMMARY | 일정 제목 |
| Start | DTSTART | 2027-03-01T09:00:00, UTC는 Z가 붙고 종일은 2027-03-02 |
| End | DTEND 또는 DTSTART + DURATION | DURATION이 있으면 계산하고 둘 다 없을 때만 비어 있음 |
| All day | DTSTART의 값 유형 | DTSTART가 DATE 값이면 true |
| Timezone | TZID 매개변수 | Z 시각은 UTC, 부유 시각과 종일 날짜는 비어 있음 |
| Location | LOCATION | |
| Description | DESCRIPTION | 줄바꿈이 포함될 수 있음 |
| Recurrence | RRULE | FREQ=WEEKLY;COUNT=2 같은 규칙 원문 |
| Status | STATUS | 있으면 TENTATIVE, CONFIRMED, CANCELLED |
| EXDATE | EXDATE | 제외할 반복 날짜. 여러 값은 세미콜론으로 연결 |
| RDATE | RDATE | 추가할 반복 날짜. 여러 값은 세미콜론으로 연결 |
| Recurrence ID | RECURRENCE-ID | 이 변경 일정이 가리키는 원래 반복 시점 |
iCalendar의 시작과 종료 (RFC 5545)
DATE-TIME 값은 파일에서 구분 기호 없이(20270301T090000) 쓰이고 CSV에서는 ISO 형태(2027-03-01T09:00:00)로 보입니다. 끝의 Z는 UTC를 뜻하고 TZID 매개변수는 현지 시각의 시간대를 지정합니다. 둘 다 없는 시각은 보는 사람의 시간대를 따르는 부유 시각이며 Timezone 셀이 비어 있습니다.
종일 일정은 DATE 값을 쓰고 종료는 포함되지 않는 날짜입니다. 3월 2일 하루짜리 일정의 DTEND는 3월 3일입니다. CSV는 종일 DTEND에서 하루를 뺀 마지막 포함 날짜를 보여 주므로 CSV ICS 변환기로 되돌려도 하루가 늘지 않습니다. 반복 일정은 RRULE이 Recurrence에 든 한 행이고, EXDATE는 제외 날짜, RDATE는 추가 날짜, Recurrence ID는 수정한 한 회차를 나타냅니다.
스프레드시트 수식 방지
엑셀, 리브레오피스, 구글 시트는 =, +, -, @로 시작하는 셀을 수식으로 처리합니다. CSV 인젝션이 바로 이 점을 노려서, 제목에 수식을 넣은 초대장이 내보내기 파일을 연 사람의 컴퓨터에서 그 수식을 실행하게 만들 수 있습니다. 변환기는 그런 텍스트 앞에 작은따옴표를 붙이고, 스프레드시트는 이를 일반 텍스트로 표시하면서 따옴표는 셀에서 숨깁니다.
실제 데이터가 망가지지 않도록 규칙은 좁게 잡혀 있습니다. =, @, 탭, 캐리지 리턴으로 시작하는 값에는 항상 작은따옴표가 붙습니다. +나 -로 시작하는 값은 나머지가 숫자, 공백, 점, 하이픈, 괄호로만 된 숫자 모양이 아닐 때만 붙으므로 +82 10-1234-5678 같은 전화번호나 -12.5 같은 금액은 그대로입니다. 페이지의 일정 표는 원래 값을 보여 주고, 작은따옴표는 CSV 텍스트에만 들어갑니다.
| 캘린더의 값 | CSV 셀 |
|---|---|
| =SUM(A1:A9) | '=SUM(A1:A9) |
| @channel bring laptops | '@channel bring laptops |
| + call Kim | '+ call Kim |
| -5 minutes early | '-5 minutes early |
| +82 10-1234-5678 | +82 10-1234-5678 |
| -12.5 | -12.5 |
실제 예시
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//t//EN
BEGIN:VEVENT
UID:one@example.test
DTSTAMP:20270101T000000Z
DTSTART;TZID=Asia/Seoul:20270301T090000
DTEND;TZID=Asia/Seoul:20270301T100000
SUMMARY:One\, meeting
LOCATION:Room A
DESCRIPTION:Line 1\nLine "2"
RRULE:FREQ=WEEKLY;COUNT=2
STATUS:CONFIRMED
END:VEVENT
BEGIN:VEVENT
UID:two@example.test
DTSTAMP:20270101T000000Z
DTSTART;VALUE=DATE:20270302
DTEND;VALUE=DATE:20270303
SUMMARY:All day
END:VEVENT
BEGIN:VEVENT
UID:three@example.test
DTSTAMP:20270101T000000Z
DTSTART:20270305T090000Z
DTEND:20270305T100000Z
SUMMARY:Utc
END:VEVENT
END:VCALENDARUID,Summary,Start,End,All day,Timezone,Location,Description,Recurrence,Status,EXDATE,RDATE,Recurrence ID
one@example.test,"One, meeting",2027-03-01T09:00:00,2027-03-01T10:00:00,false,Asia/Seoul,Room A,"Line 1
Line ""2""",FREQ=WEEKLY;COUNT=2,CONFIRMED,,,
two@example.test,All day,2027-03-02,2027-03-02,true,,,,,,,,
three@example.test,Utc,2027-03-05T09:00:00Z,2027-03-05T10:00:00Z,false,UTC,,,,,,,제목의 쉼표와 설명의 따옴표는 이스케이프가 풀린 뒤 CSV용으로 다시 따옴표 처리되었습니다. 주간 일정은 한 행으로 남고, 종일 일정의 Timezone은 비어 있습니다.
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:z
DTSTART:20270306T090000Z
SUMMARY:Long ti
tle here
END:VEVENT
END:VCALENDARUID,Summary,Start,End,All day,Timezone,Location,Description,Recurrence,Status,EXDATE,RDATE,Recurrence ID
z,Long title here,2027-03-06T09:00:00Z,,false,UTC,,,,,,,제목이 파일에서 두 줄로 접혀 있었고(둘째 줄은 탭으로 시작) 다시 이어졌습니다. DTEND가 없으므로 End는 비어 있습니다.
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:z
RECURRENCE-ID:20270313T090000Z
DTSTART:20270313T100000Z
SUMMARY:Moved
ATTENDEE:mailto:a@b.c
END:VEVENT
END:VCALENDARUID,Summary,Start,End,All day,Timezone,Location,Description,Recurrence,Status,EXDATE,RDATE,Recurrence ID
z,Moved,2027-03-13T10:00:00Z,,false,UTC,,,,,,,2027-03-13T09:00:00ZRECURRENCE-ID는 Recurrence ID 열로 내보내고 ATTENDEE는 내보내지 않습니다. 나열된 열세 가지 열을 씁니다.
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//t//EN
BEGIN:VEVENT
UID:f1@example.test
DTSTAMP:20270101T000000Z
DTSTART:20270310T090000Z
SUMMARY:=SUM(A1:A9)
LOCATION:+82 10-1234-5678
DESCRIPTION:@channel bring laptops
END:VEVENT
BEGIN:VEVENT
UID:f2@example.test
DTSTAMP:20270101T000000Z
DTSTART:20270311T090000Z
SUMMARY:-5 minutes early
LOCATION:-12.5
DESCRIPTION:+ call Kim
END:VEVENT
END:VCALENDARUID,Summary,Start,End,All day,Timezone,Location,Description,Recurrence,Status,EXDATE,RDATE,Recurrence ID
f1@example.test,'=SUM(A1:A9),2027-03-10T09:00:00Z,,false,UTC,+82 10-1234-5678,'@channel bring laptops,,,,,
f2@example.test,'-5 minutes early,2027-03-11T09:00:00Z,,false,UTC,-12.5,'+ call Kim,,,,,수식, @ 멘션, +와 - 뒤에 글자가 오는 값에는 작은따옴표가 붙고 전화번호와 숫자 -12.5에는 붙지 않습니다. 페이지의 일정 표에는 =SUM(A1:A9)가 원래대로 보입니다.
자주 하는 실수
엑셀에서 한글이 깨질 수 있음
"엑셀 호환 (UTF-8 BOM)"이 켜져 있으면(기본값) 내려받는 CSV는 UTF-8 BOM으로 시작합니다. 복사한 텍스트나 스위치를 끄고 받은 파일에는 BOM이 없어 더블클릭하면 엑셀이 기존 코드 페이지로 열 수 있습니다. 이런 파일은 데이터 탭에서 UTF-8을 선택해 가져오거나 구글 시트에서 여세요.
종일 일정의 종료일은 포함되지 않는 날짜
하루짜리 종일 일정의 End 열은 다음 날입니다. iCalendar가 이렇게 저장하기 때문입니다. 스프레드시트에 마지막으로 포함하는 날을 보이고 싶다면 하루를 빼세요.
반복 일정은 펼쳐지지 않음
1년 동안 매주 열리는 일정은 52행이 아니라 RRULE이 있는 한 행입니다. 회차마다 한 행이 필요하면 스크립트나 캘린더 앱으로 규칙을 먼저 펼치세요.
작은따옴표도 CSV 텍스트의 일부
스프레드시트는 앞의 작은따옴표를 숨기지만 CSV를 직접 읽는 스크립트나 데이터베이스에는 문자 하나로 보입니다. 스프레드시트가 아닌 곳으로 가져온다면 Summary, Location, Description 앞의
'를 지우세요.참석자, 알림, 카테고리는 빠짐
열 개 필드만 내보냅니다. 초대받은 사람, 알림, URL, 카테고리 같은 정보는 CSV에 없으므로 필요하면 .ics를 보관하세요.
부유 시각에는 시간대가 없음
Z도 TZID도 없는 DTSTART는 부유 시각입니다. Timezone 셀이 비어 있어 CSV만으로는 어느 시간대를 뜻했는지 알 수 없습니다.
자주 묻는 질문
구글 캘린더 내보내기를 CSV로 바꾸려면?
구글 캘린더 설정에서 캘린더를 내보내 .ics 파일을 받고, 필요하면 압축을 푼 뒤 여기서 .ics를 여세요. 일정마다 한 행이 되고, CSV는 바로 복사하거나 events.csv로 내려받을 수 있습니다.
반복 일정을 개별 날짜로 펼쳐 주나요?
아니요. 반복 일정은 한 행이고 규칙은 Recurrence 열에 FREQ=WEEKLY;COUNT=2 같은 형태로 들어갑니다.
왜 어떤 셀은 작은따옴표로 시작하나요?
텍스트가 =, @, 탭으로 시작하거나 + 또는 - 뒤에 숫자가 아닌 내용이 와서 스프레드시트가 수식으로 실행할 수 있었기 때문입니다. 작은따옴표는 셀을 일반 텍스트로 만들며 엑셀과 구글 시트에서는 보이지 않습니다.
Timezone 열에는 무엇이 나오나요?
시작 시각에 TZID가 있으면 그 값, 시각이 Z로 끝나면 UTC, 부유 시각과 종일 일정은 빈칸입니다.
일정 수에 제한이 있나요?
있습니다. 입력 5 MiB, 일정 50,000개, CSV 출력 20 MiB입니다. 페이지의 표에는 처음 100개 일정만 나오지만 CSV에는 언제나 전부 들어갑니다.
CSV를 다시 캘린더로 바꿀 수 있나요?
손실 없이 되돌리지는 못합니다. CSV ICS 변환기는 자체 컬럼 매핑으로 스프레드시트에서 캘린더를 만들고 날짜와 시간을 별도 열로 받으므로, 이 열세 가지 열 구성은 먼저 모양을 바꿔야 합니다.
캘린더가 업로드되나요?
아니요. 입력한 내용은 브라우저 안에서 처리되며 서버로 전송되지 않으므로 제목, 장소, 설명이 탭 밖으로 나가지 않습니다.
마지막 업데이트:
