概要
- Power Automateを使ってSharePointのライブラリに指定のフォルダを作ってファイルをアップロードするフローを作成してみました。
- Flowボタンから実行するインスタントフローを使って、フォルダ名の指定やファイルの登録を行います。
背景
- SharePoint上に社内ExcelテーブルのIDと紐づくフォルダを作って、その中に数枚写真を保存するという作業がありました。
- 主にPower BIからフォルダにリンクしたり、サムネイル表示したり。
- 職場のネットワーク環境が悪く、手作業でSharePointにフォルダを作るのも遅いし、Automateで少しでも楽できないかと考えました。
- 覚え書きとして投稿してみます。
- 結論的にはローカルでフォルダを作ってフォルダごとアップロードする方が早かったですが・・
フローの解説
全体
ポイント
SharePointにファイルを保存するにあたり、File1~3に設定した引数からファイル名、ファイルコンテンツを取得する必要があります。
ただ、普通にトリガーの出力にある「File1」の中身を確認しても、以下のようにファイルコンテンツしか無く、ファイル名がありません。
クリックしたときに「本文(triggerBody)」から以下の参照が設定されるからですね。
triggerBody()?['file']?['contentBytes']
そこで、出力にある「本文」の中身を確認してみます。
fileはcontentBytesとnameがあり、それぞれコンテンツとファイル名が格納されていますね。
File1~3の内部名は、file、file_1、file_2となっているのでちょっとややこしいですね。
※作成アクションで本文を設定してテストし中身を確認。Firefoxだとjsonをいい感じに整形してくれます。
ということで以下のようにしてファイル名、コンテンツを取得するようにします。
triggerBody()?['file']?['name']
triggerBody()?['file']?['contentBytes']
実際には、ファイルの数だけ関数を書くのは非効率なので、先に引数名の配列を作成し、Apply to eachで回して動的に参照する工夫を行います。
outputs('作成_Body')?[items('Apply_to_each')]?['name']
解説
作成 Body
これは本文の出力確認用なので無くてもOKです。
作成 FolderPath
フォルダを作成するフォルダ(親)のパスを入力。/DocLib以降のパスです。
新しいフォルダーの作成
concat関数で文字列を結合してファイルパスを生成。
既にあるフォルダを作成してもエラーにならず、中身も消えないので事前の存在確認は不要です。
引数名の配列
トリガーの引数であるFile1~3の内部名は、file、file_1、file_2なので配列形式で指定。
Apply_to_each
先程の配列をApply_to_eachで一要素ずつ参照し、値をもとにtriggerBody()を参照しそれぞれのファイル情報を取り出します。
ループの現在のアイテムはitems('Apply_to_each')
で参照できるため、以下のようにすると、トリガーの本文から動的に値を取得できます。
triggerBody()?[items('Apply_to_each')]
条件 引数の空判定
ファイルが必ず3つ添付されるとは限らず、空の引数を参照するとエラーとなります。
条件アクションでfile引数が指定されているかチェックします。
Empty(triggerBody()?[items('Apply_to_each')])
はいの場合
ファイルの作成アクションでファイルの作成を行います。
ファイル名
triggerBody()?[items('Apply_to_each')]?['name']
ファイルコンテンツ
triggerBody()?[items('Apply_to_each')]?['contentBytes']
以上です。
ファイル登録後にFlowBotからTeamsチャットへファイルの作成の出力「アイテムへのリンク」を使って保存先を通知してもいいですね。