Power Apps から Microsoft Teams のチャットや会議を作成する

検証に手間取り投稿が最終日まで伸びてしまった…。

---

Power AppsとTeamsの間にはコネクタが存在し、様々なアクションを行えます。
[コネクタの概要 - Microsoft Teams](https://docs.microsoft.com/ja-jp/connectors/teams/)

それに加えてURIやDeep linkを使うとコネクタ単体では出来ない操作が出来るので、今回はリファレンスが存在しているものを紹介していきます。
[Create deep links to content and features in Microsoft Teams](https://docs.microsoft.com/ja-jp/microsoftteams/platform/concepts/build-and-test/deep-links)


#TeamsのURI

|記述|スキーマ|対応デバイス|
|:-:|:-:|:-:|
|msteams:|URI|PC|
|android-app://com.microsoft.teams/|URI|Android|
|未所持なので不明||iPhone|
|https://teams.microsoft.com/|Deep link|マルチデバイス|

**基本的に`https://teams.microsoft.com/`を使っていれば問題は起こらない筈。**

#新しくチャットを作る
コネクタでは出来ない事の一つ目は新規チャットの作成です。
相手を複数指定する事も出来ます。

```C#:チャット
Launch("msteams:l/chat/0/0","users","user1@mail.com,user2@mail.com","topicName","テストのチャット","message","プリセット")

Launch("https://teams.microsoft.com/l/chat/0/0","users","user1@mail.com,user2@mail.com","topicName","テストのチャット","message","プリセット")
```

##URLの構造

```C#:URLの構造
https://teams.microsoft.com/l/chat/0/0?users=...
https://teams.microsoft.com/l/chat/Thread ID/Message ID ? Parameter
```
###Thread ID
チャンネルのID

ブラウザでこの画面を表示した時のURLにおける`19:Thread ID@thread.skype`。
`https://teams.microsoft.com/_#/conversations/チーム名?threadId=19:Thread ID@thread.skype&ctx=channel`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/dcf19705-3bb6-f6a2-ddff-4c477c13e831.png)

`0`だと特に指定しない扱いになる。
今回はチャットの新規作成のため、必ず`0`になる。

###Message ID
チャンネル内チャットメッセージの個別ID
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/f4d96371-7b94-03b7-6472-a8410e450780.png)

`0`だと特に指定しない扱いになる。

###パラメータ

####users
必須。
チャットの相手。
ユーザー個人のUPN(メールアドレスではない)、またはオーガナイザー ID。
`,`区切りで複数指定可能。
このDeep Linkをクリックしたユーザーは自動的に参加者として含まれるので、usersに含む必要はありません。

UPNとオーガナイザー IDは[Office365ユーザー.UserProfileV2](https://docs.microsoft.com/ja-jp/connectors/office365users/#get-user-profile-(v2))で取得できる。
該当するフィールドは`userPrincipalName`と`id`。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/7cf24724-5e65-4167-4f9d-6396cc9523f5.png)


####topicName
省略可能。
自分を含め三人以上でチャットを行う場合、チャットの表示名を設定できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/3df71535-4a0d-56f1-1460-2785db2b7fed.png)

####message
省略可能。
このURL経由でチャットを開いた時、チャットメッセージ作成ボックスにプレ入力するテキストを指定できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/882c4fd9-b544-f9b2-4265-3949e1ff7cc7.png)

#会議の予約
会議の予約画面を、一部項目を入力した状態で立ち上げる事が出来ます。

```C#:新しい会議の予約
Launch("msteams:l/meeting/new","attendees","user1@mail.com","subject","会議の予約","content","詳細はここ",""startTime","2019-12-25T00:00:00+09:00","endTime","2019-12-26T00:00:00+09:00")

Launch("https://teams.microsoft.com/l/meeting/new","attendees","user1@mail.com","subject","会議の予約","content","詳細はここ","startTime","2019-12-25T00:00:00+09:00","endTime","2019-12-26T00:00:00+09:00")
```

##URLの構造

```C#:URLの構造
https://teams.microsoft.com/l/meeting/new?attendees=...
https://teams.microsoft.com/l/meeting/new ? Parameter
```

meeting/new以外の組み合わせや動作を確認できなかったので、固定と思われる。

###パラメータ

####attendees
省略可能。
会議の出席者の相手。
ユーザー個人のUPN(メールアドレスではない)、またはオーガナイザー ID。
`,`区切りで複数指定可能。
このDeep Linkをクリックしたユーザーは自動的に開催者として登録されるので、含む必要はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/08c8e353-cb79-c5a2-f1ef-3bfbcb9b15d5.png)

####subject
省略可能。
会議のタイトル。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/3ee6a0ce-4d47-cdbd-8cec-4d66de5db7cd.png)

####content
省略可能。
会議の詳細。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/04dc04f3-5e2c-860c-daaf-abccae3e7fbb.png)

####startTime
省略可能。
会議の開始日時。
[long ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601)、もしくは`yyyy/mm/dd HH:MM:SS`か`dd/mm/yyyy HH:MM:SS`。
`yyyy-mm-dd HH:MM:SS`も通る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/dfcf9aff-e9bd-23e2-c518-7f72522fc2ed.png)


####endTime
省略可能。
会議の終了日時。
仕様は`startTime`と同じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/809db4b1-b54d-ae97-5696-a907dfa2c5d3.png)

#番外編 : 会議への参加
Outlookの「新しいTeams会議」で生成されるリンクを利用する事で、会議に参加できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/796548a5-fb20-41ad-16ea-ee4fe33181b4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/5296f6cd-748b-4a64-0cc4-48f306e6dab2.png)

```C#:会議に参加
Launch("msteams:l/meetup-join/19:meeting_xxxx@thread.v2/0","context","{""tid"":""xxx-xxx-xxx-xxx"",""oid"":""xxx-xxx-xxx-xxx""}")

Launch("https://teams.microsoft.com/l/meetup-join/19:meeting_会議ID@thread.v2/0","context","{""tid"":""テナントID"",""oid"":""会議開催者のオーガナイザー ID""}")
```
##URLの構造

```C#:URLの構造
msteams:l/meetup-join/19:meeting_xxxx@thread.v2/0?context=...
msteams:l/meetup-join/Thread ID/Message ID ? Parameter
```
###Thread ID
会議のID
Teamsの予定表でも確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/047da830-a1e5-d399-eb0a-c8cc3a999139.png)

`0`だとどのチャンネルにも紐付かない会議を開ける。

###Message ID
チャンネル内チャットメッセージの個別ID
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/f4d96371-7b94-03b7-6472-a8410e450780.png)

`0`だと特に指定しない扱いになる。

###パラメータ
####context
会議開催者を指定していること以外は不明。
テナントIDはAzure ADのtenant ID。
オーガナイザー IDは主催者のID。

#まとめ
- **コネクタでは出来ない事が出来る**
    - 二つとは言え、一々Teamsを開かなくてもアプリ上から出来るのは楽です。
- **テナントID以外はPower Apps上で取得できるデータを利用できる**
    - テナントIDが変わる事はまず無いと思うので特に問題ではない筈。

実は`call`とかリファレンスに載ってないけど動くURLもありましたが、サポート外と思われるので敢えて載せません。
**もっと自由にPower AppsからTeamsを扱いたい方は[Microsoft Graph API](https://docs.microsoft.com/ja-jp/graph/api/resources/teams-api-overview?view=graph-rest-1.0)を使いましょう！**
こちらはPreviewの機能もありますが、サポートされています。