LoginSignup
23
17

Teamsの投稿からOneDriveに添付ファイルを一括ダウンロードするフロー

Last updated at Posted at 2023-02-26

はじめに(やりたいこと)

Teamsの投稿(メッセージ)で複数のファイルが送られてきたときに、添付されているすべてのファイルをダウンロードしたい。ということをPower Automate を使って実現しました。
image.png

メッセージから選択してフローを起動すると、チャットで通知が届きます。
チャットに記載のリンクをクリックすると、自分のOneDrive for Businessに保存されたファイルが確認できる仕様です。
image.png
image.png

フローの概要

フローの全体像がこちらです。
メッセージの詳細を確認して添付ファイルを確認し、Apply to eachで添付ファイルを1つずつ保存、最後に通知を送るという流れです。
make.powerautomate.com_environments_Default-b794cd83-44cc-447c-856e-a27e55624c65_flows_shared_b2f9cde2-2e09-4483-91a6-fed5d7db87c0(PowerAutomate) (2).png

フローの詳細

ここから、フローの要素それぞれについて解説していきます。

選択したメッセージの場合

Teamsのメッセージから手動で起動するためのインスタントトリガーです。
初期設定のままなにも編集していないので、今回特に解説することはありませんが、アダプティブカードを設定してフローの起動時にオプションを選択できるようにすると便利ですよね。
image.png

メッセージ詳細を取得する

メッセージの種類

トリガーのアウトプットには添付ファイルの情報が含まれていないので、改めてメッセージの詳細を取得します。
Teamsのメッセージには、チャネルの親投稿・返信、グループチャット、個人チャットと複数の種類がありますが、いずれかに関わらず[メッセージの種類]を[グループチャット]にすることで取得できます。
image.png
詳しくは、わたるふさんの解説をご覧ください。

メッセージへのリンク

メッセージの種類で分岐が必要ないのは利点ですが、グループチャットではなかった場合(チャネルの投稿の場合)にはMessageLink が正しいリンクにならないようです。
最終通知に記載する、選択したメッセージへのリンクには、「メッセージ詳細を取得する」のMessageLink ではなく、トリガー「選択したメッセージの場合」のlinkToMessage を使用します。
image.png
image.png

通知のこの部分です。
image.png

添付ファイルがなければ終了

取得したメッセージ詳細に対して、添付ファイルが1つもない場合は処理を終了します。
make.powerautomate.com_environments_Default-b794cd83-44cc-447c-856e-a27e55624c65_flows_shared_b2f9cde2-2e09-4483-91a6-fed5d7db87c0(PowerAutomate).png
条件にはempty 関数を使用して、添付ファイルが空(なにもない)状態かどうかを確認し、いいえ:添付ファイルがなかった場合は[終了]アクションでフローを終了させます。
image.png

添付ファイルのダウンロード

添付ファイルがあった場合にはApply to each で添付ファイルを1つずつ保存していきます。

必須ではありませんが、時間短縮のためコンカレンシー制御はオンにしています。Teamsの投稿への添付ファイルは最大10件が登録できるようなので、並列処理の次数も合わせて10件にしています。(合わせる必要もないのですが、あってると気持ちがいいので😗)

image.png

そもそもTeamsの添付ファイルって?

以下の画像はチャネルの投稿へ添付ファイルを追加しようとする画面です。
4つの選択肢が出ていますが、実際はSharePointもしくはOneDrive for Businessに保存したファイルへのリンクが登録される仕様です。
[コンピューターからアップロード]からローカルのファイルを選択した場合でも、SharePointかOneDrive for Businessに保存されます。
image.png

そのため、「メッセージ詳細を取得する」で取得した添付ファイル(attachments)には、ファイルへのリンクURLが保存されています。
image.png

一部例外があり、例えばアダプティブカードはattachments として保存されますが、contentUrl がnullであり、カードのJSONがcontent に保存されています。
image.png
image.png

パスによるファイル コンテンツの取得

おそらくココがこのフローの中で独自性のある部分です。
先ほど取得したファイルへのリンクURLであるcontentUrl から、ファイルのデータそのものであるファイルコンテンツを取得します。
contentUrl をうまく加工し、Inputに必要な[サイトのアドレス]と[ファイル パス]に分割します。
image.png

ここで改めてcontentUrl を確認すると、前半部分が[サイトのアドレス]、後半部分が[ファイル パス]になっていることがわかります。
image.png

よって以下の関数で[サイトのアドレス]と[ファイル パス]を取得します。

作成-split-
split(item()?['contentUrl'],'/')
作成-dataset-
join(take(outputs('作成-split-'),5),'/')
作成-path-
join(skip(outputs('作成-split-'),5),'/')

ここで一つ疑問が残ります。
SharePointのファイルはこのアクションで取得できるが、OneDrive for Businessから共有されたファイルはどうするのか?ということです。
結論から言うと、OneDrive for BusinessのファイルもこのSharePointコネクタのアクションで取得することができます。

OneDrive for BusinessのサイトURLを確認すると「sharepoint」という文字が含まれていることがわかります。
個人的な理解ですが、OneDrive for Businessは個人用のSharePointサイト といった感じで、本質的な中身は同質のように思います。
image.png

ファイルの作成

ファイルコンテンツが取得できたら、[ファイルの作成]で指定のフォルダにファイルを保存(ダウンロード)し、成功したファイル名として変数に記録します。
image.png

保存するフォルダ名はなんでもいいのですが、重複しないよう「タイムスタンプ+メッセージのID」としています。
image.png

失敗時の処理

以上がダウンロード処理ですが、ダウンロード失敗に備えた処理も考えておきます。
image.png

考えられる失敗は様々ですが、例えば以下のようなことが考えられます。

  • 投稿後にファイルが移動・削除されている。
  • リンクが共有されたがダウンロードするための適切な権限がない。
  • 共有されたリンクが間違っている。

スコープに続くアクションの設定、実行条件の構成から、失敗時のみに実行されるようにチェックを入れます。
image.png
image.png

結果の通知

最後にダウンロード結果を通知します。
make.powerautomate.com_environments_Default-b794cd83-44cc-447c-856e-a27e55624c65_flows_shared_b2f9cde2-2e09-4483-91a6-fed5d7db87c0_backUrl=%2Fenvironments%2FDefault-b794cd83-44cc-447c-856e-a27e55624c65%2Fflows%2Fsh.png

ダウンロードフォルダへのリンク

OneDrive for Bussinessコネクタには、ファイルやフォルダへのリンクを返すアクションがありません。
共有リンクを作成する方法もありますが、下手に他の人が見られる状態にはしたくないですし、なによりフォルダへのリンクはこの方法ではできません。

なので、無理やりな感はありますがリンクURLを自力で生成しています。

httpsから始まり、${テナント固有の文字列}-my.sharepoint.com/personal/ に続き、ユーザー固有のページを特定する情報として、UPN(ユーザープリンシパルネーム)から決まるアドレスが記載されます。
UPNのうち、URLとして使用できない「@」「.」が「_」に置換されていたので、同じようにreplaceで置換しています。
image.png

作成
replace(
    replace(
        outputs('マイ_プロフィールの取得_(V2)')?['body/userPrincipalName'],
        '@',
        '_'
    ),
    '.',
    '_'
)
文字列変数に追加-結果-(URL部分)
https://v45dm-my.sharepoint.com/personal/@{outputs('作成')}/_layouts/15/onedrive.aspx?id=/personal/@{outputs('作成')}/Documents@{variables('フォルダ')}

ただし、こちらは開発用の自テナントのみでの検証結果ですので、フォルダへのリンクはあくまでおまけとして扱っていただき、リンクが機能しない場合には、通知が届いたらOneDrive for Businessのホームから直接ファイルを確認いただくようお願いします。

おわりに

参考にフローのエクスポートファイルをgithubに保存しています。
ダウンロードフォルダへのリンクのテナント固有の文字列を各自の環境に合わせて書き換えていただく必要があるので、その点はご注意ください。

23
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
17