Teamsのチャネルを新しいウィンドウで開きたい

# はじめに
Teamsが新しくなって、スレッドを新しいタブで開くことができるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/94aeaac4-3be8-2ce7-e9e8-4b0977c71f93.png)

そのほかにも、チャットやタブ、アプリバーも新しいウィンドウで開けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/d21b1008-f918-4e32-34cd-e14e92751d49.png)

ですが、チャネルやチームはそのメニューがありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e88cff92-fb31-6193-dc7b-e05d072e11cc.png)

この記事はメニューにない、チャネルを新しいウィンドウで開くためのボタンをPower Automate で作成するフローです。

動作イメージは以下の通りです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">スレッド単位じゃなくて、チャネル単位で新しいウィンドウで開きたかったので、フローで何とかした<br>副産物として、リンクの取れないプライベートチャネルでも開けるようになりました！ <a href="https://t.co/eGxpx1jDgp">pic.twitter.com/eGxpx1jDgp</a></p>&mdash; おいしみ (@ksgiksg) <a href="https://twitter.com/ksgiksg/status/1738596453340401828?ref_src=twsrc%5Etfw">December 23, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# Teamsの設定
この機能を使うためには、設定：`Teams ウィンドウでコンテンツを開いています`を**新しいウィンドウ**を選択した状態にしておくことが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ce239689-501d-da14-a93a-37b74ad34720.png)

この設定をONにしておくと、例えばこのような通知トーストをクリックしたときにも、新しいウィンドウで開く動作となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5a0ecb55-896e-4339-c4eb-0e476fd49eca.png)

この設定を利用してチャネルを新しいウィンドウで開くためのボタンを作成します。

# チャネルのリンク
チャネルには、「標準チャネル」「共有チャネル」「プライベートチャネル」の3種類があります。
この3種類は、チャネルを作成するときにも確認できますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/d0c21370-040f-7d9d-3de0-187c3d5153a9.png)

このうち、「標準チャネル」は**チャネルへのリンク**を取得することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c6d20306-a5fa-01a2-8289-279870ebb8d9.png)

ここで取得したリンク先に、ブラウザなどTeamsの外からアクセスしてみます。

ブラウザのアドレスバーに貼り付けて、Enter！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6c5f820f-1c56-8db8-3f5f-e439dd48b12f.png)

Teamsデスクトップアプリで開くか確認されるので「開く」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/aea88ef4-e82d-fb7c-8eee-440d68b90042.png)

先ほどTeamsの設定を変えておいたので、新しいウィンドウでチャネルが開かれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6efa78b6-d9cc-3ed3-cae2-acc9fcf7f91d.png)

これを利用すればチャネルが新しいウィンドウで開けるのですが、ブラウザにいちいち移動するのは面倒ですし、なにより「共有チャネル」「プライベートチャネル」ではリンクが取得できません。

これらの問題を解決するために、Power Automateを使用します。

# フローの作成
フローの全体像はこのようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/15f89ff8-8362-33d8-d28e-3d2dc825e13f.png)

**選択したメッセージ**を起点にチームを特定し、**タスクモジュールで応答**で作成したリンクをアダプティブカードにして表示させます。
このトリガーは、プライベートチャネルでは使用できないので、標準チャネルか共有チャネルのメッセージから呼び出す必要があります。

## チャネルの一覧表示
必要なチャネルの情報を取得するためのアクションです。
チームの指定は、カスタム値からトリガーのチームIDを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e4e16b00-fa23-ce44-2260-05245cc54159.png)

取得できる値はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8afebffe-c7b9-9248-5a5d-1b593df8d192.png)

このアクションで、チャネルへのリンクとなる`webUrl`が取得できるので、あとはこのリンクを開くボタンを作ってあげればOKです。

## アダプティブカード
説明の順番とフローの順番が前後しますが、最終的にはこのタスクモジュールでアダプティブカードを表示させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/de2c03cb-7f2f-dd70-d0e0-9b47b240b8e2.png)

実際の動きとしてはこのような画面をTeamsで表示し、ボタンをクリックできるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/be3efa59-442e-b69a-1ddc-0f27f81d3f3a.png)

ということで、最終的に作りたいカードから先に考えておきます。

https://www.adaptivecards.io/designer/

リンクが開けさえすればよいので、`Action.OpenUrl`のボタンを配置できればなんでも大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/2ea2d75c-0996-6755-7d85-77e34da907d9.png)

チャネルの数だけボタンを配置したいので、テーブルを使ってこのように作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/970ef301-af9d-4e21-8d81-26d26bd81f3a.png)

## テーブル要素の作成
取得したチャネルの情報から、アダプティブカードの要素を作成します。

選択アクションで必要な部分のみ取り出して、ループを回して文字列変数に追加して・・・とやってもよいのですが、アクションの節約のために、選択アクション1個でやっちゃいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/3e0aa610-1c16-1109-b065-032054257405.png)

```powerfx:選択_マップ
json(
    concat(
        '{"type":"TableRow","cells":[{"type":"TableCell","items":[{"type":"TextBlock","text":"',
        item()?['membershipType'],
        '","wrap":true}]},{"type":"TableCell","items":[{"type":"ActionSet","actions":[{"type":"Action.OpenUrl","title":"',
        item()?['displayName'],
        '","url":"',
        item()?['webUrl'],
        '"}]}]}]}'
    )
)

```

## アダプティブカードの作成
選択アクションで作成したテーブル要素を入れ込んで、作成アクションでカード全体を完成させます。

```json:作成
{
  "type": "AdaptiveCard",
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.4",
  "body": [
    {
      "type": "Table",
      "columns": [
        {
          "width": 1
        },
        {
          "width": 3
        }
      ],
      "rows": @{body('選択')}
    }
  ]
}
```

以上でフローが完成です。
説明が前後しちゃったので、全体像と見比べてみてください。

# おわりに
こういうちょっとした便利を作れるのがPower Automate の醍醐味だと、個人的には思っています。
「利便性とフロー作成の手間が釣り合ってないやないかい！」というご指摘は耳にしない主義ですので悪しからず。(∵)