Crea eventos

Imagina una app que ayuda a los usuarios a encontrar las mejores rutas de senderismo. Si agregas el plan de caminata como un evento de calendario, los usuarios reciben mucha ayuda para mantenerse organizados automáticamente. El Calendario de Google los ayuda a compartir el plan y les recuerda que lo tienen para que puedan prepararse sin estrés. Además, gracias a la integración perfecta de los productos de Google, Google Now les avisa cuándo deben salir y Google Maps los dirige al punto de encuentro a tiempo.

En este artículo, se explica cómo crear eventos de calendario y agregarlos a los calendarios de tus usuarios.

Agregar un evento

Para crear un evento, llama al método events.insert() y proporciona, al menos, estos parámetros:

  • calendarId es 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 usará 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 de la IU web de Calendario de Google (en la sección "Dirección del calendario") o buscarla en el resultado de la llamada calendarList.list().
  • event es el evento que se creará con todos los detalles necesarios, como el inicio y el final. Los únicos dos campos obligatorios son las horas start y end. Consulta la referencia de event para ver el conjunto completo de campos de eventos.

Para crear eventos correctamente, debes hacer lo siguiente:

  • Establece tu alcance de OAuth en https://www.googleapis.com/auth/calendar para tener acceso de edición al calendario del usuario.
  • Asegúrate de que el usuario autenticado tenga acceso de escritura al calendario con el calendarId que proporcionaste (por ejemplo, llamando a calendarList.get() para el calendarId y verificando el accessRole).

Agrega metadatos de eventos

De forma opcional, puedes agregar metadatos del evento cuando creas un evento de calendario. Si decides no agregar metadatos durante la creación, puedes actualizar muchos campos con events.update(). Sin embargo, algunos campos, como el ID del evento, solo se pueden establecer durante una operación de events.insert().

Ubicación
Agregar una dirección en el campo de ubicación habilita funciones como "Hora de salida" o la visualización de un mapa con las instrucciones sobre cómo llegar.
ID de evento
Cuando creas un evento, puedes generar tu propio ID de evento que cumpla con nuestros requisitos de formato. Esto te permite mantener las entidades de tu base de datos local sincronizadas con los eventos de Calendario de Google. También evita la creación de eventos duplicados si la operación falla en algún punto después de que se ejecuta correctamente en el backend del Calendario. Si no se proporciona un ID de evento, el servidor generará uno por ti. Consulta la referencia de ID de evento para obtener más información.
Participantes
El evento que crees aparecerá en todos los calendarios principales de Google de los asistentes que incluiste con el mismo ID de evento. Si configuras sendUpdates como "all" o "externalOnly" en tu solicitud de inserción, los asistentes correspondientes recibirán una notificación por correo electrónico sobre 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 establecer 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}"

Cómo agregar archivos adjuntos de Drive a eventos

Puedes adjuntar archivos de Google Drive, como notas de reuniones en Documentos, presupuestos en Hojas de cálculo, presentaciones en Presentaciones o cualquier otro archivo relevante de Google Drive a tus eventos del calendario. Puedes agregar el adjunto cuando crees un evento con events.insert() o más adelante como parte de una actualización, como con events.patch().

Para adjuntar un archivo de Google Drive a un evento, debes seguir estos dos pasos:

  1. Obtén la URL del archivo alternateLink, title y mimeType del recurso Files de la API de Drive, por lo general, con el método files.get().
  2. Crea o actualiza un evento con los campos attachments establecidos en el cuerpo de la solicitud y el parámetro supportsAttachments establecido en true.

En el siguiente ejemplo de código, se muestra cómo actualizar un evento existente para agregar un 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 los eventos

Puedes asociar eventos con conferencias de Hangouts y Google Meet para permitir que tus usuarios se reúnan de forma remota a través de una llamada de voz o una videollamada.

El campo conferenceData se puede usar para leer, copiar y borrar los detalles de conferencias existentes, y también para solicitar la generación de conferencias nuevas. Para permitir la creación y modificación de los detalles de la conferencia, establece el parámetro de solicitud conferenceDataVersion en 1.

Actualmente, se admiten tres tipos de conferenceData, como se indica en conferenceData.conferenceSolution.key.type:

  1. Hangouts para consumidores (eventHangout)
  2. Versión clásica de Hangouts para usuarios de Google Workspace (obsoleto; eventNamedHangout)
  3. Google Meet (hangoutsMeet)

Para saber qué tipo de conferencia se admite en un calendario determinado de un usuario, consulta conferenceProperties.allowedConferenceSolutionTypes en las colecciones calendars y calendarList. También puedes verificar si el usuario prefiere que se creen Hangouts para todos los eventos que cree recientemente. Para ello, consulta el parámetro de configuración autoAddHangouts en la colección settings.

Además de type, conferenceSolution también proporciona los campos name y iconUri que puedes usar para representar la solución de conferencia, 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 nueva conferencia para un evento proporcionando un createRequest con un requestId recién generado que puede ser un string aleatorio. Las conferencias se crean de forma asíncrona, pero siempre puedes verificar el estado de tu solicitud para que los usuarios sepan qué sucede.

Por ejemplo, para solicitar la generación de una conferencia 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 objeto conferenceData completamente propagado. Esto se indica con un código de estado pending en el campo status. El código de estado cambia a success después de que se completa la información de la conferencia. El campo entryPoints contiene información sobre los URIs de video y teléfono a los que pueden llamar tus usuarios.

Si deseas programar varios eventos de Calendario con los mismos detalles de la conferencia, puedes copiar todo el objeto 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. Quieres proteger la identidad del entrevistador, pero también asegurarte de que todos los participantes se unan a la misma llamada en conferencia.