Imagine um app que ajude os usuários a encontrar as melhores trilhas para caminhada. Ao adicionar o plano de caminhada como um evento da agenda, os usuários recebem muita ajuda para se manterem organizados automaticamente. O Google Agenda ajuda a compartilhar o plano e lembra os usuários dele para que eles possam se preparar sem estresse. Além disso, graças à integração perfeita dos produtos do Google, o Google Now informa a hora de sair e o Google Maps direciona os usuários ao local da reunião.
Este artigo explica como criar eventos da agenda e adicioná-los às agendas dos usuários.
Adicionar um evento
Para criar um evento, chame o
events.insert() método fornecendo pelo
menos estes parâmetros:
calendarIdé o identificador da agenda e pode ser o endereço de e-mail da agenda em que o evento será criado ou uma palavra-chave especial'primary'que usará a agenda principal do usuário conectado. Se você não souber o endereço de e-mail da agenda que quer usar, você pode verificar nas configurações da agenda da interface da Web do Google Agenda (na seção "Endereço da agenda") ou procurar no resultado dacalendarList.list()chamada.eventé o evento a ser criado com todos os detalhes necessários, como início e fim. Os únicos dois campos obrigatórios são os horários destarteend. Consulte aeventreferência para ver o conjunto completo de campos de eventos.
Para criar eventos, você precisa:
- Definir o escopo do OAuth como
https://www.googleapis.com/auth/calendarpara ter acesso de edição à agenda do usuário. - Verificar se o usuário autenticado tem acesso de gravação à agenda com o
calendarIdfornecido (por exemplo, chamandocalendarList.get()para ocalendarIde verificando oaccessRole).
Adicionar metadados de eventos
Você pode adicionar metadados de eventos ao criar um evento da agenda. Se você
não adicionar metadados durante a criação, poderá atualizar muitos campos usando
events.update(). No entanto, alguns campos,
como o ID do evento, só podem ser definidos durante uma operação
events.insert().
- Local
- A adição de um endereço no campo de local ativa recursos como "hora de sair" ou a exibição de um mapa com as rotas.
- ID do evento
- Ao criar um evento, você pode gerar seu próprio ID de evento que esteja em conformidade com nossos requisitos de formato. Isso permite manter as entidades no banco de dados local sincronizadas com os eventos no Google Agenda. Ele também impede a criação de eventos duplicados se a operação falhar em algum momento após a execução bem-sucedida no back-end do Google Agenda. Se nenhum ID de evento for fornecido, o servidor vai gerar um para você. Consulte a referência do ID do evento para mais informações.
- Participantes
- O evento criado aparece em todas as agendas principais do Google dos participantes incluídos com o mesmo ID de evento. Se você definir
sendUpdatescomo"all"ou"externalOnly"na solicitação de inserção, os participantes correspondentes vão receber uma notificação por e-mail sobre o evento. Para saber mais, consulte Eventos com vários participantes.
Os exemplos a seguir demonstram a criação de um evento e a definição dos metadados dele:
Go
// 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'))
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}"
Adicionar anexos do Drive a eventos
Você pode anexar arquivos do Google Drive
como atas de reuniões no Documentos, orçamentos nas
Planilhas, apresentações no Slides ou qualquer outro
arquivo relevante do Google Drive aos eventos da agenda. Você pode adicionar o
anexo ao criar um evento com
events.insert() ou mais tarde como parte de uma
atualização, como com events.patch()
As duas partes de anexar um arquivo do Google Drive a um evento são:
- Receber o URL
alternateLink,titleemimeTypedo recurso Arquivos da API Drive, normalmente com o métodofiles.get(). - Criar ou atualizar um evento com os campos
attachmentsdefinidos no corpo da solicitação e o parâmetrosupportsAttachmentsdefinido comotrue.
O exemplo de código a seguir demonstra como atualizar um evento para adicionar um anexo:
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()
Adicionar videoconferências e teleconferências a eventos
Você pode associar eventos a Hangouts e do Google Meet para permitir que os usuários se encontrem remotamente por uma ligação ou uma videochamada.
O campo conferenceData pode
ser usado para ler, copiar e limpar detalhes de videoconferências. Ele também pode ser
usado para solicitar a geração de novas videoconferências. Para permitir a criação e modificação dos detalhes da videoconferência, defina o parâmetro de solicitação conferenceDataVersion como 1.
Há três tipos de conferenceData com suporte no momento, conforme indicado por
conferenceData.conferenceSolution.key.type:
- Hangouts para consumidores (
eventHangout) - Hangouts clássico para usuários do Google Workspace (descontinuado;
eventNamedHangout) - Google Meet (
hangoutsMeet)
Para saber qual tipo de videoconferência é compatível com uma agenda de um
usuário, consulte o conferenceProperties.allowedConferenceSolutionTypes nas
coleções calendars e
calendarList. Você também pode
verificar se o usuário prefere que o Hangouts seja criado para todos os eventos recém-
criados verificando a configuração autoAddHangouts na
settings coleção.
Além do type, o conferenceSolution também fornece os campos name e iconUri que podem ser usados para representar a solução de videoconferência, conforme mostrado abaixo:
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);
Você pode criar uma nova videoconferência para um evento fornecendo um createRequest com um requestId recém-gerado, que pode ser uma string aleatória. As videoconferências são criadas de forma assíncrona, mas você sempre pode verificar o status da solicitação para informar aos usuários o que está acontecendo.
Por exemplo, para solicitar a geração de videoconferências para um evento:
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);
});
A resposta imediata a essa chamada ainda não pode conter o
conferenceData totalmente preenchido. Isso é indicado por um código de status pending no
status
campo. O código de status muda para success depois que as informações da videoconferência são preenchidas. O campo entryPoints contém informações sobre quais URIs de vídeo e telefone estão disponíveis para os usuários ligarem para reunião.
Se você quiser programar vários eventos da agenda com os mesmos detalhes de videoconferência, copie todo o conferenceData de um evento para outro.
A cópia é útil em determinadas situações. Por exemplo, suponha que você esteja desenvolvendo um aplicativo de recrutamento que configura eventos separados para o candidato e o entrevistador. Você quer proteger a identidade do entrevistador, mas também quer garantir que todos os participantes entrem na mesma teleconferência.