假设有一款应用可帮助用户找到最佳远足路线。通过将徒步旅行计划添加为日历活动,用户可获得许多帮助,让其自动整理内容。Google 日历帮助他们分享计划,并提醒他们制定计划,让他们可以毫无压力地做好准备。此外,得益于 Google 产品无缝集成,Google 即时 ping 他们出发的时间,Google 地图会准时将他们引导至会议地点。
本文介绍如何创建日历活动并将其添加到用户的日历中。
添加活动
如需创建事件,请调用至少提供以下参数的 events.insert()
方法:
calendarId
是日历标识符,可以是用于创建事件的日历的电子邮件地址,也可以是将使用已登录用户主日历的特殊关键字'primary'
。如果您不知道要使用的日历的电子邮件地址,则可以在 Google 日历网页界面的日历设置(“日历网址”部分)中进行检查,也可以在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 日历后端中成功执行某项操作后,操作失败,系统也会创建重复的活动。如果未提供事件 ID,服务器会为您生成事件 ID。如需了解详情,请参阅事件 ID 参考文档。
- 参加者
- 您创建的活动会显示在您具有相同活动 ID 的所有参加者的主 Google 日历中。如果您在插入请求中将
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);
});
PHP
// Refer to the PHP quickstart on how to setup the environment:
// https://developers.google.com/calendar/quickstart/php
// Change the scope to Google_Service_Calendar::CALENDAR and delete any stored
// credentials.
$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}"
为活动添加云端硬盘附件
您可以在日历活动中附加 Google 云端硬盘文件,例如 Google 文档中的会议记录、Google 表格中的预算、Google 幻灯片中的演示文稿或任何其他相关的 Google 云端硬盘文件。在使用 events.insert()
或更高版本创建事件时,您可以在更新过程中添加附件,例如使用 events.patch()
将 Google 云端硬盘文件附加到活动的两个部分是:
- 通常通过
files.get()
方法从 Drive API Files 资源获取文件alternateLink
网址、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();
}
PHP
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()
向活动中添加视频和电话会议
您可以将活动与 Hangouts 和 Google Meet 会议相关联,以便用户通过电话或视频通话远程加入会议。
conferenceData
字段可用于读取、复制和清除现有的会议详细信息,还可以用于请求生成新会议。如需允许修改会议详细信息,请将 conferenceDataVersion
请求参数设置为 1
。
目前支持三种类型的 conferenceData
,由 conferenceData.conferenceSolution.key.type
表示:
- 面向普通用户的环聊 (
eventHangout
) - 面向用户的 Google Workspace 传统版 Hangouts
(已弃用;
eventNamedHangout
) - Google Meet (
hangoutsMeet
)
您可以查看 calendars
和 calendarList
集合中的 conferenceProperties.allowedConferenceSolutionTypes
,了解用户的任何给定日历支持的会议类型。您还可以通过检查 settings
集合中的 autoAddHangouts
设置,了解用户是否愿意为自己创建的所有活动创建 Hangouts。
除了 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);
您可以为 createRequest
提供新生成的 requestId
(可以是随机的 string
),为活动创建新会议。会议是异步创建的,但您可以随时查看请求的状态,让用户了解情况。
例如,如需为现有活动请求生成会议,请执行以下操作:
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
从一个活动复制到另一个活动中。
在某些情况下,复制操作非常有用。例如,假设您正在开发一个招聘应用,该应用为候选人和面试官分别设置事件。您希望保护面试者的身份,但还需要确保所有参与者都加入同一场电话会议。