Power AutomateでSharePoint ファイルの情報で処理を分岐する
ファイルの比較(サイズ、ETag、作成日など)をするには
はじめに
SharePointにある他組織のファイルが更新されたら自組織のファイルを更新したい。
更新するタイミングは即時実行でなくても良いのでスケジュール実行を使います。
更新の有無はファイルのメタデータから判断しようと思います。
更新されているのがわかったら実際にダウンロードします。
Power Automate DesktopとPower Automate、2つ作ります。
1. PADで比較する場合
PAのフローは2つ。
- PAでスケジュール実行をトリガーに実行
- PADを呼び出し
PAのフローはPADを呼び出すだけ。
PADでSharePointのファイルに関する情報を取得して比較します。
[パスによるファイル メタデータの取得]アクションを使用します。
元のファイルの更新日時と更新するファイルの更新日時を比較して
元のファイルのが古かったらそこで終了。
新しくなっていたら続けます。
あとは通常通り、SharePointからファイルをダウンロードして
なんか作業してアップロードしておしまい。
PADのフロー。
画像はSharePointにあるファイルを比較してダウンロードする部分のみ。
最初はPADで作りました。
PAはステップ実行やブレークポイントなどの機能がなくテストが面倒くさく感じたので
試行錯誤をしながら組み立てるときはPADの方が作りやすかったです。
これが完成してからだと、PAでフローを作るのはすんなりできました。
設定はjsonで書いています。
{
"workDir": "",
"sharePoint": [
{
"siteAddress": "",
"sitePath": "",
"itemName": ""
},
{
"siteAddress": "",
"sitePath": "",
"itemName": ""
},
{
"siteAddress": "",
"sitePath": "",
"itemName": ""
}
],
"label": {
"destSheetName": "",
"secret": "",
"author": "",
"cell": ""
}
}
このフローの問題点はファイルの更新が必要ない場合でもデスクトップフローを呼んでいるところかな。と思います。更新の必要がなかったらデスクトップフローを呼び出す必要もないのでは?
ということでPAで比較して判断します。
更新の必要がなかったらそこで終了。
2. PAで比較する場合
- PAでスケジュール実行をトリガーに実行
- [パスによるファイル メタデータの取得]を使ってメタデータを取得
- 条件分岐で更新日時を比較
- ファイルが更新されていたら→PADを呼び出し
- ファイルの更新がなければ→呼び出さない
PAのフロー。
Teamsの投稿はついでに入れてみました。
PADで作った時はサイトアドレスやファイルパスなどの情報はjsonに書いたのですが、PAのフローは直接入れちゃってます。
自組織のアイテムは普通に出てくるので問題なく選べるのですが、
他組織のアイテムは権限が制限されているのでここからは選べない場合が多いと思います。
そうなったら直接入力します。
ウィンドウを広げると見やすくなります。
表示数を増やして、body/LastModified
を選びます。
条件式
PADのフローはシンプルになりました。
以上、SharePointにあるファイルを比較する方法でした。
おまけ
Excel テーブルの転記
データを確認してレコードを更新するのは面倒なのでまるごと転記しちゃいます。
レコードが少ないからこれで良いかと。テーブルのデータを削除してコピペ。
いきなりPADのスクリプトでコードを書くのは辛いので最初はVBAで動かします。
こんな感じになりました。これをVBScript用に修正して使っています。
Option Explicit
Sub テスト()
Call 転記("C:\..\○○○○.xlsx", _
"C:\..\□□□□.xlsx")
End Sub
Sub 転記(OrigFile As String, DestFile As String)
Dim origBook As Workbook, origSheet As Worksheet
Set origBook = Workbooks.Open(OrigFile)
Set origSheet = origBook.Worksheets(1)
Dim destBook As Workbook, destSheet As Worksheet
Set destBook = Workbooks.Open(DestFile)
Set destSheet = destBook.Worksheets(1)
destSheet.Range("A2").ListObject.DataBodyRange.EntireRow.Delete
With origSheet.Range("A2").ListObject.DataBodyRange
.AutoFilter 10, "<>"
.AutoFilter 11, "△△△△"
.Copy destSheet.Range("A3")
End With
Call ラベル削除(destSheet)
Call 入力規則解除(destSheet)
destBook.Save
destBook.Close True
origBook.Close False
End Sub
Sub ラベル削除(destSheet As Worksheet)
On Error Resume Next
destSheet.Shapes(1).Delete
End Sub
Sub 入力規則解除(destSheet As Worksheet)
destSheet.Range("A2").ListObject.DataBodyRange.Validation.Delete
End Sub
ファイルは1行目にテキストが書いてあって2行目からテーブルになっています。
- A2:テーブルの見出し行
- A3:テーブルのデータ
おわりに
UI操作は使っていないので普通にPCを使っているときに実行されてもバックグラウンドで処理が終わるので邪魔には思わないかな。
Discussion