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

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

【質問回答】【Power Automate】「選択したファイルの場合」トリガーで取得できるURLを短縮URLとして取得する

あんこ(@ankoromochi7793)さんからまた検証ネタのリクエストをいただきました。

やってみましょう。

(*'ω'*)

概要

このフローはSharePointの「選択したファイルの場合」トリガーで得られるURLを短くしたうえで取得します。

「選択したファイルの場合」トリガーはSharePointライブラリにある任意をファイルを起点としてフローを開始するトリガーです。


このトリガーから得られる情報には起点となったファイルのURLが含まれています。


このURLが、、とても長いです。(´・ω・`)

https://XXXXXX.sharepoint.com/sites/msteams_c7dfa6/_layouts/15/Doc.aspx?sourcedoc=%7B8a0189ec-9821-4e94-a2db-5c99d5d64ef7%7D&action=default&uid=%7B8A0189EC-9821-4E94-A2DB-5C99D5D64EF7%7D&ListItemId=3&ListId=%7B06346B4D-8001-4CE1-B35A-9BDD3A4DE98F%7D&odsp=1&env=prod


このファイルのURLをできる限り短くする、というのが今回の課題です。

調べたところ、このURLのクエリストリングのうちsourcedocパラメータ以外は省略してもURLとしては有効なようです。なので今回作成するフローではsourcedoc以外のパラメータをURLから削除する処理を組みます

とにかく長い。Word、ExcelPowerPointそれぞれでパラメータの種類が若干違いますが、sourcedocパラメータは必ず付いています。sourcedocパラメータ以外は省略可能っぽいので、sourcedocパラメータ以外は消しちゃいます。

https://xxxx.contoso.com/:w:/r/sites/office365/_layouts/15/Doc.aspx?sourcedoc=AAAA...AAAAA
多少は短くなりました。


SharePoint/OneDriveのドキュメントのURLを多少短くする - Qiita


クエリストリングを操作する手法として、以前このブログで解説した方法を使います。今回のフローの仕組みはこの記事で解説している処理の転用です。そのため、重複する部分については今回は解説を割愛します。
wataruf.hatenablog.com

フロー図

フローの使用イメージ

フローの実行対象とするファイルで「・・・」>「自動化」>「(作成したフローの名前)」を選択します。


「フローの実行」をクリックします。


フローbotによってファイルのURLがチャットで送られています。これがフローによってsourcedoc以外のパラメータが削除されたURLです。これをクリックすると、、


ファイルが開きます。このファイルはこのフローの起点となったファイルです。ちゃんとURLとして正しく動作していることが分かります。

ステップごとの解説

「選択したファイルの場合」トリガー

このトリガーは「SharePoint」>「選択したファイルの場合」です。このアクションは指定したSharePoint上のファイルを対象に手動でフローを実行するためのトリガーです。

このアクションでは、どのサイトのどのライブラリでこのトリガーを使用するかを指定します。

 

「選択-クエリストリングをKeyとValueの配列にする」アクション

このアクションは「データ操作」>「選択」です。URLのクエリストリングをKey-Value形式の配列に変換します。

"from" : "@split(split(triggerBody()?['entity']?['itemUrl'],'.aspx?')[1],'&')",
"select": "@{substring(item(),0,indexOf(item(),'='))}": "@substring(item(),add(indexOf(item(),'='),1))"

このアクションの出力は下図の通りです。

 

「作成-簡易版JSON Dictionaryを作る」アクション

このアクションは「データ操作」>「作成」です。後続のアクションでKeyをもとにValueを呼び出せるようにするため、簡易版JSON Dictionaryの形式に変換します。

"@json(concat('{',replace(replace(replace(replace(string(body('選択-クエリストリングをKeyとValueの配列にする')),'{',''),'}',''),'[',''),']',''),'}'))"

このアクションの出力は下図の通りです。


「簡易版JSON Dictionary」は私が名付けた手法です。別の記事で解説していますので興味あるかたはこちらを参照してください。
wataruf.hatenablog.com

 

「作成-短縮版URL」アクション

このアクションは「データ操作」>「作成」です。これまでの処理で作成した配列から「soucedoc」のValueだけをとりだして元のURLと文字列結合します。これで目的のURLが取得できました。

"@concat(split(triggerBody()?['entity']?['itemUrl'],'.aspx?')[0],'.aspx?sourcedoc=',outputs('作成-簡易版JSON_Dictionaryを作る')?['sourcedoc'])"

  

「チャットまたはチャネルでメッセージを投稿する」アクション

このアクションは「Microsoft Teams」>「チャットまたはチャネルでメッセージを投稿する」です。このアクションは目的のURLをフローが提示するためにいれたアクションです。このアクションはURL短縮の工程には不要です。

入力

"poster": "Flow bot",
"location": "Chat with Flow bot",
"body/recipient": "@{triggerOutputs()['headers']['x-ms-user-email-encoded']};",
"body/messageBody": "@outputs('作成-短縮版URL')"

 

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

github.com

 

さいごに

検証ネタを提供いただいたリプライツリーであんこ(@ankoromochi7793)さんに検証結果をご連絡しました。今回も面白い検証ネタの提供ありがというございました。m(__)m



今回は以上です。