Imagina una app que ayuda a los usuarios a encontrar las mejores rutas de senderismo. Si agregas el plan de senderismo como un evento de calendario, los usuarios obtendrán ayuda para mantenerse organizados automáticamente. El Calendario de Google los ayuda a compartir el plan y les recuerda sobre él para que puedan prepararse sin estrés. Además, gracias a la integración perfecta de los productos de Google, Google Maps los dirige al lugar de reunión a tiempo.
En este artículo, se explica cómo crear eventos de calendario y agregarlos a los calendarios de los usuarios.
Agregar un evento
Para crear un evento, llama al
events.insert método,
y proporciona al menos estos parámetros:
calendarIdes el identificador del calendario y puede ser la dirección de correo electrónico del calendario en el que se creará el evento o una palabra clave especial'primary', que usa el calendario principal del usuario que accedió. Si no conoces la dirección de correo electrónico del calendario que deseas usar, puedes consultarla en la configuración del calendario en la IU web del Calendario (en la sección "Dirección del calendario") o puedes buscarla en el resultado de lacalendarList.listllamada.eventes el evento que se creará con todos los detalles necesarios, como el inicio y el final. Los únicos dos campos obligatorios son las horasstartyend. Consulta la referencia del recursoEventspara ver el conjunto completo de campos de eventos.
Para crear eventos, haz lo siguiente:
- Configura tu alcance de OAuth en
https://www.googleapis.com/auth/calendarpara tener acceso de edición al calendario del usuario. - Asegúrate de que el usuario autenticado tenga acceso de escritura al calendario con el
calendarIdque proporcionaste (por ejemplo, llamando acalendarList.getpara elcalendarIdy verificando elaccessRole).
Agregar metadatos de eventos
De forma opcional, puedes agregar metadatos de eventos cuando creas un evento de calendario. Si
decides no agregar metadatos durante la creación, puedes actualizar muchos campos con el
events.update método.
Sin embargo, algunos campos, como el ID del evento, solo se pueden configurar durante una operación
events.insert.
- Ubicación
- Si agregas una dirección en el campo de ubicación, se habilitan funciones como "Hora de salida" o se muestra un mapa con instrucciones sobre cómo llegar.
- ID del evento
- Cuando creas un evento, puedes generar tu propio ID de evento que cumpla con los requisitos de formato. Esto te permite mantener las entidades de tu base de datos local sincronizadas con los eventos del Calendario. También evita la creación de eventos duplicados si la operación falla en algún momento después de que se ejecuta correctamente en el backend del Calendario. Si no proporcionas un ID de evento, el servidor genera uno. Consulta la referencia del ID de evento para obtener más información.
- Participantes
- El evento que crees aparecerá en todos los calendarios principales de los participantes que incluiste con el mismo ID de evento. Si configuras
sendUpdatescomo"all"o"externalOnly"en tu solicitud de inserción, los asistentes correspondientes recibirán una notificación por correo electrónico para tu evento. Para obtener más información, consulta eventos con varios asistentes.
En los siguientes ejemplos, se muestra cómo crear un evento y configurar sus metadatos:
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}"
Agregar archivos adjuntos de Drive a eventos
Puedes adjuntar archivos de Google Drive como notas de la reunión en Documentos de Google, presupuestos en Hojas de cálculo de Google, presentaciones en Presentaciones de Google o cualquier otro archivo de Drive relevante a tus eventos de calendario. Puedes agregar el
archivo adjunto cuando creas un evento con
events.insert
o más adelante como parte de una actualización, como con
events.patch.
Las dos partes de adjuntar un archivo de Drive a un evento son las siguientes:
- Obtén la URL
alternateLink,titleymimeTypedel recurso Files de la API de Google Drive, por lo general, con elfiles.getmétodo. - Crea o actualiza un evento con los campos
attachmentsconfigurados en el cuerpo de la solicitud y el parámetrosupportsAttachmentsconfigurado comotrue.
En el siguiente ejemplo de código, se muestra cómo actualizar un evento existente para agregar un archivo adjunto:
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()
Agregar reuniones de video y telefónicas a eventos
Puedes asociar eventos con reuniones de Google Meet para permitir que los usuarios se reúnan de forma remota a través de una llamada telefónica o una videollamada.
El conferenceData
campo te permite leer, copiar y borrar los detalles de las reuniones existentes, o solicitar la
generación de reuniones nuevas. Para permitir la creación y modificación de los detalles de las reuniones, configura el parámetro de solicitud conferenceDataVersion como 1.
Se admiten los siguientes tipos de reuniones, como se indica en conferenceData.conferenceSolution.key.type:
- Google Meet (
hangoutsMeet)
Puedes consultar qué tipo de reunión se admite para un calendario determinado de un
usuario si observas el conferenceProperties.allowedConferenceSolutionTypes en
las colecciones calendars y
calendarList.
Además del type, el conferenceSolution también proporciona los campos name y iconUri que puedes usar para representar la solución de reuniones como se muestra a continuación:
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);
Puedes crear una reunión nueva para un evento si proporcionas un createRequest con un requestId recién generado como una cadena aleatoria. Las reuniones se crean de forma asíncrona, pero siempre puedes consultar el estado de tu solicitud para informar a los usuarios lo que sucede.
Por ejemplo, para solicitar la generación de reuniones para un evento existente, haz lo siguiente:
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);
});
Es posible que la respuesta inmediata a esta llamada aún no contenga el
conferenceData completamente propagado. El campo status
contiene pending. El código de estado cambia a success después de que se propaga la información de la reunión. El campo entryPoints contiene información sobre qué URIs de video y teléfono están disponibles para que los usuarios llamen.
Si deseas programar varios eventos de Calendario con los mismos detalles de la reunión, puedes copiar todo el conferenceData de un evento a otro.
La copia es útil en ciertas situaciones. Por ejemplo, supongamos que estás desarrollando una aplicación de reclutamiento que configura eventos separados para el candidato y el entrevistador. Deseas proteger la identidad del entrevistador, pero también quieres asegurarte de que todos los participantes se unan a la misma llamada de conferencia.