チャネル会議でも会議イベントから会議チャットのIDを取得する Power Automateクラウドフロー

# はじめに
ささみさん記事の＋αを考えてみました。
チャネル会議の場合も同様に会議のスレッドを取得する方法です。

https://sasami-axis.hatenablog.com/entry/2023/06/24/154704

:::note warn
標準チャネル以外での会議、**共有チャネル**で作成された会議には対応できておりません。
※プライベートチャネルでは会議のスケジュールがそもそもできません
:::

# チャネルのスレッドの位置的構造
この記事で紹介されている方法は、Outlook予定表などから作成した会議のスレッド、Teamsでは`チャット`欄に表示されるのですが、チャネル会議の場合は、開催されるチャネルのスレッドとして作成されます。

チャネルのスレッドは階層構造になっており、下図のうち①～③を特定する情報が揃ってはじめてスレッドを取得することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/081247ab-9abd-b0cf-0f94-b6948d3bfb2a.png)


会議のチャットの場合は構造がもう少し単純で、①のスレッドIDだけ特定
すれば、スレッドにメッセージを投稿することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b37ff3d0-ce66-5a55-e13d-3f9beffaf697.png)

つまり、チャネル会議の場合は特定しないといけない情報が多いということです。

# 本題に入るまでの事前準備
会議アイテムから`joinUrl`を取得するところまではささみさん記事と変わらないため、説明を割愛します。
この`joinUrl`から追加で情報を取得する必要があるので、今回は変数に格納しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a54f5309-a4df-98e3-b55b-45187ab2dd97.png)

# ②チャネルIDを取得する
チームの特定は少し難しいので後ほど説明します。
チャネルIDは先ほど取得しておいた`joinUrl`に含まれています。…というか、チャネル会議ではない場合のチャットIDと同じです。
`19:meeting_...@thread.v2`という形式になっている部分です。

`joinUrl`を`/`で分割して、6番目（0はじめのインデックスで5）の部分を取り出します。
![2025-01-11_12h15_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/08d9d0f8-3ccb-b1e9-8edf-bcda043c79db.png)
```plaintext:作成
split(
    variables('joinUrl'), 
    '/'
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/3e1a7272-fd01-623d-319b-a092ca719461.png)
```plaintext:変数を初期化する：chatId
outputs('作成')?[5]
```

# ③スレッドIDを取得する
チャネル会議の場合のスレッドIDは同じく`joinUrl`に含まれており、`/`で分割した7番目（0はじめのインデックスで6）の部分になります。
ただし、末尾に`?`で始まるクエリストリングがついている場合がありますので、その部分を除去する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/2425d745-84eb-c28e-3166-722c4b25aa8e.png)

```plaintext:変数を初期化する：messageId
split(
  outputs('作成')?[6],
  '?'
)?[0]
```

# ①チームIDを取得する
チームのIDは`joinUrl`や会議イベントアイテムに含まれておりません。
そのため、追加でなんらかの方法で情報を取得する必要があります。

会議イベントの開催者`organizer`を見ると、ユーザーではないメールアドレスが設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/7eba4f72-d9e8-cf5c-7d20-1a58b8f70a15.png)

このメールアドレスは、チームの裏にあるMicrosoft 365 グループのメールアドレスとなっています。
チームのIDとこのグループのIDは共通していますので、メールアドレスをもとにグループの情報を調べることができれば、チームを特定することができます。

:::note warn
この開催者`organizer`が、共有チャネルで作成された会議の場合は、チームのMicrosoft 365 グループとは異なるものになっているようです。
おそらく、共有されてチームに参加していないユーザーが参加している可能性があることから、ホストチームに対する代理送信権限を持っていない可能性があるため、チームを開催者にできないのではないかと推測しています。
この問題は、共有チャネルで作成された会議の可能性に目を瞑ることで解消しています。
:::

メールアドレスからグループを取得するアクションが見当たりませんので、Microsoft Graph APIのfilter条件を使って検索します。

https://learn.microsoft.com/ja-jp/graph/api/group-list?view=graph-rest-1.0&tabs=http

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/df9a9796-bf90-58f5-55ac-b5e84cb4d0b6.png)

```uri:URI
https://graph.microsoft.com/v1.0/groups?$filter=mail eq '@{triggerOutputs()?['body/organizer']}'
```

検索結果は複数の可能性があるため配列になっていますので、下記のようにグループIDを取り出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/bdd0f295-a2f7-a5a4-7fa5-c224030588a8.png)
```plaintext:変数の設定
body('HTTP_要求_V2_を送信する')?['value']?[0]?['id']
```

# チャネル会議か否かを判別する
チャネル会議かどうかによって、メッセージを投稿する方法や、そもそもチームの情報を取得する必要の有無が変わるため、会議の種類を判別する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/db1991f5-9613-a916-25f2-555c76e038b5.png)

'messageId'が`0`かどうかで判別できるのですが、単純に以下のように設定すると、`0`が数値として扱われるため、想定動作となりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ed2312bd-627b-b733-a1fa-b43394614d2c.png)


文字列型として比較しないといけないので、`string`関数を使ったり文字列型の変数を用意するなどして、文字列型の`0`を用意する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/55fcb082-a4d0-0100-15b3-c82327d04955.png)

# おわりに
チャネル会議でもおかんを召喚したかったため工夫してみました。

https://sasami-axis.hatenablog.com/entry/2024/06/12/232607

最近は共有チャネルの仕様に悩まされることが多いので、どなたか解決方法がわかる方がおられましたらご教示いただけますと幸いです。