Создать события

Представьте себе приложение, которое помогает пользователям находить лучшие пешеходные маршруты. Добавляя план похода в качестве события календаря, пользователи получают большую помощь в автоматическом обеспечении организованности. Календарь Google помогает им поделиться планом и напоминает о нем, чтобы они могли подготовиться без стресса. Кроме того, благодаря полной интеграции продуктов Google, Google Now сообщает им, когда пора уйти, а Google Maps вовремя направляет их к месту встречи.

В этой статье объясняется, как создавать события календаря и добавлять их в календари пользователей.

Добавить событие

Чтобы создать событие, вызовите метод 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

участники, которых вы включили с тем же идентификатором мероприятия. Если вы установите для параметра sendNotifications значение true в запросе на вставку, участники также получат уведомление по электронной почте о вашем событии. Дополнительную информацию см. в руководстве по мероприятиям с несколькими участниками .

Следующие примеры демонстрируют создание события и настройку его метаданных:

Идти

// 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)

Джава

// 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);

Питон

# 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'))

Рубин

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 Диска. Вы можете добавить вложение при создании события с помощью events.insert() или позже как часть обновления, например с помощью events.patch()

Прикрепление файла Google Диска к событию состоит из двух частей:

  1. Получите URL-адрес, title и mimeType файла alternateLink из ресурса Drive API Files , обычно с помощью метода files.get() .
  2. Создайте или обновите событие, установив поля attachments в тексте запроса и установив для параметра supportsAttachments значение true .

В следующем примере кода показано, как обновить существующее событие, чтобы добавить вложение:

Джава

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
  ));
}

Питон

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 :

  1. Hangouts для обычных пользователей ( eventHangout )
  2. Классическая версия Hangouts для пользователей Google Workspace (устарело; eventNamedHangout )
  3. 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,
  sendNotifications: true,
  conferenceDataVersion: 1
}).execute(function(event) {
  console.log("Conference created for event: %s", event.htmlLink);
});

Немедленный ответ на этот вызов может еще не содержать полностью заполненных conferenceData ; на это указывает код состояния pending в поле статуса . Код состояния изменится на success после заполнения информации о конференции. Поле entryPoints содержит информацию о том, какие URI видео и телефона доступны вашим пользователям для подключения.

Если вы хотите запланировать несколько событий календаря с одинаковыми сведениями о конференции, вы можете скопировать все conferenceData из одного события в другое.

Копирование полезно в определенных ситуациях. Например, предположим, что вы разрабатываете приложение для набора персонала, которое настраивает отдельные события для кандидата и интервьюера — вы хотите защитить личность интервьюера, но вы также хотите, чтобы все участники присоединялись к одной и той же конференц-связи.