ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

Microsoft Teams のチャネルに添付されているファイルのフルパスをPower Automateで取得する(改良版)

先日、下記のフローを公開しました。
wataruf.hatenablog.com

このフローは、Teams 内の指定した投稿に添付されているファイルのフルパスをチャットで教えてくれるフローです。このフローの残念な点を改良したのが今回の改良版フローです。

フローをGitHubで公開しました。

ここからダウンロードして使ってください。
github.com

どこを改良したのか?

改良前のフローの残念な点

改良前のフローでは、ボットがこんなチャットを通知します。

本文に記載されたURLからファイル名を除いてブラウザのアドレスバーに入力すると、目的のフォルダが表示されますが、TeamsではなくSharePointの画面で表示されてしまいます。

この画面でも欲しいファイルにアクセスできます。ですが、違和感なく操作を続けるためにはTeamsの画面のまま目的のフォルダに移動したいです。

これがTeams・SharePointのモヤっとする仕様のひとつであり、前回公開したフローで回避できなかった残念な点です。

なぜSharePointの画面で開いてしまうのか?

Teamsのファイル格納領域の実体はSharePointです。

また、Teamsに添付されたファイルのURLは [Attachments]配列の配下にある[ContentUrl]に記載されています。改良前のフローはこの[ContentUrl]に記載されているURLを取得してチャットでくれるフローでした。

この [ContentUrl]に記載されているURLはファイルの格納場所を表す素のURLです。つまり、SharePoinサイトのURLです。

そのため、このURLにアクセスすると「SharePointに対するアクセス要求があった」と判断されてSharePointの画面が表示されます。

どう改良したのか?

Teamsの画面でファイルにアクセスするためには、素のURLではなくTeams用のURLにアクセスする必要があります。

この「Teams用のURL」をフロー内で作成するようにしたのが改良点です。

動作イメージ

フローの起動のしかたは改良前と変わらりません。対象の投稿で「・・・」>「その他の操作」>「添付ファイルのファイルパスを確認」を選択します。

5秒ほど待つとbotからチャットが送られてきます。

このチャット本文に記載されているリンクは、リンクテキストは巣のURLのままですが、リンク先がTeams用のURLになっています。これをクリックすると

Teamsのフォルダのまま対象のフォルダに移動します。

仕組みの解説

フロー図

改良版のフローの全体図は以下の通りです。

改良して追加されたのは「Apply to each」の部分

URLの生成を行っている、この「Apply to each」には2つのアクションがあります。

  • 1つめのアクション「変数の設定 - Teams画面でフォルダを開くURL」が行っていることは、Teams用のURLの作成です
  • 2つめのアクション「文字列変数に追加」が行っていることは、チャット本文に記載するハイパーリンクの作成です


アクションごとの解説

1.「変数の設定 - Teams画面でフォルダを開くURL」アクション

これは「変数」-「変数の設定」アクションです。入力情報として受け取った[contentUrl]、つまり添付ファイルのフルパスをもとにして、その親フォルダをTeamsで開くURLを作成します。

入力されたパスと出力されたパスの例が以下の通りです。

・【入力】添付ファイルのフルパス

https://m365x000309.sharepoint.com/sites/Design/Shared Documents/American Design awards/20220420/添付ファイル.docx

・【出力】添付ファイルの親フォルダをTeamsで開くURL

https://teams.microsoft.com/_#/files/American%20Design%20awards?threadId=19:2c289e0756c34110a4726aa3d86537fe@thread.tacv2&ctx=channel&rootfolder=%2Fsites%2FDesign%2FShared%20Documents%2FAmerican%20Design%20awards%2F20220420

関数の解説

この「添付ファイルの親フォルダをTeamsで開くURL」の構造は分解すると以下の通りになります。

① 固定の文字列
https://teams.microsoft.com/_#/files/


② チャネルの表示名をURIエンコードした文字列
American%20Design%20awards


③ 固定の文字列
?threadId=


④チャネルID
19:2c289e0756c34110a4726aa3d86537fe@thread.tacv2


⑤ 固定の文字列
&ctx=channel&rootfolder=


⑥ 対象フォルダのサーバー相対パスURIエンコードした文字列
%2Fsites%2FDesign%2FShared%20Documents%2FAmerican%20Design%
20awards%2F20220420


①と⓷と⑤は固定の文字列なのでそのままアクションに入力します。


②の「チャネルの表示名をURLエンコードした文字列」は、「選択したメッセージの場合」トリガーの出力にあるチャネルの表示名を uriComponent関数でエンコードしています。

uriComponent(triggerBody()?['entity']?['teamsFlowRunContext']?['conversation']?['Name'])


④も同じく、「選択したメッセージの場合」トリガーの出力にある情報のひとつです。こちらは特に加工はしません。

@{triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['channel']?['id']}


⑥の「対象フォルダのサーバー相対パスURIエンコードした文字列」が一番ややこしいです。この関数が行っていることを言葉で表すと「添付ファイルのするパスの "/sites/ という文字列がある箇所"から”最後のスラッシュがある箇所"までを切り取ってURLエンコードする」です。

uriComponent(substring(item()?['contentUrl'],indexOf(item()?['contentUrl'],'/sites/'),sub(lastIndexOf(item()?['contentUrl'],'/'),indexOf(item()?['contentUrl'],'/sites/'))))

これで、添付ファイルの親フォルダをTeamsで開くURLが取得できました。

2.「文字列変数に追加」アクション

これは名前の通り、「変数」>「文字列変数に追加」アクションです。

フローが送信するチャットに記載する本文を定義します。アンカータグを使ってリンクテキストとリンク先で別のURLを指定しています。

別のURLを指定している目的は、リンクによって移動したい先はあくまで素のURLのほうであり、Teamsの画面のまま移動するために作成したURLはフローを使用するユーザーが意識しなくてもよいためです。

最後に

冒頭で記載しています通り、このフローはGitHubで公開しています。ご自由にお使いください。良い改良案があったら自由にカスタマイズして公開してもらって構わないです。
github.com

以上です。