Imagine um app que ajuda os usuários a encontrar as melhores rotas de caminhada. Ao adicionar o plano de caminhada como um evento da agenda, os usuários recebem muita ajuda para se manter organizados automaticamente. O Google Agenda ajuda a compartilhar o plano e lembrar o usuário para que ele possa se preparar sem estresse. Além disso, graças à integração perfeita dos produtos do Google, o Google Now avisa sobre a hora de partir, e o Google Maps os direciona ao local da reunião na hora certa.
Este artigo explica como criar eventos de agenda e adicioná-los às agendas dos usuários.
Adicionar um evento
Para criar um evento, chame o método
events.insert()
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 vai usar a agenda principal do usuário conectado. Se você não souber o endereço de e-mail da agenda que gostaria de usar, verifique nas configurações da agenda na interface da Web do Google Agenda (na seção "Endereço da agenda") ou procure no resultado da chamadacalendarList.list()
.event
é o evento a ser criado com todos os detalhes necessários, como início e término. Os únicos dois campos obrigatórios são os horáriosstart
eend
. Consulte a referênciaevent
para conferir o conjunto completo de campos de eventos.
Para criar eventos, você precisa:
- Defina o escopo do OAuth como
https://www.googleapis.com/auth/calendar
para ter acesso de edição à agenda do usuário. - Verifique se o usuário autenticado tem acesso de gravação ao calendário com o
calendarId
fornecido. Por exemplo, chamandocalendarList.get()
para ocalendarId
e verificando oaccessRole
.
Adicionar metadados do evento
Você pode adicionar metadados de eventos quando cria um evento no Google Agenda. Se você
escolher não adicionar metadados durante a criação, poderá atualizar muitos campos usando o
events.update()
. No entanto, alguns campos,
como o ID do evento, só podem ser definidos durante uma
operação events.insert()
.
- Local
Adicionar um endereço ao campo de local ativa recursos como:
"time to leave" ou mostrando um mapa com as direções.
- 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 que você mantenha as entidades no seu 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 ser executada 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 de evento para mais informações.
- Participantes
O evento criado aparece em todas as agendas principais do
os participantes que você incluiu com o mesmo ID de evento. Se você definir
sendNotifications
comotrue
na solicitação de inserção, os participantes também vão receber uma notificação por e-mail sobre o evento. Consulte o guia de eventos com vários participantes para mais informações.
Os exemplos a seguir demonstram como criar um evento e definir os metadados dele:
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
$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}"
Adicionar anexos do Drive a eventos
É possível anexar arquivos do Google Drive, como anotações de reuniões no app Documentos, orçamentos nas
Planilhas, apresentações no app Apresentações ou qualquer outro
arquivo relevante do Google Drive aos seus eventos do Agenda. É possível adicionar o
anexo ao criar um evento com
events.insert()
ou mais recente 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:
- Receba o URL
alternateLink
,title
emimeType
do arquivo do recurso de arquivos da API Drive, normalmente com o métodofiles.get()
. - Crie ou atualize um evento com os campos
attachments
definidos no corpo da solicitação e o parâmetrosupportsAttachments
definido comotrue
.
O exemplo de código abaixo 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 conferências por telefone a eventos
É possível associar eventos a Hangouts e Google Meet para permitir que os usuários se reúnam remotamente por uma ligação ou videochamada.
O campo conferenceData
pode
ser usado para ler, copiar e limpar os detalhes de conferências atuais. Ele também pode ser
usado para solicitar a geração de novas conferências. Para permitir a criação e
a modificação de detalhes da conferência, defina o parâmetro de solicitação
conferenceDataVersion
como 1
.
Há três tipos de conferenceData
com suporte no momento, conforme indicado pelo
conferenceData.conferenceSolution.key.type
:
- Hangouts para consumidores (
eventHangout
) - Hangouts clássico para usuários do
(descontinuado;
eventNamedHangout
) - Google Meet (
hangoutsMeet
)
Para saber qual tipo de conferência é aceito em qualquer agenda de um
usuário, consulte o conferenceProperties.allowedConferenceSolutionTypes
nas
coleções calendars
e
calendarList
. Também é possível
saber se o usuário prefere que o Hangouts seja criado para todos os eventos
recém-criados verificando a configuração autoAddHangouts
na
coleção settings
.
Além de type
, o conferenceSolution
também fornece os campos name
e
iconUri
, que podem ser usados para representar a solução de conferê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);
É possível criar uma nova conferência para um evento fornecendo um createRequest
com
um requestId
recém-gerado, que pode ser um string
aleatório. As conferências são
criadas de forma assíncrona, mas você pode verificar o status da solicitação para
informar aos usuários o que está acontecendo.
Por exemplo, para solicitar a geração de conferências para um evento atual:
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);
});
A resposta imediata a essa chamada pode não conter o conferenceData
preenchido. Isso é indicado por um código de status pending
no
campo
status. O código de status muda para success
depois que as informações da conferê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.
Se você quiser programar vários eventos da Agenda com os mesmos
detalhes da conferência, copie o conferenceData
inteiro 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 configure eventos separados para o candidato e o entrevistador. Você quer proteger a identidade do entrevistador, mas também quer garantir que todos os participantes participem da mesma chamada de conferência.