💬

Power AutomateでSharePoint ファイルの情報で処理を分岐する

2024/02/08に公開

ファイルの比較(サイズ、ETag、作成日など)をするには

はじめに

SharePointにある他組織のファイルが更新されたら自組織のファイルを更新したい。

更新するタイミングは即時実行でなくても良いのでスケジュール実行を使います。
更新の有無はファイルのメタデータから判断しようと思います。
更新されているのがわかったら実際にダウンロードします。

Power Automate DesktopとPower Automate、2つ作ります。


1. PADで比較する場合

PAのフローは2つ。

  1. PAでスケジュール実行をトリガーに実行
  2. PADを呼び出し

PAのフローはPADを呼び出すだけ。
PA1

PADでSharePointのファイルに関する情報を取得して比較します。

[パスによるファイル メタデータの取得]アクションを使用します。
https://learn.microsoft.com/ja-jp/connectors/sharepointonline/#get-file-metadata-using-path

元のファイルの更新日時と更新するファイルの更新日時を比較して
元のファイルのが古かったらそこで終了。
新しくなっていたら続けます。

あとは通常通り、SharePointからファイルをダウンロードして
なんか作業してアップロードしておしまい。

PADのフロー。
PAD1

画像はSharePointにあるファイルを比較してダウンロードする部分のみ。

最初はPADで作りました。
PAはステップ実行やブレークポイントなどの機能がなくテストが面倒くさく感じたので
試行錯誤をしながら組み立てるときはPADの方が作りやすかったです。
これが完成してからだと、PAでフローを作るのはすんなりできました。

設定はjsonで書いています。

Settings
{
  "workDir": "",
  "sharePoint": [
    {
      "siteAddress": "",
      "sitePath": "",
      "itemName": ""
    },
    {
      "siteAddress": "",
      "sitePath": "",
      "itemName": ""
    },
    {
      "siteAddress": "",
      "sitePath": "",
      "itemName": ""
    }
  ],
  "label": {
    "destSheetName": "",
    "secret": "",
    "author": "",
    "cell": ""
  }
}

このフローの問題点はファイルの更新が必要ない場合でもデスクトップフローを呼んでいるところかな。と思います。更新の必要がなかったらデスクトップフローを呼び出す必要もないのでは?

ということでPAで比較して判断します。
更新の必要がなかったらそこで終了。


2. PAで比較する場合

  1. PAでスケジュール実行をトリガーに実行
  2. [パスによるファイル メタデータの取得]を使ってメタデータを取得
  3. 条件分岐で更新日時を比較
  4. ファイルが更新されていたら→PADを呼び出し
  5. ファイルの更新がなければ→呼び出さない

PAのフロー。
PA2

Teamsの投稿はついでに入れてみました。

PADで作った時はサイトアドレスやファイルパスなどの情報はjsonに書いたのですが、PAのフローは直接入れちゃってます。

自組織のアイテムは普通に出てくるので問題なく選べるのですが、
1

他組織のアイテムは権限が制限されているのでここからは選べない場合が多いと思います。
そうなったら直接入力します。
2

ウィンドウを広げると見やすくなります。
3

表示数を増やして、body/LastModifiedを選びます。
4

条件式
Condition Expression

PADのフローはシンプルになりました。
PAD2

以上、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