ちょっと話題の記事

[日本語Alexa] Office365会議室予約スキル

2018.02.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

会議室のリソースをOffice365で管理されている会社は、比較的多いのではないでしょうか。

今回は、このOffice365で管理されている会議室の予約を行うスキルを作成したので紹介させて下さい。

最初に動作しているようすです。

2 予約の方法

(1) 部屋番号を指定して予約する

会議室の予約には、次のようなパラメータが必要です。

  1. 日時
  2. 使用時間
  3. 部屋番号

会議室予約スキルには、次のように話し掛けることで予約を行うことができます。

ユーザー: 明日の15時から1時間、501号会議室を予約して

(2) 部屋番号を指定しないで予約する

会議室予約スキルでは、部屋番号の選択をまるっとお任せすることができます。

ユーザー: 2月7日の15時から30分間予約して
アレクサ: 何号室を予約しますか?
ユーザー: どこでもいいです

会議室予約スキルにお任せすると、指定された時間で利用可能な会議室を予約します。

3 空いていない時

指定された諸元で予約ができない場合、会議室予約スキルは、積極的に空いている部屋を探してくれます。

(1) 別の部屋が空いている場合

指定された部屋が既に使用されている場合、会議室予約スキルは、同じ時間で空いている部屋を提案してくれます。

ユーザー: 明日の15時から1時間、501号会議室を予約して
アレクサ: 501は空いていませんでした。502会議室なら空いていますが、予約しますか?

(2) 指定時間が全部空いていない場合

指定された時間が全部空いていなかった場合、会議室予約スキルは、直近の時間帯で利用可能な部屋を提案してくれます。

ユーザー: 2月7日の15時から1時間、501号会議室を予約して
アレクサ: 501は空いていませんでした。15時30分からですが、502会議室なら空いていますが、予約しますか?

※15:00からは空いていないが、15:30からは空いていた

4 「どこでもいいです」

会議室予約スキルに部屋番号の選択をお任せする場合、部屋番号の指定は次のような発話になります。

適当に。
どこでもいいです。
お任せします。
なんでもいいです。
・・・

本来数字で指定されるはずの部屋番号スロットで、上記のような入力を受け付けるため、下記のテクニックを利用しています。

お任せする場合に予想されるユーザの発話は、カスタムスロットで定義しています。

そして、必須のスロットに定義された部屋番号のアトランスに、忍び込ませています。

これをコードで処理しています。

const intent = this.event.request.intent;

if (intent.slots.room.value) { // 値が入っている場合
    let number = Number(intent.slots.room.value);
    if(isNaN(number) || ((number < 501 || 505 < number) &&  999 != number)) { // 値が無効な場合
        if (intent.slots.not_specified.value != undefined) { // 「どこでもいいです」に値が入っている場合
            let updatedIntent = this.event.request.intent;
            // 会議室予約スキルにお任せする(部屋番号は999とする)
            updatedIntent.slots.room.value = '999';
            // delegateでスロット値を書き換える
            this.emit(':delegate', updatedIntent);
            return;
        }
    }
}

5 Office 予定表 REST API

会議室リソースへのアクセスは、Office 予定表 REST APIを使用しています。 https://msdn.microsoft.com/ja-jp/office/office365/api/calendar-rest-operations

REST APIを使用すると、下記のようなエンドポイントで機能を利用することができます。

POST /me/findMeetingTimes (会議室の空き状況確認)
POST /me/events (イベントの作成)
GET /me/events (イベントの取得)
DELETE /me/events/id (イベントの削除)

6 アカウントリンク

REST APIを使用する際に必要となるアクセストークンは、アカウントリンクで取得しています。

アカウントリンクを使用すると、アクセストークンの取得やリフレッシュを全部Alexaに任せることができるので、スキルでは、そのあたりの実装は一切必要なくなります。

7 最後に

今回は、アカウントリンクを利用したOffice365のAPIを叩くスキルを作成してみました。

Microsoftでは、OutlookなどのAPIの後継として、統合型のGraph APIへの移行が進んでいます。今後、この流れで全てのサービスがGraphAPIから利用できるようになると、ますますスキルで色々作れるのでは?とワクワクしています。