Microsoft Graph で会議の別の時間を提案する

2020 年 7 月の更新で、会議出席依頼における新しい時間の提案に関するプロパティが Microsoft Graph に追加されました。

実際に動きを見てみましょう。まず以下のように User01 から User02 へ明示的に allowNewTimeProposals を true にした会議出席依頼を送信します。

POST https://graph.microsoft.com/v1.0/users/User01@contoso.onmicrosoft.com/events
{
  "subject": "Let's go for lunch",
  "body": {
    "contentType": "HTML",
    "content": "Does late morning work for you?"
  },
  "start": {
      "dateTime": "2020-07-28T12:00:00",
      "timeZone": "Tokyo Standard Time"
  },
  "end": {
      "dateTime": "2020-07-28T14:00:00",
      "timeZone": "Tokyo Standard Time"
  },
  "location":{
      "displayName":"Harry's Bar"
  },
  "attendees": [
    {
      "emailAddress": {
        "address":"User02@contoso.onmicrosoft.com",
        "name": "User02"
      },
      "type": "required"
    }
  ],
  "allowNewTimeProposals": true
}

User02 が受信した eventMessageRequest を見てみると、allowNewTimeProposals が true になっていることが分かります。デモのため、アイテムを 1 件のみ取得するように $top=1 としています。

GET https://graph.microsoft.com/v1.0/users/User02@contoso.onmicrosoft.com/messages/?$select=subject,microsoft.graph.eventMessageRequest/allowNewTimeProposals&$top=1
{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('User02%40rykoma03.onmicrosoft.com')/messages(subject,microsoft.graph.eventMessageRequest/allowNewTimeProposals)",
  "@odata.nextLink": "https://graph.microsoft.com/v1.0/users/User02@contoso.onmicrosoft.com/messages/?$select=subject%2cmicrosoft.graph.eventMessageRequest%2fallowNewTimeProposals&$top=1&$skip=2",
  "value": [
    {
      "@odata.type": "#microsoft.graph.eventMessageRequest",
      "@odata.etag": "W/\"CwAAABYAAAAOmCTRuhGXToj3LolrhhYQAAR1EROc\"",
      "id": "AAMkAGJiN2FkZTIwLWY0ODMtNDU3Yi04YTZiLTQzMDcyMGI2OWNiNABGAAAAAAC0eyYE7Ih3QZsKeUb6GLCqBwAOmCTRuhGXToj3LolrhhYQAAAAAAEMAAAOmCTRuhGXToj3LolrhhYQAAR1Gx9HAAA=",
      "subject": "Let's go for lunch",
      "allowNewTimeProposals": true
    }
  ]
}

* 2020/7/27 現在、/messages/{id} でアイテムを取得すると allowNewTimeProposals が null になってしまっています。上記のように ID を指定しなければ正しく取得できます。

User02 で仮承諾しつつ新しい時間を提案してみましょう。まずは先ほどの会議出席依頼に対応する event を取得しないといけないので、以下のように実行して event の id を取得します。

GET https://graph.microsoft.com/v1.0/users/User02@contoso.onmicrosoft.com/messages/AAMkAGJiN2FkZTIwLWY0ODMtNDU3Yi04YTZiLTQzMDcyMGI2OWNiNABGAAAAAAC0eyYE7Ih3QZsKeUb6GLCqBwAOmCTRuhGXToj3LolrhhYQAAAAAAEMAAAOmCTRuhGXToj3LolrhhYQAAR1Gx9HAAA=?$expand=microsoft.graph.eventMessage/event

そして以下のように仮承諾しつつ新しい時間を提案します。

POST https://graph.microsoft.com/v1.0/users/User02@contoso.onmicrosoft.com/events/AAMkAGJiN2FkZTIwLWY0ODMtNDU3Yi04YTZiLTQzMDcyMGI2OWNiNABGAAAAAAC0eyYE7Ih3QZsKeUb6GLCqBwAOmCTRuhGXToj3LolrhhYQAAAAAAENAAAOmCTRuhGXToj3LolrhhYQAAR1GxteAAA=/tentativelyAccept
{ 
  "comment": "Can you make the next day instead?", 
  "sendResponse": "true", 
  "proposedNewTime": {
     "Start": { 
          "DateTime": "2020-07-29T12:00:00", 
          "TimeZone": "Pacific Standard Time" 
     }, 
     "End": { 
          "DateTime": "2020-07-29T14:00:00", 
          "TimeZone": "Pacific Standard Time" 
     }
  }
} 

User01 が受け取った内容を以下のように取得してみると、proposedNewTime があり新しい時間を提案されていることが分かります。

GET https://graph.microsoft.com/v1.0/users/User01@contoso.onmicrosoft.com/messages?$select=subject,microsoft.graph.eventMessageResponse/proposedNewTime&$top=1
{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('User01%40rykoma03.onmicrosoft.com')/messages(subject,microsoft.graph.eventMessageResponse/proposedNewTime)",
  "@odata.nextLink": "https://graph.microsoft.com/v1.0/users/User01@contoso.onmicrosoft.com/messages?$select=subject%2cmicrosoft.graph.eventMessageResponse%2fproposedNewTime&$top=1&$skip=1",
  "value": [
    {
      "@odata.type": "#microsoft.graph.eventMessageResponse",
      "@odata.etag": "W/\"DAAAABYAAADKF8masRMzQ4BmqIbV6OsxAARj4ZQp\"",
      "id": "AAMkAGYxOTczODY2LTQwYzktNDFmYS05ZTIzLWZmNjAxYmM1MWYwZABGAAAAAACmFAp715xPRpcdN7o1X1D7BwDKF8masRMzQ4BmqIbV6OsxAAAAAAEMAADKF8masRMzQ4BmqIbV6OsxAARkbjgWAAA=",
      "subject": "New Time Proposed: Let's go for lunch",
      "proposedNewTime": {
        "start": {
          "dateTime": "2020-07-30T04:00:00",
          "timeZone": "Tokyo Standard Time"
        },
        "end": {
          "dateTime": "2020-07-30T06:00:00",
          "timeZone": "Tokyo Standard Time"
        }
      }
    }
  ]
}

新しい時間の提案は、上記のように eventMessageResponse で確認する以外に event 側からも確認できます。この場合は attendees の中を見る必要があります。

GET https://graph.microsoft.com/v1.0/users/User01@contoso.onmicrosoft.com/events/AAMkAGYxOTczODY2LTQwYzktNDFmYS05ZTIzLWZmNjAxYmM1MWYwZABGAAAAAACmFAp715xPRpcdN7o1X1D7BwDKF8masRMzQ4BmqIbV6OsxAAAAAAENAADKF8masRMzQ4BmqIbV6OsxAARkbhBnAAA=?$select=subject,attendees
{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('User01%40rykoma03.onmicrosoft.com')/events(subject,attendees)/$entity",
  "@odata.etag": "W/\"yhfJmrETM0OAZqiG1ejrMQAEY+GUGw==\"",
  "id": "AAMkAGYxOTczODY2LTQwYzktNDFmYS05ZTIzLWZmNjAxYmM1MWYwZABGAAAAAACmFAp715xPRpcdN7o1X1D7BwDKF8masRMzQ4BmqIbV6OsxAAAAAAENAADKF8masRMzQ4BmqIbV6OsxAARkbhBnAAA=",
  "subject": "Let's go for lunch",
  "attendees": [
    {
      "type": "required",
      "status": {
        "response": "tentativelyAccepted",
        "time": "2020-07-27T15:13:41.4168668Z"
      },
      "proposedNewTime": {
        "start": {
          "dateTime": "2020-07-30T04:00:00",
          "timeZone": "Tokyo Standard Time"
        },
        "end": {
          "dateTime": "2020-07-30T06:00:00",
          "timeZone": "Tokyo Standard Time"
        }
      },
      "emailAddress": {
        "name": "User02",
        "address": "User02@contoso.onmicrosoft.com"
      }
    }
  ]
}

この後、提案を受け入れるかどうかはユーザーの判断です。受け入れるのであれば event の時間を更新してあげればよいです。

参考
Propose new meeting times in Outlook
https://docs.microsoft.com/en-us/graph/outlook-calendar-meeting-proposals