Crie eventos do Outlook em um calendário compartilhado ou delegado
No Outlook, os clientes podem compartilhar um calendário com outros usuários e permitir que eles vejam, criem ou modifiquem eventos nesse calendário. Os clientes também podem permitir que um representante aja em nome deles, para receber ou responder a solicitações de reunião ou então para criar ou alterar itens no calendário.
Programaticamente, o Microsoft Graph oferece suporte à leitura e à criação de eventos em calendários que foram compartilhadas por outros usuários, além de leitura da calendários compartilhados e da atualização do nome do calendário para compartilhados. O suporte também se aplica a calendários que foram delegados. O restante deste artigo discorre sobre a criação de um evento de reunião em um calendário compartilhado ou delegado. Para obter eventos, consulteObter eventos do Outlook em um calendário compartilhado ou delegado.
A instrução a seguir usa o cenário de exemplo em que Alex delega seu calendário principal à Adele no Outlook e mantém a configuração de caixa de correio do Outlook padrão para direcionar solicitações de reunião e respostas apenas às pessoas delegadas. (Esta configuração corresponde à propriedade delegateMeetingMessageDeliveryOptions de mailboxSettings do Alex, definida como o valor padrão sendToDelegateOnly
).
A instrução passo a passo descreve algumas etapas subsequentes:
- Adele obtém o calendário que Alex delegou a ela.
- Adele envia um convite de reunião para Clara e Sara em nome de Alex.
- Christie recebe o pedido de reunião, e inspeciona o evento associado na sua calenda
- Clara responde com um “talvez” ao convite.
- Adele recebe a mensagem de resposta da Clara.
- Alex verifica as respostas dos participantes como parte do evento.
Caso Alex tenha compartilhado com Adele mas não tiver delegado seu calendário à ela:
- Com sessão iniciada como Adele, uma aplicação pode obter o calendário que Alex partilhou com Adele
- O aplicativo pode usar as solicitações e respostas nas etapas 2 a 4 para aplicar ao calendário compartilhado da mesma maneira que ao calendário delegado.
- Na etapa 5, o aplicativo pode entrar como Alex, em vez de Adele, para receber a mensagem de resposta do Clara.
Etapa 1: Adele obtém o calendário delegado
Entre como Adele, obtenha os calendários a que ela tem acesso e identifique aquele que Alex delegou a ela, para usá-lo na próxima etapa para criar um evento no calendário.
Permissões do Microsoft Graph
Use a permissão delegada com menos privilégios, Calendars.Read.Shared
. Para obter mais informações, consulte a permissão Calendars.Read.Shared na referência de permissões.
GET https://graph.microsoft.com/v1.0/me/calendars
Observe que uma resposta bem-sucedida inclui o código de resposta HTTP 200, o principal calendário do Adele e uma cópia do calendário delegado por Alex na caixa de correio do Adele, com as seguintes propriedades:
- canShare é falso porque Adele é somente uma representante e não a proprietária do calendário.
- canEdit é verdadeiro, uma vez como representante, Adele tem acesso de gravação para eventos não privados no calendário delegado.
-
owner é
Alex Wilber
indicando que é o calendário de Alex.
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"
}
}
]
}
Observação
Conectado como Adele, você pode, como alternativa, obter o calendário delegado diretamente da caixa de correio de Alex, especificando a identidade de Alex e o calendar
atalho, como em GET https://graph.microsoft.com/v1.0/users/AlexW@contoso.com/calendar
. A ID do calendário retornado corresponde apenas à caixa de correio de Alex.
Etapa 2: Adele cria e envia um convite em nome de Alex
Conectado como Adele, use o ID do calendário obtido na etapa 1 para criar um evento no calendário delegado e envie-o para Christie e Megan, em nome de Alex.
Permissões do Microsoft Graph
Use a permissão delegada com menos privilégios, Calendars.ReadWrite.Shared
. Para obter mais informações, consulte a permissão Calendars.ReadWrite.Shared na referência de permissões.
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 uma resposta bem-sucedida inclui HTTP 200 e as seguintes propriedades doeventMessage:
-
meetingMessageType especifica se essa mensagem é
meetingRequest
. - sender é Adele.
- from é Alex.
- toRecipients incluem Sara e Clara.
E as seguintes propriedades da instância event:
- attendees incluem Alex, Sara e Clara.
- organizer é Alex.
A identidade de Adele é exibida somente na propriedadesender, da eventMessage e não no evento associado.
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"
}
}
}
}
Etapa 4: a Clara responde à solicitação de reunião
Conectada como Clara, define o evento como provisório e inclui uma mensagem na resposta:
Permissões do Microsoft Graph
Use a permissão delegada com menos privilégios, Calendars.ReadWrite.Shared
. Para obter mais informações, consulte a permissão Calendars.ReadWrite.Shared na referência de permissões.
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
}
Uma resposta bem-sucedida retorna HTTP 202 Aceito.
HTTP/1.1 202 Accepted
Etapa 5: Adele recebe a mensagem de resposta
Como Adele é uma representante do calendário principal de Alex, Adele recebe todas as respostas de reunião desse calendário em nome de Alex.
Conectado como Adele, obtenha o eventMessage que representa a resposta de Christie na etapa 4.
Permissões do Microsoft Graph
Use a permissão delegada com menos privilégios, Mail.Read.Shared
. Para obter mais informações, consulte Permissão Mail.Read.Shared na referência de permissões.
GET https://graph.microsoft.com/v1.0/me/messages/AAMkADI4oeRpAABf0HJUAAA=
Observe que uma resposta bem-sucedida inclui HTTP 200 e as seguintes propriedades doeventMessage:
-
meetingMessageType é
meetingTenativelyAccepted
. - de é Clara.
- toRecipients inclui somente Adele, mas não o proprietário do calendário Alex. Isso ocorre porque Alex manteve o padrão para fazer o Outlook direcionar todas as respostas de reunião somente para 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"
}
}
Etapa 6: Alex acessa respostas como parte do evento
Como Alex manteve o padrão de fazer com que o Outlook direcionasse todas as solicitações e respostas de reunião apenas para delegados, Alex não recebe a resposta de Clara da etapa 4. No entanto, ele pode obter a resposta por meio de evento no calendário principal.
Conectado como Alex, obtenha o evento que Adele criou na etapa 2 e obtém respostas do participantes propriedade.
Permissões do Microsoft Graph
Use a permissão delegada com menos privilégios, Calendars.Read
. Para obter mais informações, consulte Calendars.permissão de Ler na referência de permissões.
GET https://graph.microsoft.com/v1.0/me/calendar/events/AAMkADJXJGu0AABf02qwAAA=
Observe que uma resposta bem-sucedida inclui HTTP 200 e as seguintes propriedades doevent:
- isOrganizer é verdadeiro.
- attendees incluem Sara e Clara.
- A propriedade status de cada instância participante indica qualquer resposta do participante:
- A resposta de Sara é
none
. - A resposta de Clara é
tentativelyAccepted
.
- A resposta de Sara é
- organizer é Alex.
- Nenhuma propriedade no evento retornado indica a delegada, Adele.
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"
}
}
}