Power Automate で共有チャネルを作成する

::: note 
本記事は[Microsoft Power Automate Advent Calendar 2024](https://qiita.com/advent-calendar/2024/powerautomate) シリーズ1の18日目担当記事になります。
:::
# はじめに
この記事は、Power Automate を使って共有チャネルを作成する方法をまとめた記事です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/98e2fe9c-0e18-543b-30c8-1dec28005d69.png)

:::note warn
この記事で扱うのは、自分のテナント内の操作のみとなります。
他テナントのチームやゲストメンバーとの共有については、確認ができていませんのでご了承ください。
:::


# 共有チャネルの作成方法
まず、説明のために、作成元となるチームの情報を取得しておきます。
このチームをホストチームとして共有チャネルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f08cce23-4877-199c-0cdb-8a896b55e41f.png)

共有チャネルの作成には`Microsoft Graph API`を使用しますので、基本的にはこちらのアクションを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6371d5ba-7fbd-a21a-fe4e-9af22425f373.png)

詳しい使用は、公式のリファレンスページをご参照ください。

https://learn.microsoft.com/ja-jp/graph/api/channel-post?view=graph-rest-1.0&tabs=http#example-5-create-a-shared-channel-on-behalf-of-a-user

似たような方法で**プライベートチャネル**を作成する記事もありますので、良ければそちらもどうぞ！

https://qiita.com/ksgiksg/items/247b92b416b667e07b47

## ①もっとも単純な例
他の誰とも共有しない状態で作成します。
手動で作成する場合の、このチェックを入れずに作成するのと同等の結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/fd908827-ffdd-4cec-c012-a0e9b1e19b46.png)

`Microsoft Graph HTTP 要求を送信する`アクションを使用し、以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/49bcba58-544a-224a-6015-247786e29a5b.png)

```plaintext:URI
https://graph.microsoft.com/v1.0/teams/@{outputs('チームの取得')?['body/id']}/channels
```
```json:本文
{
  "displayName": "チャネル名①",
  "description": "チャネルの説明",
  "membershipType": "shared"
}
```
結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/baaf1073-4683-111d-908a-955089352e6a.png)
メンバーは特に指定しませんでしたが、自分が所有者に設定され、他に共有されるメンバーやチームはありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ca9d1670-71ab-c6e4-ba61-642cc91b5ff2.png)


## ②チームの全員と共有する
手動で作成する際に、このチェックを入れた状態と同じ方法でチャネルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/fbd4dc1c-dc04-f416-e447-bbcfb0475f59.png)

`Microsoft Graph HTTP 要求を送信する`アクションを使用し、以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b3fd1929-38b2-918c-67d1-43b951b74d56.png)

```json:本文
{
  "displayName": "チャネル名②",
  "description": "チャネルの説明",
  "membershipType": "shared",
  "sharedWithTeams":[
    {
      "id": "@{outputs('チームの取得')?['body/id']}"
    }
  ]
}
```
結果はこのようになります。
`チーム`に追加され、作成元のチーム全員と共有される状態になりました。
ちなみに、メンバー数の横に表示されている家のアイコンがホストチームを表すアイコンになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e0d82717-6f58-fb98-8e72-7c47516065e9.png)


## ③自分以外の所有者を追加する
先に、所有者に追加したいユーザー情報を取得しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/06e68cd8-78e9-ad99-e1da-d439e6729476.png)

ユーザー情報が取得できたら、`Microsoft Graph HTTP 要求を送信する`アクションを使用し、以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9b581520-eec6-5fb3-2633-b7d9aa11ccb1.png)
```json:本文
{
  "displayName": "チャネル名③",
  "description": "チャネルの説明",
  "membershipType": "shared",
  "members": [
    {
      "@odata.type": "#microsoft.graph.aadUserConversationMember",
      "user@odata.bind": "https://graph.microsoft.com/v1.0/users('@{outputs('ユーザー_プロフィールの取得_(V2)')?['body/id']}')",
      "roles": [
        "owner"
      ]
    }
  ]
}
```

結果はこのようになります。
自分以外に指定したユーザーも、所有者に設定されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/83981962-0b90-ea51-cd67-73b27f523151.png)

# 失敗例
ここからは、できそうでできない方法です。
どうもうまくいかないのですが、メモとして残しておきます。

# ④メンバーを設定する
所有者ではなく、メンバーとしてユーザーを追加できるかを試してみました。
`Microsoft Graph HTTP 要求を送信する`アクションを使用し、以下のように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5da3c8da-4905-3de0-c7fe-1631bb329f74.png)

```json:本文
{
  "displayName": "チャネル名④",
  "description": "チャネルの説明",
  "membershipType": "shared",
  "members": [
    {
      "@odata.type": "#microsoft.graph.aadUserConversationMember",
      "user@odata.bind": "https://graph.microsoft.com/v1.0/users('@{outputs('ユーザー_プロフィールの取得_(V2)')?['body/id']}')",
      "roles": []
    }
  ]
}
```
メンバーロールを空にしているのは、[メンバーの追加方法のページ](https://learn.microsoft.com/ja-jp/graph/api/channel-post-members?view=graph-rest-1.0&tabs=http)や、プライベートチャネルではうまくいった方法を参考にしています。

しかし、結果は以下の通りエラーとなりました。
エラーメッセージを読むと、どうもメンバー権限が認識されておらず、所有者として設定しようとして失敗しているような感じがします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/45e94da3-3445-41f6-b697-5db62b09b2cc.png)

ちなみに、ロールを空`[]`ではなく、ダメもとで`["member"]`にもしてみましたが、同様にエラーとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1f6ced9e-306f-1241-a0e6-295eed061d31.png)

:::note alert
共有チャネルの作成時に、初めからメンバーを設定することはできないようです。
:::


## ⑤自分以外の所有者を複数設定する
成功例では1人の自分以外のユーザーを所有者に設定しましたが、今度はそれが複数人でも設定できるか試してみました。
追加するメンバーは、適当なチームのメンバーを取得し、選択アクションを使って必要なJSON配列を作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/07214ce1-9b46-0e04-e5b1-82e9c76949c6.png)
`@`マークを直接入力しようとすると、数式と誤認識されてしまいうまくフローが保存できないので、変数を使うのがちょっとしたポイントです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/7c2a344f-1f4f-7f34-6e58-7d8becd76093.png)


準備ができたので、`Microsoft Graph HTTP 要求を送信する`アクションを使用し、以下のように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e7b16e62-4376-bd5a-2df1-99f46f7a6e92.png)

```json:本文
{
  "displayName": "チャネル名⑤",
  "description": "チャネルの説明",
  "membershipType": "shared",
  "members": @{outputs('選択')['body']}
}
```
結果は④と同様のエラーとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0e4f3894-dc19-c8a1-7530-9dbfb062e6f1.png)

エラーメッセージを読むと、所有者を複数指定して共有チャネルを作成できないように解釈できます。
> `In admin context, Users property must contain exactly one owner if it exists.`
> 管理者コンテキストでは、Users プロパティに所有者が存在する場合は、その所有者を 1 つだけ含める必要があります。

## ⑥作成元のチーム以外のチーム全員と共有する
共有チャネルは、ホストチーム以外のチームとも共有することができます。
これができるかどうかも試しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/345ed46c-1b44-8f07-77dd-d02030fa6be4.png)

共有先のチームとして、ホストチームとは別のチームの情報を取得しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5c0bf485-ed71-ea33-b271-1beb3f0caef6.png)

準備ができたので、`Microsoft Graph HTTP 要求を送信する`アクションを使用し、以下のように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/031714fd-63eb-96fe-50aa-1a0360e6f4f7.png)

```json:本文
{
  "displayName": "チャネル名⑥",
  "description": "チャネルの説明",
  "membershipType": "shared",
  "sharedWithTeams":[
    {
      "id": "@{outputs('チームの取得：共有先')?['body/id']}"
    }
  ]
}
```
これもエラーになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/50d23bb6-7a8c-8b4a-4d77-c0472094522b.png)
> `Channel can only be shared with host team {$作成元チームのID}.`
チャネルはホストチーム{$作成元チームのID}としか共有できない。

後から手動で設定はできるはずですが、少なくとも作成時には他のチームと共有することができないようです。

ちなみに、作成元のチームと一緒に設定しても、結果は同じくエラーとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8a0c4d05-a2c0-e79f-a1e5-a15ddd0aa94c.png)
```json:本文
{
  "displayName": "チャネル名⑥-2",
  "description": "チャネルの説明",
  "membershipType": "shared",
  "sharedWithTeams":[
    {
      "id": "@{outputs('チームの取得')?['body/id']}"
    },
    {
      "id": "@{outputs('チームの取得：共有先')?['body/id']}"
    }
  ]
}
```

# 注意点
成功した場合でも、作成できた共有チャネルの情報を取得することができません。
出力を見ても`body`に何も存在せず、動的なコンテンツでも作成完了したチャネルのIDなどを参照できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/aeb41e90-cfbc-8422-6934-6fbae2c46c7e.png)

この原因はステータスコードを見るとわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/adf49183-954a-c97a-80fe-86b3d0433669.png)

`"statusCode": 202`は「リクエストを受け取ったが処理はされていない」ことを示す番号です。
つまり、**「共有チャネルの作成依頼は受理されたが、まだ作成できてないので、作成後の情報は渡せませんよ」**ということになります。

https://qiita.com/takuo_maeda/items/9cff0b03e74f8f600eee

もし作成後に情報を取得したい場合は、作成を受理された後に、作成が完了したことを確認して取得する必要があります。
具体的には、チャネルの一覧を取得し、作成されるチャネル名などでフィルタ、見つからなければ少し待機してもう一度一覧から探す・・・という繰り返しを行う方法があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9da548f4-b546-3ab1-8aa0-5cd1370c5885.png)
![2024-12-16_01h11_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/d3620b72-e932-26c3-63f1-0f036c1a418f.png)
![2024-12-16_01h11_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/288a38cd-e68b-d563-547f-73cc679940d5.png)
![2024-12-16_01h12_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/d12e0f1a-2596-6b00-07b1-073b706b91b3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/07ebb9fb-4ca0-daca-ad64-64db557b75b2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/828746cd-335e-01c5-aa85-7a1bf5906d6f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/cdbc4b09-7a8e-f5a9-708e-78bd8ccf423b.png)

# おわりに
初心者向けの方法ではないですが、標準チャネル以外にも、プライベートチャネル・共有チャネルの作成が、Power Automate 通常ライセンス（プレミアムなし）でも可能です。
どうしても必要になった場合はご参考にいただけますと幸いです。