사용자가 최적의 하이킹 경로를 찾도록 도와주는 앱을 생각해 보세요. 하이킹 계획을 캘린더 일정으로 추가하면 사용자가 자동으로 체계적으로 일정을 유지하는 데 많은 도움을 받습니다. Google Calendar는 학생들이 계획을 공유하고 미리 상기시켜주어 스트레스 없이 준비할 수 있도록 도와줍니다. 또한 Google 제품이 원활하게 통합되기 때문에 Google Now는 사용자에게 출발 시간을 핑하고 Google 지도가 정시에 회의 장소로 안내합니다.
이 도움말에서는 캘린더 일정을 만들어 사용자의 캘린더에 추가하는 방법을 설명합니다.
일정 추가
이벤트를 만들려면 최소한 다음 매개변수를 제공하는 events.insert()
메서드를 호출합니다.
calendarId
는 캘린더 식별자이며 이벤트를 만들 캘린더의 이메일 주소 또는 로그인한 사용자의 기본 캘린더를 사용할 특수 키워드'primary'
일 수 있습니다. 사용할 캘린더의 이메일 주소를 모르는 경우 Google Calendar 웹 UI의 캘린더 설정('캘린더 주소' 섹션)에서 확인하거나calendarList.list()
호출의 결과에서 찾을 수 있습니다.event
는 시작 및 종료와 같은 필요한 모든 세부정보로 만들 이벤트입니다. 두 개의 필수 입력란은start
횟수와end
횟수뿐입니다. 이벤트 필드의 전체 집합은event
참조를 확인하세요.
이벤트를 성공적으로 만들려면 다음과 같이 해야 합니다.
- 사용자의 캘린더에 대한 수정 액세스 권한을 갖도록 OAuth 범위를
https://www.googleapis.com/auth/calendar
로 설정합니다. - 제공된
calendarId
를 사용하여 인증된 사용자에게 캘린더에 대한 쓰기 액세스 권한이 있는지 확인합니다 (예:calendarId
의calendarList.get()
를 호출하고accessRole
를 확인).
이벤트 메타데이터 추가
캘린더 일정을 만들 때 일정 메타데이터를 추가할 수도 있습니다. 생성 중에 메타데이터를 추가하지 않더라도 events.update()
를 사용하여 여러 필드를 업데이트할 수 있습니다. 하지만 이벤트 ID와 같은 일부 필드는 events.insert()
작업 중에만 설정할 수 있습니다.
- 위치
위치 필드에 주소를 추가하면 다음과 같은 기능을 사용할 수 있습니다.
"출발 시간 알림"이라고 말하거나 길찾기가 포함된 지도를 표시할 수 있습니다.
- 일정 ID
이벤트를 만들 때 나만의 이벤트 ID를 생성할 수 있습니다.
Google의 형식 요구사항을 준수해야 합니다. 이렇게 하면 로컬 데이터베이스의 항목을 Google Calendar의 일정과 동기화할 수 있습니다. 또한 Calendar 백엔드에서 작업이 성공적으로 실행된 후 어느 시점에 작업이 실패하면 중복 이벤트가 생성되지 않습니다. 이벤트 ID를 제공하지 않으면 서버에서 자동으로 생성합니다. 자세한 내용은 이벤트 ID 참조를 확인하세요.
- 참석자
내가 만든 일정은 다음의 모든 기본 Google 캘린더에 표시됩니다.
같은 일정 ID로 포함된 참석자 삽입 요청에서
sendNotifications
를true
로 설정하면 참석자에게 이벤트의 이메일 알림도 전송됩니다. 자세한 내용은 참석자가 여러 명인 이벤트 가이드를 참고하세요.
다음 예에서는 이벤트를 만들고 메타데이터를 설정하는 방법을 보여줍니다.
Go
// Refer to the Go quickstart on how to setup the environment:
// https://developers.google.com/calendar/quickstart/go
// Change the scope to calendar.CalendarScope and delete any stored credentials.
event := &calendar.Event{
Summary: "Google I/O 2015",
Location: "800 Howard St., San Francisco, CA 94103",
Description: "A chance to hear more about Google's developer products.",
Start: &calendar.EventDateTime{
DateTime: "2015-05-28T09:00:00-07:00",
TimeZone: "America/Los_Angeles",
},
End: &calendar.EventDateTime{
DateTime: "2015-05-28T17:00:00-07:00",
TimeZone: "America/Los_Angeles",
},
Recurrence: []string{"RRULE:FREQ=DAILY;COUNT=2"},
Attendees: []*calendar.EventAttendee{
&calendar.EventAttendee{Email:"lpage@example.com"},
&calendar.EventAttendee{Email:"sbrin@example.com"},
},
}
calendarId := "primary"
event, err = srv.Events.Insert(calendarId, event).Do()
if err != nil {
log.Fatalf("Unable to create event. %v\n", err)
}
fmt.Printf("Event created: %s\n", event.HtmlLink)
Java
// Refer to the Java quickstart on how to setup the environment:
// https://developers.google.com/calendar/quickstart/java
// Change the scope to CalendarScopes.CALENDAR and delete any stored
// credentials.
Event event = new Event()
.setSummary("Google I/O 2015")
.setLocation("800 Howard St., San Francisco, CA 94103")
.setDescription("A chance to hear more about Google's developer products.");
DateTime startDateTime = new DateTime("2015-05-28T09:00:00-07:00");
EventDateTime start = new EventDateTime()
.setDateTime(startDateTime)
.setTimeZone("America/Los_Angeles");
event.setStart(start);
DateTime endDateTime = new DateTime("2015-05-28T17:00:00-07:00");
EventDateTime end = new EventDateTime()
.setDateTime(endDateTime)
.setTimeZone("America/Los_Angeles");
event.setEnd(end);
String[] recurrence = new String[] {"RRULE:FREQ=DAILY;COUNT=2"};
event.setRecurrence(Arrays.asList(recurrence));
EventAttendee[] attendees = new EventAttendee[] {
new EventAttendee().setEmail("lpage@example.com"),
new EventAttendee().setEmail("sbrin@example.com"),
};
event.setAttendees(Arrays.asList(attendees));
EventReminder[] reminderOverrides = new EventReminder[] {
new EventReminder().setMethod("email").setMinutes(24 * 60),
new EventReminder().setMethod("popup").setMinutes(10),
};
Event.Reminders reminders = new Event.Reminders()
.setUseDefault(false)
.setOverrides(Arrays.asList(reminderOverrides));
event.setReminders(reminders);
String calendarId = "primary";
event = service.events().insert(calendarId, event).execute();
System.out.printf("Event created: %s\n", event.getHtmlLink());
JavaScript
// Refer to the JavaScript quickstart on how to setup the environment:
// https://developers.google.com/calendar/quickstart/js
// Change the scope to 'https://www.googleapis.com/auth/calendar' and delete any
// stored credentials.
const event = {
'summary': 'Google I/O 2015',
'location': '800 Howard St., San Francisco, CA 94103',
'description': 'A chance to hear more about Google\'s developer products.',
'start': {
'dateTime': '2015-05-28T09:00:00-07:00',
'timeZone': 'America/Los_Angeles'
},
'end': {
'dateTime': '2015-05-28T17:00:00-07:00',
'timeZone': 'America/Los_Angeles'
},
'recurrence': [
'RRULE:FREQ=DAILY;COUNT=2'
],
'attendees': [
{'email': 'lpage@example.com'},
{'email': 'sbrin@example.com'}
],
'reminders': {
'useDefault': false,
'overrides': [
{'method': 'email', 'minutes': 24 * 60},
{'method': 'popup', 'minutes': 10}
]
}
};
const request = gapi.client.calendar.events.insert({
'calendarId': 'primary',
'resource': event
});
request.execute(function(event) {
appendPre('Event created: ' + event.htmlLink);
});
Node.js
// Refer to the Node.js quickstart on how to setup the environment:
// https://developers.google.com/calendar/quickstart/node
// Change the scope to 'https://www.googleapis.com/auth/calendar' and delete any
// stored credentials.
const event = {
'summary': 'Google I/O 2015',
'location': '800 Howard St., San Francisco, CA 94103',
'description': 'A chance to hear more about Google\'s developer products.',
'start': {
'dateTime': '2015-05-28T09:00:00-07:00',
'timeZone': 'America/Los_Angeles',
},
'end': {
'dateTime': '2015-05-28T17:00:00-07:00',
'timeZone': 'America/Los_Angeles',
},
'recurrence': [
'RRULE:FREQ=DAILY;COUNT=2'
],
'attendees': [
{'email': 'lpage@example.com'},
{'email': 'sbrin@example.com'},
],
'reminders': {
'useDefault': false,
'overrides': [
{'method': 'email', 'minutes': 24 * 60},
{'method': 'popup', 'minutes': 10},
],
},
};
calendar.events.insert({
auth: auth,
calendarId: 'primary',
resource: event,
}, function(err, event) {
if (err) {
console.log('There was an error contacting the Calendar service: ' + err);
return;
}
console.log('Event created: %s', event.htmlLink);
});
2,399필리핀
$event = new Google_Service_Calendar_Event(array(
'summary' => 'Google I/O 2015',
'location' => '800 Howard St., San Francisco, CA 94103',
'description' => 'A chance to hear more about Google\'s developer products.',
'start' => array(
'dateTime' => '2015-05-28T09:00:00-07:00',
'timeZone' => 'America/Los_Angeles',
),
'end' => array(
'dateTime' => '2015-05-28T17:00:00-07:00',
'timeZone' => 'America/Los_Angeles',
),
'recurrence' => array(
'RRULE:FREQ=DAILY;COUNT=2'
),
'attendees' => array(
array('email' => 'lpage@example.com'),
array('email' => 'sbrin@example.com'),
),
'reminders' => array(
'useDefault' => FALSE,
'overrides' => array(
array('method' => 'email', 'minutes' => 24 * 60),
array('method' => 'popup', 'minutes' => 10),
),
),
));
$calendarId = 'primary';
$event = $service->events->insert($calendarId, $event);
printf('Event created: %s\n', $event->htmlLink);
Python
# Refer to the Python quickstart on how to setup the environment:
# https://developers.google.com/calendar/quickstart/python
# Change the scope to 'https://www.googleapis.com/auth/calendar' and delete any
# stored credentials.
event = {
'summary': 'Google I/O 2015',
'location': '800 Howard St., San Francisco, CA 94103',
'description': 'A chance to hear more about Google\'s developer products.',
'start': {
'dateTime': '2015-05-28T09:00:00-07:00',
'timeZone': 'America/Los_Angeles',
},
'end': {
'dateTime': '2015-05-28T17:00:00-07:00',
'timeZone': 'America/Los_Angeles',
},
'recurrence': [
'RRULE:FREQ=DAILY;COUNT=2'
],
'attendees': [
{'email': 'lpage@example.com'},
{'email': 'sbrin@example.com'},
],
'reminders': {
'useDefault': False,
'overrides': [
{'method': 'email', 'minutes': 24 * 60},
{'method': 'popup', 'minutes': 10},
],
},
}
event = service.events().insert(calendarId='primary', body=event).execute()
print 'Event created: %s' % (event.get('htmlLink'))
Ruby
event = Google::Apis::CalendarV3::Event.new(
summary: 'Google I/O 2015',
location: '800 Howard St., San Francisco, CA 94103',
description: 'A chance to hear more about Google\'s developer products.',
start: Google::Apis::CalendarV3::EventDateTime.new(
date_time: '2015-05-28T09:00:00-07:00',
time_zone: 'America/Los_Angeles'
),
end: Google::Apis::CalendarV3::EventDateTime.new(
date_time: '2015-05-28T17:00:00-07:00',
time_zone: 'America/Los_Angeles'
),
recurrence: [
'RRULE:FREQ=DAILY;COUNT=2'
],
attendees: [
Google::Apis::CalendarV3::EventAttendee.new(
email: 'lpage@example.com'
),
Google::Apis::CalendarV3::EventAttendee.new(
email: 'sbrin@example.com'
)
],
reminders: Google::Apis::CalendarV3::Event::Reminders.new(
use_default: false,
overrides: [
Google::Apis::CalendarV3::EventReminder.new(
reminder_method: 'email',
minutes: 24 * 60
),
Google::Apis::CalendarV3::EventReminder.new(
reminder_method: 'popup',
minutes: 10
)
]
)
)
result = client.insert_event('primary', event)
puts "Event created: #{result.html_link}"
일정에 Drive 첨부파일 추가하기
Docs의 회의록, Sheets의 예산, Slides의 프레젠테이션 또는 기타 관련 Google Drive 파일과 같은 Google Drive 파일을 캘린더 일정에 첨부할 수 있습니다. events.patch()
와 같이 업데이트의 일부로 events.insert()
이상으로 일정을 만들 때 연결을 추가할 수 있습니다.
일정에 Google Drive 파일을 첨부할 때는 다음 두 부분으로 구성됩니다.
- 일반적으로
files.get()
메서드를 사용하여 Drive API 파일 리소스에서alternateLink
URL,title
,mimeType
파일을 가져옵니다. - 요청 본문에
attachments
필드가 설정되고supportsAttachments
매개변수가true
로 설정된 이벤트를 만들거나 업데이트합니다.
다음 코드 예에서는 기존 이벤트를 업데이트하여 첨부파일을 추가하는 방법을 보여줍니다.
Java
public static void addAttachment(Calendar calendarService, Drive driveService, String calendarId,
String eventId, String fileId) throws IOException {
File file = driveService.files().get(fileId).execute();
Event event = calendarService.events().get(calendarId, eventId).execute();
List<EventAttachment> attachments = event.getAttachments();
if (attachments == null) {
attachments = new ArrayList<EventAttachment>();
}
attachments.add(new EventAttachment()
.setFileUrl(file.getAlternateLink())
.setMimeType(file.getMimeType())
.setTitle(file.getTitle()));
Event changes = new Event()
.setAttachments(attachments);
calendarService.events().patch(calendarId, eventId, changes)
.setSupportsAttachments(true)
.execute();
}
2,399필리핀
function addAttachment($calendarService, $driveService, $calendarId, $eventId, $fileId) {
$file = $driveService->files->get($fileId);
$event = $calendarService->events->get($calendarId, $eventId);
$attachments = $event->attachments;
$attachments[] = array(
'fileUrl' => $file->alternateLink,
'mimeType' => $file->mimeType,
'title' => $file->title
);
$changes = new Google_Service_Calendar_Event(array(
'attachments' => $attachments
));
$calendarService->events->patch($calendarId, $eventId, $changes, array(
'supportsAttachments' => TRUE
));
}
Python
def add_attachment(calendarService, driveService, calendarId, eventId, fileId):
file = driveService.files().get(fileId=fileId).execute()
event = calendarService.events().get(calendarId=calendarId,
eventId=eventId).execute()
attachments = event.get('attachments', [])
attachments.append({
'fileUrl': file['alternateLink'],
'mimeType': file['mimeType'],
'title': file['title']
})
changes = {
'attachments': attachments
}
calendarService.events().patch(calendarId=calendarId, eventId=eventId,
body=changes,
supportsAttachments=True).execute()
일정에 화상 및 전화 회의 추가
이벤트를 행아웃 및 Google Meet 회의와 연결하면 사용자가 전화 통화나 영상 통화를 통해 원격으로 회의할 수 있습니다.
conferenceData
필드는 기존 회의 세부정보를 읽고 복사하고 삭제하는 데 사용할 수 있습니다. 또한 새 회의 생성을 요청하는 데 사용할 수도 있습니다. 회의 세부정보 생성 및 수정을 허용하려면 conferenceDataVersion
요청 매개변수를 1
로 설정합니다.
conferenceData.conferenceSolution.key.type
로 표시된 현재 세 가지 유형의 conferenceData
가 지원됩니다.
- 일반 사용자용 행아웃 (
eventHangout
개) - 사용자를 위한 Google Workspace 기존 행아웃(지원 중단됨,
eventNamedHangout
) - Google Meet (
hangoutsMeet
)
calendars
및 calendarList
컬렉션에서 conferenceProperties.allowedConferenceSolutionTypes
를 확인하여 사용자의 특정 캘린더에 지원되는 회의 유형을 확인할 수 있습니다. 또한 settings
컬렉션에서 autoAddHangouts
설정을 확인하여 사용자가 새로 만든 모든 이벤트에 대해 행아웃을 생성하는 것을 선호하는지 알아볼 수 있습니다.
type
외에 conferenceSolution
는 아래와 같이 회의 솔루션을 나타내는 데 사용할 수 있는 name
및 iconUri
필드도 제공합니다.
JavaScript
const solution = event.conferenceData.conferenceSolution;
const content = document.getElementById("content");
const text = document.createTextNode("Join " + solution.name);
const icon = document.createElement("img");
icon.src = solution.iconUri;
content.appendChild(icon);
content.appendChild(text);
새로 생성된 requestId
(임의 string
일 수 있음)를 createRequest
에 제공하여 이벤트에 관한 새 회의를 만들 수 있습니다. 회의는 비동기식으로 생성되지만 언제든지 요청 상태를 확인하여 사용자에게 현재 상황을 알릴 수 있습니다.
예를 들어 기존 이벤트의 회의 생성을 요청하려면 다음 단계를 따르세요.
JavaScript
const eventPatch = {
conferenceData: {
createRequest: {requestId: "7qxalsvy0e"}
}
};
gapi.client.calendar.events.patch({
calendarId: "primary",
eventId: "7cbh8rpc10lrc0ckih9tafss99",
resource: eventPatch,
sendNotifications: true,
conferenceDataVersion: 1
}).execute(function(event) {
console.log("Conference created for event: %s", event.htmlLink);
});
이 호출에 대한 즉각적인 응답에는 아직 완전히 채워진 conferenceData
가 포함되지 않을 수 있습니다. 이는 status 필드에 pending
의 상태 코드로 표시됩니다. 회의 정보가 채워지면 상태 코드가 success
로 변경됩니다. entryPoints
필드에는 사용자가 전화로 참여할 수 있는 동영상 및 전화 URI에 관한 정보가 포함됩니다.
회의 세부정보가 동일한 여러 캘린더 일정을 예약하려면 한 일정에서 다른 일정으로 conferenceData
전체를 복사하면 됩니다.
복사는 특정 상황에서 유용합니다. 예를 들어 지원자와 면접관을 위한 별도의 이벤트를 설정하는 채용 애플리케이션을 개발 중이라고 가정해 보겠습니다. 이 경우 면접관의 신분은 보호해야 하지만 모든 참여자가 동일한 다자간 통화에 참여하도록 할 수 있습니다.