Представьте себе приложение, которое помогает пользователям находить лучшие маршруты для пеших прогулок. Добавив план похода в качестве события в календаре, пользователи автоматически получают большую помощь в организации своих дел. Google Календарь позволяет им делиться планом и напоминает о нем, чтобы они могли подготовиться без лишнего стресса. Кроме того, благодаря бесшовной интеграции продуктов Google, Google Now уведомляет их о времени отправления, а Google Карты точно указывают место встречи.
В этой статье объясняется, как создавать события в календаре и добавлять их в календари пользователей.
Добавить событие
Для создания события вызовите метод events.insert() , указав как минимум следующие параметры:
-
calendarId— это идентификатор календаря, который может представлять собой либо адрес электронной почты календаря, для которого нужно создать событие, либо специальное ключевое слово'primary', которое будет использовать основной календарь авторизованного пользователя. Если вы не знаете адрес электронной почты календаря, который хотите использовать, вы можете проверить его либо в настройках календаря в веб-интерфейсе Google Календаря (в разделе «Адрес календаря»), либо найти его в результате вызоваcalendarList.list(). -
event— это событие, которое необходимо создать со всеми необходимыми данными, такими как время начала и окончания. Обязательными являются только два поля: времяstartиend. Полный набор полей для описания событий см. в справочникеevent.
Для успешного создания мероприятий вам необходимо:
- Установите область действия OAuth на
https://www.googleapis.com/auth/calendar, чтобы у вас был доступ на редактирование календаря пользователя. - Убедитесь, что авторизованный пользователь имеет права на запись в календарь с указанным вами
calendarId(например, вызвавcalendarList.get()дляcalendarIdи проверивaccessRole).
Добавить метаданные события
При создании события в календаре можно дополнительно добавить метаданные. Если вы решите не добавлять метаданные при создании, вы сможете обновить многие поля с помощью метода events.update() ; однако некоторые поля, такие как идентификатор события, можно установить только во время операции events.insert() .
- Расположение
- Добавление адреса в поле местоположения активирует такие функции, как «время до выезда» или отображение карты с указанием маршрута.
- Идентификатор события
- При создании события вы можете выбрать генерацию собственного идентификатора события, соответствующего нашим требованиям к формату. Это позволяет синхронизировать сущности в вашей локальной базе данных с событиями в Google Календаре. Это также предотвращает создание дубликатов событий, если операция завершится неудачей после успешного выполнения в административной панели Календаря. Если идентификатор события не указан, сервер сгенерирует его для вас. Дополнительную информацию см. в справочнике по идентификаторам событий .
- Участники
- Созданное вами событие отображается во всех основных календарях Google участников, которым вы присвоили один и тот же идентификатор события. Если вы установите
sendUpdatesв значение"all"или"externalOnly"в запросе на добавление события, соответствующие участники получат уведомление по электронной почте о вашем событии. Для получения дополнительной информации см. раздел "События с несколькими участниками" .
Следующие примеры демонстрируют создание события и установку его метаданных:
Идти
// Refer to the Go quickstart on how to setup the environment:
// https://developers.google.com/workspace/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/workspace/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/workspace/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/workspace/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
$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/workspace/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'))
Руби
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 Drive , такие как протоколы совещаний в Документах, бюджеты в Таблицах, презентации в Slides или любые другие соответствующие файлы Google Drive. Добавить вложение можно при создании события с помощью events.insert() или позже в рамках обновления, например, с помощью events.patch()
Процесс прикрепления файла из Google Диска к мероприятию состоит из двух частей:
- Получите URL-адрес файла
alternateLink,title) иmimeTypeиз ресурса Files API Google Drive , обычно с помощью методаfiles.get(). - Создайте или обновите событие, указав поля
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 :
- Hangouts для потребителей (
eventHangout) - Классические Hangouts для пользователей Google Workspace (устарело;
eventNamedHangout) - Google Meet (
hangoutsMeet)
Вы можете узнать, какой тип конференции поддерживается для конкретного календаря пользователя, посмотрев параметр conferenceProperties.allowedConferenceSolutionTypes в коллекциях calendars и calendarList . Вы также можете узнать, предпочитает ли пользователь, чтобы для всех его новых событий создавались Hangouts, проверив параметр autoAddHangouts в коллекции settings .
Помимо 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,
sendUpdates: "all",
conferenceDataVersion: 1
}).execute(function(event) {
console.log("Conference created for event: %s", event.htmlLink);
});
В ответе на этот звонок conferenceData могут быть еще не полностью заполнены; это обозначается кодом состояния « pending в поле «статус» . После заполнения информации о конференции код состояния меняется на success . Поле entryPoints содержит информацию о том, какие URI для видео- и телефонных звонков доступны для подключения ваших пользователей.
Если вы хотите запланировать несколько событий в календаре с одинаковыми данными о конференции, вы можете скопировать все conferenceData из одного события в другое.
Копирование полезно в определенных ситуациях. Например, предположим, вы разрабатываете приложение для подбора персонала, которое создает отдельные мероприятия для кандидата и интервьюера — вы хотите защитить личность интервьюера, но также хотите убедиться, что все участники присоединятся к одному и тому же конференц-звонку.