Crear eventos de Outlook en un calendario compartido o delegado
En Outlook, los clientes pueden compartir un calendario con otros usuarios y permitirles ver, crear o modificar los eventos de ese calendario. Los clientes también pueden conceder a un delegado que actúe en su nombre para recibir o responder a convocatorias de reunión o crear o cambiar elementos en el calendario.
Mediante programación, Microsoft Graph admite la lectura o escritura de eventos en calendarios compartidos por otros usuarios, así como la lectura de los calendarios compartidos y la actualización del nombre del calendario para los que lo comparten. El soporte también se aplica a los calendarios que se han delegado. El resto de este artículo le guiará a través de la creación de un evento de reunión en un calendario compartido o delegado. Para obtener eventos, consulte Obtener eventos de Outlook en un calendario compartido o delegado.
El siguiente tutorial usa el escenario de ejemplo en el que Sergio ha delegado su calendario principal en Naiara en Outlook, y ha mantenido la configuración de buzón predeterminada de Outlook para dirigir las convocatorias de reunión y las respuestas solo a los delegados. (Esta configuración corresponde a la propiedad delegateMeetingMessageDeliveryOptions de las mailboxSettings de Sergio establecida como el valor predeterminado sendToDelegateOnly
).
El tutorial describe algunos de los pasos siguientes:
- Naiara obtiene el calendario que Sergio le ha delegado.
- Naiara envía una invitación de reunión a Cristina y a Nuria en nombre de Sergio.
- Christie recibe la solicitud de reunión e inspecciona el evento asociado en su calenda.
- Cristina responde provisionalmente a la invitación.
- Naiara recibe el mensaje de respuesta de Cristina.
- Sergio comprueba las respuestas de los asistentes como parte del evento.
Si Sergio ha compartido y no ha delegado su calendario en Naiara:
- Con la sesión iniciada como Adele, una aplicación puede obtener el calendario que Alex ha compartido con Adele.
- La aplicación puede usar las solicitudes y respuestas de los pasos 2 a 4 para aplicar al calendario compartido de la misma manera que al calendario delegado.
- En el paso 5, la aplicación puede iniciar sesión como Sergio, en lugar de Naiara, para recibir el mensaje de respuesta de Cristina.
Paso 1: Naiara obtiene el calendario delegado
Con la sesión iniciada como Naiara, obtenga los calendarios a los que tiene acceso e identifique el que Sergio ha delegado, para usarlo en el siguiente paso para crear un evento en el calendario.
Permisos de Microsoft Graph
Use el permiso delegado con menos privilegios, Calendars.Read.Shared
. Para obtener más información, vea el permiso Calendars.Read.Shared en la referencia de permisos.
GET https://graph.microsoft.com/v1.0/me/calendars
Observe que una respuesta correcta incluye el código de respuesta HTTP 200, el propio calendario principal de Naiara y una copia del calendario delegado por Sergio en el buzón de Naiara, con las siguientes propiedades:
- canShare es falso ya que Naiara es solo un delegado y no el propietario del calendario.
- canEdit es verdadero ya que, como delegado, Adele tiene acceso de escritura a los eventos no privados en el calendario delegado.
-
owner es
Alex Wilber
, lo que indica que es el calendario de Sergio.
HTTP/1.1 200 OK
Content-type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69')/calendars",
"value": [
{
"id": "AQMkADGkAAAJMjAAAAA==",
"name": "Calendar",
"color": "auto",
"changeKey": "NDznl+Uh50WkanaCOKHkaQAAAAACXQ==",
"canShare": true,
"canViewPrivateItems": true,
"canEdit": true,
"owner": {
"name": "Adele Vance",
"address": "AdeleV@contoso.com"
}
},
{
"id": "AAMkADRpAABf0JlzAAA=",
"name": "Alex Wilber",
"color": "auto",
"changeKey": "NDznl+Uh50WkanaCOKHkaQAAX8m4eQ==",
"canShare": false,
"canViewPrivateItems": false,
"canEdit": true,
"owner": {
"name": "Alex Wilber",
"address": "AlexW@contoso.com"
}
}
]
}
Nota:
Si inicias sesión como Adele, también puedes obtener el calendario delegado directamente del buzón de Alex, especificando la identidad de Alex y el calendar
acceso directo, como en GET https://graph.microsoft.com/v1.0/users/AlexW@contoso.com/calendar
. El ID. de calendario devuelto solo corresponde al buzón de correo de Sergio.
Paso 2: Naiara crea y envía una invitación en nombre de Sergio
Con la sesión iniciada como Naiara, utilice el Id. de calendario que obtuvo en el paso 1 para crear un evento en el calendario delegado y enviárselo a Cristina y a Nuria, en nombre de Sergio.
Permisos de Microsoft Graph
Use el permiso delegado con menos privilegios, Calendars.ReadWrite.Shared
. Para obtener más información, vea Permiso Calendars.ReadWrite.Shared en la referencia de permisos.
POST https://graph.microsoft.com/v1.0/me/calendars/AAMkADRpAABf0JlzAAA=/events
Prefer: outlook.timezone="Pacific Standard Time"
Content-type: application/json
{
"subject": "Christmas dinner",
"body": {
"contentType": "HTML",
"content": "Happy holidays!"
},
"start": {
"dateTime": "2019-12-25T18:00:00",
"timeZone": "Pacific Standard Time"
},
"end": {
"dateTime": "2019-12-25T22:00:00",
"timeZone": "Pacific Standard Time"
},
"location":{
"displayName":"Alex' home"
},
"attendees": [
{
"emailAddress": {
"address":"meganb@contoso.com",
"name": "Megan Bowen"
},
"type": "required"
},
{
"emailAddress": {
"address":"ChristieC@contoso.com",
"name": "Christie Cline"
},
"type": "required"
}
]
}
Observe que una respuesta correcta incluye el código de respuesta HTTP 200 y las siguientes propiedades eventMessage:
-
meetingMessageType especifica que este mensaje es
meetingRequest
. - sender es Naiara.
- from es Sergio.
- toRecipients incluye a Nuria y Cristina.
Y las siguientes propiedades de evento:
- attendees incluye a Sergio, Nuria y Cristina.
- organizer es Sergio.
La identidad de Naiara solo aparece en la propiedad sender del eventMessage y no en el evento asociado.
HTTP/1.1 200 OK
Content-type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('662b947c-d9a1-4064-926c-eba1316d4462')/messages(microsoft.graph.eventMessage/event())/$entity",
"@odata.type": "#microsoft.graph.eventMessage",
"@odata.etag": "W/\"CwAAABYAAADK82uJYVo4RrFV3ADVj3fyAABZ378h\"",
"id": "AAMkADADVj3fyAABZ5hYdAAA=",
"createdDateTime": "2019-12-21T04:59:03Z",
"lastModifiedDateTime": "2019-12-21T04:59:04Z",
"changeKey": "CwAAABYAAADK82uJYVo4RrFV3ADVj3fyAABZ378h",
"categories": [],
"receivedDateTime": "2019-12-21T04:59:03Z",
"sentDateTime": "2019-12-21T04:59:01Z",
"hasAttachments": false,
"internetMessageId": "<DM6PR17MB3593711A1C0A098167F5A977A12C0@DM6PR17MB3593.namprd17.prod.outlook.com>",
"subject": "Christmas dinner",
"bodyPreview": "Happy holidays!",
"importance": "normal",
"parentFolderId": "AQMkADIAAAIBDAAAAA==",
"conversationId": "AAQkADNqQlzYAM8jQM=",
"conversationIndex": "AdW3u1xx5S7TYrbluE2pCXNgAzyNAw==",
"isDeliveryReceiptRequested": null,
"isReadReceiptRequested": false,
"isRead": true,
"isDraft": false,
"webLink": "https://outlook.office365.com/owa/?ItemID=AAMkADADVj3fyAABZ5hYdAAA%3D&exvsurl=1&viewmodel=ReadMessageItem",
"inferenceClassification": "focused",
"meetingMessageType": "meetingRequest",
"body": {
"contentType": "html",
"content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=us-ascii\">\r\n</head>\r\n<body>\r\nHappy holidays!\r\n</body>\r\n</html>\r\n"
},
"sender": {
"emailAddress": {
"name": "Adele Vance",
"address": "AdeleV@contoso.com"
}
},
"from": {
"emailAddress": {
"name": "Alex Wilber",
"address": "AlexW@contoso.com"
}
},
"toRecipients": [
{
"emailAddress": {
"name": "Megan Bowen",
"address": "MeganB@contoso.com"
}
},
{
"emailAddress": {
"name": "Christie Cline",
"address": "ChristieC@contoso.com"
}
}
],
"ccRecipients": [],
"bccRecipients": [],
"replyTo": [],
"flag": {
"flagStatus": "notFlagged"
},
"event": {
"@odata.etag": "W/\"yvNriWFaOEaxVdwA1Y938gAAX+T7Jg==\"",
"id": "AAMkADADVj3fyAABZ5ieyAAA=",
"createdDateTime": "2019-12-21T04:59:03.4336242Z",
"lastModifiedDateTime": "2019-12-27T01:38:32.3766961Z",
"changeKey": "yvNriWFaOEaxVdwA1Y938gAAX+T7Jg==",
"categories": [],
"originalStartTimeZone": "Pacific Standard Time",
"originalEndTimeZone": "Pacific Standard Time",
"iCalUId": "040000008200FEFE0BA532444B5FD89BDE22BA103",
"reminderMinutesBeforeStart": 15,
"isReminderOn": true,
"hasAttachments": false,
"subject": "Christmas dinner",
"bodyPreview": "Happy holidays!",
"importance": "normal",
"sensitivity": "normal",
"isAllDay": false,
"isCancelled": false,
"isOrganizer": false,
"responseRequested": true,
"seriesMasterId": null,
"showAs": "tentative",
"type": "singleInstance",
"webLink": "https://outlook.office365.com/owa/?itemid=AAMkADADVj3fyAABZ5ieyAAA%3D&exvsurl=1&path=/calendar/item",
"onlineMeetingUrl": null,
"recurrence": null,
"responseStatus": {
"response": "none",
"time": "2019-12-21T05:16:48.8931825Z"
},
"body": {
"contentType": "html",
"content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=us-ascii\">\r\n</head>\r\n<body>\r\nHappy holidays!\r\n</body>\r\n</html>\r\n"
},
"start": {
"dateTime": "2019-12-26T02:00:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2019-12-26T06:00:00.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "Alex' home",
"locationType": "default",
"uniqueId": "Alex' home",
"uniqueIdType": "private"
},
"locations": [
{
"displayName": "Alex' home",
"locationType": "default",
"uniqueId": "1396aaf3-e344-4567-a4e3-797557ec24c8",
"uniqueIdType": "locationStore"
}
],
"attendees": [
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Alex Wilber",
"address": "AlexW@contoso.com"
}
},
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Megan Bowen",
"address": "MeganB@contoso.com"
}
},
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Christie Cline",
"address": "ChristieC@contoso.com"
}
}
],
"organizer": {
"emailAddress": {
"name": "Alex Wilber",
"address": "AlexW@contoso.com"
}
}
}
}
Paso 4: Cristina responde a la convocatoria de reunión
Con la sesión iniciada como Cristina, responda al evento provisionalmente e incluya un mensaje de respuesta en la respuesta:
Permisos de Microsoft Graph
Use el permiso delegado con menos privilegios, Calendars.ReadWrite.Shared
. Para obtener más información, vea Permiso Calendars.ReadWrite.Shared en la referencia de permisos.
POST https://graph.microsoft.com/v1.0/me/events/AAMkADADVj3fyAABZ5ieyAAA=/tentativelyAccept
Content-type: application/json
{
"comment": "I will probably be able to make it.",
"sendResponse": true
}
Una respuesta correcta devuelve HTTP 202 Aceptado.
HTTP/1.1 202 Accepted
Paso 5: Naiara recibe el mensaje de respuesta
Dado que Naiara es un delegado del calendario principal de Sergio, Naiara recibe todas las respuestas a reuniones para ese calendario en nombre de Sergio.
Con la sesión iniciada como Naiara, obtenga el eventMessage que representa la respuesta de Cristina en el paso 4.
Permisos de Microsoft Graph
Use el permiso delegado con menos privilegios, Mail.Read.Shared
. Para obtener más información, vea Permiso Mail.Read.Shared en la referencia de permisos.
GET https://graph.microsoft.com/v1.0/me/messages/AAMkADI4oeRpAABf0HJUAAA=
Observe que una respuesta correcta incluye el código de respuesta HTTP 200 y las siguientes propiedades eventMessage:
-
meetingMessageType es
meetingTenativelyAccepted
. - from es Cristina.
- toRecipients solo incluye a Naiara, pero no al propietario del calendario Sergio. Esto se debe a que Sergio ha mantenido la opción predeterminada por la que Outlook dirige todas las respuestas de la reunión solo a los delegados.
HTTP/1.1 200 OK
Content-type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69')/messages/$entity",
"@odata.type": "#microsoft.graph.eventMessage",
"@odata.etag": "W/\"DAAAABYAAAA0POeX5SHnRaRqdoI4oeRpAABfybkT\"",
"id": "AAMkADI4oeRpAABf0HJUAAA=",
"createdDateTime": "2019-12-21T05:16:55Z",
"lastModifiedDateTime": "2019-12-21T05:16:57Z",
"changeKey": "DAAAABYAAAA0POeX5SHnRaRqdoI4oeRpAABfybkT",
"categories": [],
"receivedDateTime": "2019-12-21T05:16:56Z",
"sentDateTime": "2019-12-21T05:16:49Z",
"hasAttachments": false,
"internetMessageId": "<86880ccb8ec64184996e46eaddaed279@DM6PR17MB3593.namprd17.prod.outlook.com>",
"subject": "Tentative: Christmas dinner",
"bodyPreview": "I will probably be able to make it.",
"importance": "normal",
"parentFolderId": "AQMkAD5GkAAAIBDAAAAA==",
"conversationId": "AAQkADK25bhNqQlzYAM8jQM=",
"conversationIndex": "AdW3u1xx5S7TYrbluE2pCXNgAzyNAwAAoBoZ",
"isDeliveryReceiptRequested": null,
"isReadReceiptRequested": false,
"isRead": false,
"isDraft": false,
"webLink": "https://outlook.office365.com/owa/?ItemID=AAMkADI4oeRpAABf0HJUAAA%3D&exvsurl=1&viewmodel=ReadMessageItem",
"inferenceClassification": "focused",
"meetingMessageType": "meetingTenativelyAccepted",
"body": {
"contentType": "html",
"content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=us-ascii\">\r\n</head>\r\n<body>\r\nI will probably be able to make it.\r\n</body>\r\n</html>\r\n"
},
"sender": {
"emailAddress": {
"name": "Christie Cline",
"address": "ChristieC@contoso.com"
}
},
"from": {
"emailAddress": {
"name": "Christie Cline",
"address": "ChristieC@contoso.com"
}
},
"toRecipients": [
{
"emailAddress": {
"name": "Adele Vance",
"address": "AdeleV@contoso.com"
}
}
],
"ccRecipients": [],
"bccRecipients": [],
"replyTo": [],
"flag": {
"flagStatus": "notFlagged"
}
}
Paso 6: Sergio obtiene acceso a las respuestas como parte del evento.
Como Sergio ha mantenido la opción predeterminada por la que Outlook dirige todas las respuestas de la reunión solo a los delegados, Sergio no recibe la respuesta de Cristina del paso 4. Sin embargo, puede obtener la respuesta a través del evento en su calendario principal.
Con la sesión iniciada como Sergio, obtenga el evento que Naiara creó en el paso 2 y obtenga respuestas de la propiedad attendees.
Permisos de Microsoft Graph
Use el permiso delegado con menos privilegios, Calendars.Read
. Para obtener más información, vea Permiso Calendars.Read en la referencia de permisos.
GET https://graph.microsoft.com/v1.0/me/calendar/events/AAMkADJXJGu0AABf02qwAAA=
Observe que una respuesta correcta incluye el código de respuesta HTTP 200 y las siguientes propiedades event:
- isOrganizer es verdadero.
- attendees incluye solo a Nuria y Cristina.
- La propiedad status de cada instancia attendee indica cualquier respuesta del asistente:
- La respuesta de Nuria es
none
. - La respuesta de Cristina es
tentativelyAccepted
.
- La respuesta de Nuria es
- organizer es Sergio.
- Ninguna propiedad del evento devuelto indica el delegado, Naiara.
HTTP/1.1 200 OK
Content-type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('64339082-ed84-4b0b-b4ab-004ae54f3747')/calendars('AQMkADAw7QAAAJfygAAAA%3D%3D')/events/$entity",
"@odata.etag": "W/\"NEXywgsVrkeNsFsyVyRrtAAAX8xuhA==\"",
"id": "AAMkADJXJGu0AABf02qwAAA=",
"createdDateTime": "2019-12-21T04:59:01.4435895Z",
"lastModifiedDateTime": "2019-12-21T05:16:54.689345Z",
"changeKey": "NEXywgsVrkeNsFsyVyRrtAAAX8xuhA==",
"categories": [],
"originalStartTimeZone": "Pacific Standard Time",
"originalEndTimeZone": "Pacific Standard Time",
"iCalUId": "040000008200FEFE0BA532444B5FD89BDE22BA103",
"reminderMinutesBeforeStart": 15,
"isReminderOn": true,
"hasAttachments": false,
"subject": "Christmas dinner",
"bodyPreview": "Happy holidays!",
"importance": "normal",
"sensitivity": "normal",
"isAllDay": false,
"isCancelled": false,
"isOrganizer": true,
"responseRequested": true,
"seriesMasterId": null,
"showAs": "busy",
"type": "singleInstance",
"webLink": "https://outlook.office365.com/owa/?itemid=AAMkADJXJGu0AABf02qwAAA%3D&exvsurl=1&path=/calendar/item",
"onlineMeetingUrl": null,
"recurrence": null,
"responseStatus": {
"response": "organizer",
"time": "0001-01-01T00:00:00Z"
},
"body": {
"contentType": "html",
"content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=us-ascii\">\r\n</head>\r\n<body>\r\nHappy holidays!\r\n</body>\r\n</html>\r\n"
},
"start": {
"dateTime": "2019-12-26T02:00:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2019-12-26T06:00:00.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "Alex' home",
"locationType": "default",
"uniqueId": "Alex' home",
"uniqueIdType": "private"
},
"locations": [
{
"displayName": "Alex' home",
"locationType": "default",
"uniqueId": "Alex' home",
"uniqueIdType": "private"
}
],
"attendees": [
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Megan Bowen",
"address": "MeganB@contoso.com"
}
},
{
"type": "required",
"status": {
"response": "tentativelyAccepted",
"time": "2019-12-21T05:16:48.8931825Z"
},
"emailAddress": {
"name": "Christie Cline",
"address": "ChristieC@contoso.com"
}
}
],
"organizer": {
"emailAddress": {
"name": "Alex Wilber",
"address": "AlexW@contoso.com"
}
}
}