このサイトはアフィリエイトリンクを含んでいます
スポンサーリンク

【Power Automate】SharePointのファイル存在チェックで思わぬ苦戦!解決までの道のり

重複ファイルを検知したい AIで調べてみた
スポンサーリンク

Power Automateを活用してSharePointのドキュメントライブラリにファイルを自動保存するフローを構築しようとしたあんちゃんですが、同名ファイルの重複によるエラーに直面し、解決までに多くの試行錯誤を経験しました。この記事では、その具体的な苦戦と解決までの道のりを詳しくご紹介します。SharePointやPower Automateを利用している皆さんの参考になれば幸いです。

スポンサーリンク
  1. Power Automateでファイルの重複を回避したい!
    1. 初めての挑戦:ファイルの存在チェック
    2. 試行錯誤の連続:アクション選びの迷い
    3. パフォーマンスへの懸念:大量ファイルの影響
    4. フローの設計:存在チェックの実装
      1. フローの具体的な流れ
    5. エラー発生:データ型の不一致
      1. データ型の修正方法
    6. フィルタークエリの難しさ:FileDirRefの苦悩
    7. エラーメッセージ:「BadRequest」の壁
      1. エラーの詳細と原因分析
    8. 発見!動的コンテンツのスラッシュエンコード問題
      1. スラッシュエンコードの試み
    9. 最終手段:「パスによるファイルメタデータの取得」で完全勝利!
      1. 「パスによるファイルメタデータの取得」アクションの導入
        1. 設定手順
      2. フローの最終的なコード例
    10. 解決後のフローの安定化
    11. 成功までの鍵:正確なパス指定とエラーハンドリング
      1. 1. 正確なパス指定
      2. 2. 適切なエラーハンドリング
      3. 3. テストとデバッグ
    12. 詳細な解説
      1. ファイルの存在チェックに必要なアクション
      2. 動的コンテンツの取り扱い
        1. Composeアクションの活用
      3. エラーハンドリングの重要性
        1. Run Afterの設定
    13. 参考資料
  2. 詳細な解説
    1. ファイルの存在チェックに必要なアクション
    2. 動的コンテンツの取り扱い
      1. Composeアクションの活用
    3. エラーハンドリングの重要性
      1. Run Afterの設定
    4. 「パスによるファイルメタデータの取得」の利点
      1. 具体的なメリット
    5. 具体的なフローの構築
      1. 1. ファイルの追加
      2. 2. ファイルメタデータの取得(パス指定)
      3. 3. 条件分岐
      4. 4. ファイルの作成
    6. 成功までの鍵:正確なパス指定とエラーハンドリング
      1. 1. 正確なパス指定
      2. 2. 適切なエラーハンドリング
      3. 3. テストとデバッグ
    7. 今後の展望と改善点
      1. フローの最適化
      2. エラーハンドリングの強化
      3. ドキュメントの充実
    8. 終わりに
  3. 追加の詳細な解説
    1. ファイルの存在チェックに必要なアクション
      1. 1. ファイルメタデータの取得(パス指定)
        1. 設定方法
      2. 2. 条件分岐
        1. 条件の設定方法
      3. 3. ファイルの作成
        1. 設定方法
    2. 動的コンテンツの取り扱い
      1. Composeアクションの活用
      2. エンコードの自動処理
    3. エラーハンドリングの重要性
      1. Run Afterの設定
    4. テストとデバッグの重要性
    5. 成功までの鍵:正確なパス指定とエラーハンドリング
      1. 1. 正確なパス指定
      2. 2. 適切なエラーハンドリング
      3. 3. テストとデバッグ
    6. 今後の展望と改善点
      1. フローの最適化
      2. エラーハンドリングの強化
      3. ドキュメントの充実
    7. まとめ

Power Automateでファイルの重複を回避したい!

Power Automateでファイルの重複を回避したい!

Power Automateを使用してSharePointのドキュメントライブラリにファイルを作成する際、同名のファイルが既に存在するとエラーが発生します。この問題を回避するために、ファイルの存在チェック機能をフローに組み込む必要がありました。しかし、この実装が思った以上に難航し、なかなかうまくいきませんでした。

初めての挑戦:ファイルの存在チェック

最初に試みたのは、「ファイルの一覧を取得」アクションを使用して、同名ファイルが存在するかどうかを確認する方法です。しかし、私の環境ではこのアクションが見つからず、実行に移せない状況に陥りました。もしかすると、アクションの名称が異なるのかもしれないと考え、似たような名称のアクションを探しましたが、適切なものが見つからず困惑しました。

試行錯誤の連続:アクション選びの迷い

調査を進める中で、「ファイル(プロパティのみ)の取得」というアクションが近い機能を持っていることに気づきました。このアクションには、「ファイルのプロパティの取得」と「ファイルの取得(プロパティのみ)」の2種類があり、最初はその違いが理解できずに混乱しました。どちらのアクションが自分の目的に適しているのかを理解するまでに時間がかかり、試行錯誤を繰り返しました。

パフォーマンスへの懸念:大量ファイルの影響

私のSharePointリストには約6000件のアイテムがあり、各アイテムには3個以下の添付ファイルが存在します。このリストAのアイテムの進捗状況が変化すると、アイテムがリストBにコピーされ、添付ファイルもドキュメントライブラリに保存される仕組みです。この際、同名ファイルが発生するとエラーが発生するため、ファイルの存在チェックは必須となります。

「ファイルの一覧を取得」アクションを使用すると、処理が遅くなるのではないかと心配でしたが、ChatGPTに相談した結果、適切なフィルタークエリとインデックスを設定すれば、体感できるほどの遅延は発生しないとのアドバイスを受け、少し安心しました。

フローの設計:存在チェックの実装

次に、「ファイル(プロパティのみ)の取得」アクションを使って、ファイルの存在チェックを行うフローを設計しました。具体的には、このアクションでファイルの一覧を取得し、条件分岐を使って同名ファイルが存在するかどうかを判定します。存在する場合は、ファイル名を変更するか、上書きするか、スキップする処理を追加し、存在しない場合はそのままファイルを作成するようにしました。

フローの具体的な流れ

  1. アイテムの追加トリガー
    リストAのアイテムが更新された際にフローがトリガーされます。
  2. リストBへのアイテムコピー
    更新されたアイテムをリストBにコピーします。
  3. 添付ファイルの追加
    リストAからリストBに添付ファイルをコピーします。
  4. ファイルの存在チェック
    「ファイル(プロパティのみ)の取得」アクションを使用して、同名ファイルが存在するか確認します。
  5. 条件分岐
    ファイルが存在する場合と存在しない場合で処理を分岐させます。
  6. ファイルの作成またはスキップ
    存在しない場合は新規ファイルを作成し、存在する場合はスキップまたはファイル名を変更します。

エラー発生:データ型の不一致

エラー発生:データ型の不一致

フローを実装してみると、「条件」アクションでエラーが発生しました。原因は、length関数で文字列型の値と数値型の値を比較していたため、データ型の不一致が原因でした。式の書き方を修正し、適切なデータ型で比較することで、このエラーを無事解決することができました。

データ型の修正方法

誤った式:

length(triggerBody()?['ファイル名']) > 0

修正後の式:

greater(length(triggerBody()?['ファイル名']), 0)

このように、greater関数を使用して明示的に数値型の比較を行うことで、データ型の不一致エラーを回避しました。

フィルタークエリの難しさ:FileDirRefの苦悩

次に直面したのが、「ファイル(プロパティのみ)の取得」アクションで使用するフィルタークエリの書き方です。具体的には、FileDirRef eq '/sites/サイト名/Shared Documents/AAAAA/@{triggerBody()?['field_13/Value']}' のように書く必要がありました。ここでのポイントは、FileDirRefにはフルパスを指定する必要があること、そして @{triggerBody()?['field_13/Value']} の部分は動的な値を指定するための構文であることです。

しかし、このフィルタークエリを設定しても、うまく機能せず、空の配列が返ってくるという問題が発生しました。パスのエンコードや大文字・小文字の区別など、さまざまな可能性を検討し、SharePointのファイルの絶対パスをメールで確認するなど試行錯誤を繰り返しました。

エラーメッセージ:「BadRequest」の壁

さらに、「ファイルメタデータの取得」アクションを試みたところ、「BadRequest」エラーが発生しました。このエラーは、SharePointが指定したパスを正しく認識できていないことを示しています。ファイル名やパスのエンコード、SharePoint側の設定など、原因を特定するために多くの検証を行いましたが、なかなか解決には至りませんでした。

エラーの詳細と原因分析

エラーメッセージ:

{
    "statusCode": 400,
    "body": {
        "status": 400,
        "message": "Route did not match\r\nclientRequestId: ...\r\nserviceRequestId: ..."
    }
}

このエラーは、SharePoint APIが指定されたパスを認識できなかったことを意味します。主な原因として考えられるのは以下の通りです:

  1. ファイルパスの指定方法が不適切
    相対パスが正しく構成されていない可能性があります。
  2. URLエンコードの不備
    パス内に含まれる特殊文字やスペースが正しくエンコードされていない場合、SharePointがパスを認識できないことがあります。
  3. SharePointの内部設定や権限の問題
    Power AutomateがSharePointにアクセスする際の権限設定が不十分であったり、ドキュメントライブラリの名称がカスタマイズされている場合などです。

発見!動的コンテンツのスラッシュエンコード問題

発見!動的コンテンツのスラッシュエンコード問題

行き詰まりを感じたその時、動的コンテンツで生成されるパスに含まれるスラッシュ(/)が原因であることに気づきました。SharePointはスラッシュを特殊文字として扱い、正しく解釈できない場合があります。そこで、replace関数を使ってスラッシュを%252Fにエンコードしようと試みましたが、残念ながらこの方法では最終的にうまくいきませんでした。

スラッシュエンコードの試み

試した式:

concat('/Shared Documents/AAAAA/', replace(triggerBody()?['field_13/Value'], '/', '%252F'), '/', replace(item()?['DisplayName'], '/', '%252F'))

この方法では、スラッシュをエンコードすることでパスの認識を改善しようとしましたが、結果としてエラーが解消されず、再度「BadRequest」エラーが発生しました。

最終手段:「パスによるファイルメタデータの取得」で完全勝利!

諦めかけたその時、「パスによるファイルメタデータの取得」アクションを試してみることにしました。このアクションは、「ファイルメタデータの取得」とは異なり、動的コンテンツを含むパスを問題なく処理できる特性がありました。

「パスによるファイルメタデータの取得」アクションの導入

「パスによるファイルメタデータの取得」アクションを使用することで、動的に生成されたフルパスを正確にSharePointに渡すことができ、これまでのエラーを回避できることが分かりました。具体的な設定方法は以下の通りです。

設定手順
  1. 「パスによるファイルメタデータの取得」アクションの追加
  • フロー内で「アクションの追加」をクリックし、「パスによるファイルメタデータの取得」アクションを検索して選択します。
  1. アクションの設定
  • サイトアドレス: SharePointサイトのURLを選択または入力します。
  • パス: 動的コンテンツを使用してファイルのフルパスを指定します。例:
    plaintext /Shared Documents/AAAAA/@{triggerBody()?['field_13/Value']}/@{item()?['DisplayName']}
  • 注意点:
    • パス内のスペースや特殊文字は通常、エンコードの必要がありません。「パスによるファイルメタデータの取得」アクションは、SharePointが自動でエンコードを処理します。
    • 動的コンテンツを使用する際は、triggerBody()?['field_13/Value']item()?['DisplayName'] が期待通りの値を返しているかを事前に確認します。
  1. 条件アクションの追加
  • 「パスによるファイルメタデータの取得」アクションの後に「条件」アクションを追加します。
  • 条件の設定:
    • 左側: 「パスによるファイルメタデータの取得」アクションの出力から、ファイルの存在を示すプロパティ(例: IdName)を選択します。
    • 演算子: is not equal to
    • 右側: null
    • 具体例:
      plaintext @not(equals(body('パスによるファイルメタデータの取得')?['Id'], null))
    • 解釈: ファイルメタデータが存在する場合(ファイルが存在する場合)は「はい」、存在しない場合は「いいえ」と判定します。
  1. 分岐の設定
  • はい(ファイルが存在する場合):
    • 必要に応じて、ファイルが既に存在することを通知するアクション(例: メール通知)を追加します。
    • または、ファイル名を変更するための処理を追加します。
  • いいえ(ファイルが存在しない場合):
    • 「ファイルの作成」アクションを追加し、指定のフォルダに新しいファイルを作成します。
  1. ファイルの作成アクションの設定
  • サイトアドレス: 保存先のSharePointサイトのURL。
  • フォルダパス: 保存するフォルダのパスを指定します(例: /Shared Documents/AAAAA)。
  • ファイル名: 作成するファイルの名前を指定します(例: @{item()?['DisplayName']})。
  • ファイルコンテンツ: 必要に応じて、ファイルの内容を指定します。

フローの最終的なコード例

{
  "type": "OpenApiConnection",
  "inputs": {
    "parameters": {
      "dataset": "",
      "path": "/Shared Documents/AAAAA/@{triggerBody()?['field_13/Value']}/@{item()?['DisplayName']}"
    },
    "host": {
      "apiId": "/providers/Microsoft.PowerApps/apis/shared_sharepointonline",
      "connection": "shared_sharepointonline",
      "operationId": "GetFileMetadataByPath"
    }
  },
  "runAfter": {
    "添付ファイルの追加": [
      "Succeeded"
    ]
  }
}

この設定により、「パスによるファイルメタデータの取得」アクションが正しく動作し、動的なパス指定でもエラーなくファイルの存在を確認できるようになりました。

解決後のフローの安定化

解決後のフローの安定化

「パスによるファイルメタデータの取得」アクションを使用することで、フロー全体の安定性が向上しました。具体的には、以下のようなフローの流れとなりました。

  1. ファイルの追加
  • フローのトリガーとして、リストAからリストBへのアイテムコピーを設定します。
  • 添付ファイルをドキュメントライブラリに保存します。
  1. ファイルメタデータの取得(パス指定)
  • 「パスによるファイルメタデータの取得」アクションを使用し、以下のように設定します。
    plaintext /Shared Documents/AAAAA/@{triggerBody()?['field_13/Value']}/@{item()?['DisplayName']}
  1. 条件分岐
  • ファイルが存在するかどうかを条件で判定します。
  • はい(ファイルが存在する場合)
    • 必要に応じて、ファイルの上書きを避けるための処理(ファイル名の変更やスキップ)を実行します。
    • 例:メール通知を行い、ファイルが既に存在する旨を通知。
  • いいえ(ファイルが存在しない場合)
    • 「ファイルの作成」アクションを実行し、新たにファイルを作成します。
  1. ファイルの作成
  • 必要なファイルを指定のフォルダに作成します。
  • ファイル名や保存先フォルダを適切に設定します。

成功までの鍵:正確なパス指定とエラーハンドリング

成功までの鍵:正確なパス指定とエラーハンドリング

成功するためには、以下のポイントが鍵となります。

1. 正確なパス指定

「パスによるファイルメタデータの取得」アクションでは、動的コンテンツを含む正確なパス指定が求められます。Composeアクションを活用して、動的パスを正確に生成し、それをアクションに渡すことで、誤ったパス指定によるエラーを防ぎます。

2. 適切なエラーハンドリング

エラーが発生した場合でもフローが停止せず、適切な処理が行われるように、Run Afterの設定や条件分岐を適切に設定します。これにより、エラー時にもフロー全体が柔軟に対応できます。

3. テストとデバッグ

フローを実装したら、必ずテストを行い、期待通りに動作するかを確認します。特に動的コンテンツを含む場合は、パスが正しく生成されているか、エラーメッセージが出ないかを入念にチェックします。

詳細な解説

ファイルの存在チェックに必要なアクション

Power Automateでファイルの存在を確認するためには、いくつかのアクションを組み合わせてフローを設計する必要があります。主に使用するアクションは以下の通りです。

  1. ファイルメタデータの取得(パス指定)
    指定されたパスにファイルが存在するかどうかを確認するアクションです。動的なパス指定が可能で、スクリプト内で動的に生成されたパスを使用する場合に特に有効です。
  2. 条件分岐
    ファイルの存在有無に応じて異なる処理を行うために使用します。ファイルが存在する場合はスキップや上書き、存在しない場合は新規作成のアクションを実行します。
  3. ファイルの作成
    必要に応じて新しいファイルを指定のフォルダに作成するアクションです。

動的コンテンツの取り扱い

動的コンテンツを使用する際の注意点として、文字列の組み合わせやパスの正確な指定が挙げられます。特に、@{triggerBody()?['field_13/Value']}@{item()?['DisplayName']}のような動的コンテンツを含むパス指定では、正確なパス生成が求められます。

Composeアクションの活用

動的コンテンツを組み合わせる際には、「Compose」アクションを使用してパスを一旦構成し、その出力を後続のアクションに渡す方法が有効です。これにより、パス生成のロジックを明確にし、デバッグや検証がしやすくなります。

concat('/Shared Documents/AAAAA/', triggerBody()?['field_13/Value'], '/', item()?['DisplayName'])

このような式をComposeアクションに設定し、その出力を「パスによるファイルメタデータの取得」アクションに渡すことで、動的パスの正確な指定が可能となります。

エラーハンドリングの重要性

エラーハンドリングの重要性

フローを実装する際には、エラーハンドリングを適切に設定することが重要です。特に、ファイルの存在チェックにおいては、存在しない場合にエラーが発生することを考慮し、そのエラーをキャッチして適切な処理を行う必要があります。

Run Afterの設定

Power Automateでは、各アクションの実行結果に応じて次のアクションを設定することができます。例えば、「ファイルメタデータの取得」アクションが失敗した場合に「ファイルの作成」アクションを実行するように設定することで、フロー全体がエラーで停止することなく処理を継続できます。

"runAfter": {
  "ファイルメタデータの取得": [
    "Succeeded",
    "Failed"
  ]
}

このように設定することで、「ファイルメタデータの取得」アクションが成功した場合と失敗した場合の両方で次のアクションに進むことができ、柔軟なエラーハンドリングが可能となります。

参考資料

詳細な解説

ファイルの存在チェックに必要なアクション

Power Automateでファイルの存在を確認するためには、いくつかのアクションを組み合わせてフローを設計する必要があります。主に使用するアクションは以下の通りです。

  1. ファイルメタデータの取得(パス指定)
    指定されたパスにファイルが存在するかどうかを確認するアクションです。動的なパス指定が可能で、スクリプト内で動的に生成されたパスを使用する場合に特に有効です。
  2. 条件分岐
    ファイルの存在有無に応じて異なる処理を行うために使用します。ファイルが存在する場合はスキップや上書き、存在しない場合は新規作成のアクションを実行します。
  3. ファイルの作成
    必要に応じて新しいファイルを指定のフォルダに作成するアクションです。

動的コンテンツの取り扱い

動的コンテンツを使用する際の注意点として、文字列の組み合わせやパスの正確な指定が挙げられます。特に、@{triggerBody()?['field_13/Value']}@{item()?['DisplayName']}のような動的コンテンツを含むパス指定では、正確なパス生成が求められます。

Composeアクションの活用

動的コンテンツを組み合わせる際には、「Compose」アクションを使用してパスを一旦構成し、その出力を後続のアクションに渡す方法が有効です。これにより、パス生成のロジックを明確にし、デバッグや検証がしやすくなります。

concat('/Shared Documents/AAAAA/', triggerBody()?['field_13/Value'], '/', item()?['DisplayName'])

このような式をComposeアクションに設定し、その出力を「パスによるファイルメタデータの取得」アクションに渡すことで、動的パスの正確な指定が可能となります。

エラーハンドリングの重要性

フローを実装する際には、エラーハンドリングを適切に設定することが重要です。特に、ファイルの存在チェックにおいては、存在しない場合にエラーが発生することを考慮し、そのエラーをキャッチして適切な処理を行う必要があります。

Run Afterの設定

Power Automateでは、各アクションの実行結果に応じて次のアクションを設定することができます。例えば、「ファイルメタデータの取得」アクションが失敗した場合に「ファイルの作成」アクションを実行するように設定することで、フロー全体がエラーで停止することなく処理を継続できます。

"runAfter": {
  "ファイルメタデータの取得": [
    "Succeeded",
    "Failed"
  ]
}

このように設定することで、「ファイルメタデータの取得」アクションが成功した場合と失敗した場合の両方で次のアクションに進むことができ、柔軟なエラーハンドリングが可能となります。

「パスによるファイルメタデータの取得」の利点

「ファイルメタデータの取得」アクションでは動的なパス指定が難しく、「BadRequest」エラーが発生することが多々ありました。一方で、「パスによるファイルメタデータの取得」アクションを使用することで、動的コンテンツを含むパス指定においても正確にファイルの存在を確認することが可能となりました。このアクションは、動的コンテンツを含むパスを直接指定できるため、エンコードの問題を回避しやすく、より安定したフローの構築が可能です。

具体的なメリット

  1. 動的パスの正確な指定
    動的に生成されたパスを正確にSharePointに渡すことができるため、動的コンテンツを含むファイルパスでもエラーなく処理が可能です。
  2. エンコードの自動処理
    SharePointはパス内のスペースや特殊文字を自動でエンコードするため、手動でのエンコード処理が不要となります。これにより、エンコードミスによるエラーを防止できます。
  3. 柔軟なフロー設計
    動的コンテンツを含む場合でも、シンプルにパスを指定できるため、フローの設計が容易になります。

具体的なフローの構築

以下に、最終的に成功したフローの具体的な構成を示します。

1. ファイルの追加

フローのトリガーとして、リストAからリストBへのアイテムコピーを設定します。この際、添付ファイルもドキュメントライブラリに保存されます。

2. ファイルメタデータの取得(パス指定)

「パスによるファイルメタデータの取得」アクションを使用し、以下のように設定します。

/Shared Documents/AAAAA/@{triggerBody()?['field_13/Value']}/@{item()?['DisplayName']}

この設定により、動的に生成されたファイルパスを正確に指定することができます。

3. 条件分岐

ファイルが存在するかどうかを条件で判定します。

  • はい(ファイルが存在する場合)
  • 必要に応じて、ファイルの上書きを避けるための処理(ファイル名の変更やスキップ)を実行します。
  • 例として、メール通知を行い、ファイルが既に存在する旨を通知します。
  • いいえ(ファイルが存在しない場合)
  • 「ファイルの作成」アクションを実行し、新たにファイルを作成します。

4. ファイルの作成

必要なファイルを指定のフォルダに作成します。具体的な設定は以下の通りです。

  • サイトアドレス: 保存先のSharePointサイトのURL。
  • フォルダパス: /Shared Documents/AAAAA のように保存するフォルダのパスを指定します。
  • ファイル名: @{item()?['DisplayName']} と指定します。
  • ファイルコンテンツ: 必要に応じて、ファイルの内容を指定します。

成功までの鍵:正確なパス指定とエラーハンドリング

成功するためには、以下のポイントが鍵となります。

1. 正確なパス指定

「パスによるファイルメタデータの取得」アクションでは、動的コンテンツを含む正確なパス指定が求められます。Composeアクションを活用して、動的パスを正確に生成し、それをアクションに渡すことで、誤ったパス指定によるエラーを防ぎます。

2. 適切なエラーハンドリング

エラーが発生した場合でもフローが停止せず、適切な処理が行われるように、Run Afterの設定や条件分岐を適切に設定します。これにより、エラー時にもフロー全体が柔軟に対応できます。

3. テストとデバッグ

フローを実装したら、必ずテストを行い、期待通りに動作するかを確認します。特に動的コンテンツを含む場合は、パスが正しく生成されているか、エラーメッセージが出ないかを入念にチェックします。

今後の展望と改善点

今回の経験を通じて、Power AutomateとSharePointの連携における細かなポイントや、動的コンテンツの取り扱い方について深く理解することができました。今後も以下の点を改善・強化していく予定です。

フローの最適化

大量のファイルを扱う際のパフォーマンス向上のため、フィルタークエリやインデックスの設定をさらに最適化します。特に、大規模なドキュメントライブラリを効率的に管理するためのベストプラクティスを導入します。

エラーハンドリングの強化

予期しないエラーに対する対応を強化し、フローの信頼性を高めます。具体的には、エラー発生時に詳細なログを記録する仕組みを導入し、問題の迅速な特定と修正を可能にします。

ドキュメントの充実

フローの設計や実装手順を詳細にドキュメント化し、同様の課題に直面している他のユーザーに対するサポートを充実させます。また、SharePointの設定やPower Automateのベストプラクティスについても情報を整理し、共有します。

終わりに

SharePointのファイル存在チェックをPower Automateで実装する際、多くの試行錯誤を経て「パスによるファイルメタデータの取得」アクションを活用することで、動的なパス指定においても正確にファイルの存在を確認できることが分かりました。この方法により、フローの安定性と信頼性を大幅に向上させることができました。

Power AutomateとSharePointを利用している皆さんも、ファイルの存在チェックに悩まされることがあるかと思いますが、ぜひ今回の経験を参考にしていただき、フローの設計に役立ててください。今後もフローの改善や新たな課題に挑戦しながら、より効率的な自動化を目指していきたいと思います。

追加の詳細な解説

あんちゃん
あんちゃん

本当はもっともっといろいろあったんだ。追加でもっと気づいたことを書いてくよ!

ファイルの存在チェックに必要なアクション

Power Automateでファイルの存在を確認するためには、いくつかのアクションを組み合わせてフローを設計する必要があります。主に使用するアクションは以下の通りです。

1. ファイルメタデータの取得(パス指定)

「パスによるファイルメタデータの取得」アクションは、指定されたパスにファイルが存在するかどうかを確認するために使用します。このアクションは、動的なパス指定が可能であり、動的に生成されたパスを利用する場合に特に有効です。

設定方法
  1. アクションの追加
    フロー内で「アクションの追加」をクリックし、「パスによるファイルメタデータの取得」アクションを検索して選択します。
  2. アクションの設定
  • サイトアドレス: SharePointサイトのURLを選択または入力します。
  • パス: 動的コンテンツを使用してファイルのフルパスを指定します。例:
    plaintext /Shared Documents/AAAAA/@{triggerBody()?['field_13/Value']}/@{item()?['DisplayName']}
  • 注意点:
    • パス内のスペースや特殊文字は通常、エンコードの必要がありません。「パスによるファイルメタデータの取得」アクションは、SharePointが自動でエンコードを処理します。
    • 動的コンテンツを使用する際は、triggerBody()?['field_13/Value']item()?['DisplayName'] が期待通りの値を返しているかを事前に確認します。

2. 条件分岐

ファイルが存在するかどうかを条件で判定します。条件分岐を利用することで、ファイルが存在する場合と存在しない場合で異なる処理を行うことができます。

条件の設定方法
  1. 条件アクションの追加
    「パスによるファイルメタデータの取得」アクションの後に「条件」アクションを追加します。
  2. 条件式の設定
  • 左側: 「パスによるファイルメタデータの取得」アクションの出力から、ファイルの存在を示すプロパティ(例: IdName)を選択します。
  • 演算子: is not equal to
  • 右側: null
  • 具体例:
    plaintext @not(equals(body('パスによるファイルメタデータの取得')?['Id'], null))
  • 解釈: ファイルメタデータが存在する場合(ファイルが存在する場合)は「はい」、存在しない場合は「いいえ」と判定します。

3. ファイルの作成

ファイルが存在しない場合に新規ファイルを作成するために、「ファイルの作成」アクションを追加します。これにより、同名ファイルの重複を回避することができます。

設定方法
  1. ファイルの作成アクションの追加
    「いいえ」分岐に「ファイルの作成」アクションを追加します。
  2. アクションの設定
  • サイトアドレス: 保存先のSharePointサイトのURL。
  • フォルダパス: 保存するフォルダのパスを指定します(例: /Shared Documents/AAAAA)。
  • ファイル名: 作成するファイルの名前を指定します(例: @{item()?['DisplayName']})。
  • ファイルコンテンツ: 必要に応じて、ファイルの内容を指定します。

動的コンテンツの取り扱い

動的コンテンツを使用する際の注意点として、文字列の組み合わせやパスの正確な指定が挙げられます。特に、@{triggerBody()?['field_13/Value']}@{item()?['DisplayName']}のような動的コンテンツを含むパス指定では、正確なパス生成が求められます。

Composeアクションの活用

動的コンテンツを組み合わせる際には、「Compose」アクションを使用してパスを一旦構成し、その出力を後続のアクションに渡す方法が有効です。これにより、パス生成のロジックを明確にし、デバッグや検証がしやすくなります。

concat('/Shared Documents/AAAAA/', triggerBody()?['field_13/Value'], '/', item()?['DisplayName'])

このような式をComposeアクションに設定し、その出力を「パスによるファイルメタデータの取得」アクションに渡すことで、動的パスの正確な指定が可能となります。

エンコードの自動処理

「パスによるファイルメタデータの取得」アクションは、SharePointが自動でパス内のスペースや特殊文字をエンコードするため、手動でのエンコード処理が不要となります。これにより、エンコードミスによるエラーを防止できます。

エラーハンドリングの重要性

フローを実装する際には、エラーハンドリングを適切に設定することが重要です。特に、ファイルの存在チェックにおいては、存在しない場合にエラーが発生することを考慮し、そのエラーをキャッチして適切な処理を行う必要があります。

Run Afterの設定

Power Automateでは、各アクションの実行結果に応じて次のアクションを設定することができます。例えば、「ファイルメタデータの取得」アクションが失敗した場合に「ファイルの作成」アクションを実行するように設定することで、フロー全体がエラーで停止することなく処理を継続できます。

"runAfter": {
  "ファイルメタデータの取得": [
    "Succeeded",
    "Failed"
  ]
}

このように設定することで、「ファイルメタデータの取得」アクションが成功した場合と失敗した場合の両方で次のアクションに進むことができ、柔軟なエラーハンドリングが可能となります。

テストとデバッグの重要性

フローを実装したら、必ずテストを行い、期待通りに動作するかを確認します。特に動的コンテンツを含む場合は、パスが正しく生成されているか、エラーメッセージが出ないかを入念にチェックします。これにより、実際の運用環境での予期せぬエラーを防ぐことができます。

成功までの鍵:正確なパス指定とエラーハンドリング

成功するためには、以下のポイントが鍵となります。

1. 正確なパス指定

「パスによるファイルメタデータの取得」アクションでは、動的コンテンツを含む正確なパス指定が求められます。Composeアクションを活用して、動的パスを正確に生成し、それをアクションに渡すことで、誤ったパス指定によるエラーを防ぎます。

2. 適切なエラーハンドリング

エラーが発生した場合でもフローが停止せず、適切な処理が行われるように、Run Afterの設定や条件分岐を適切に設定します。これにより、エラー時にもフロー全体が柔軟に対応できます。

3. テストとデバッグ

フローを実装したら、必ずテストを行い、期待通りに動作するかを確認します。特に動的コンテンツを含む場合は、パスが正しく生成されているか、エラーメッセージが出ないかを入念にチェックします。

今後の展望と改善点

今回の経験を通じて、Power AutomateとSharePointの連携における細かなポイントや、動的コンテンツの取り扱い方について深く理解することができました。今後も以下の点を改善・強化していく予定です。

フローの最適化

大量のファイルを扱う際のパフォーマンス向上のため、フィルタークエリやインデックスの設定をさらに最適化します。特に、大規模なドキュメントライブラリを効率的に管理するためのベストプラクティスを導入します。

エラーハンドリングの強化

予期しないエラーに対する対応を強化し、フローの信頼性を高めます。具体的には、エラー発生時に詳細なログを記録する仕組みを導入し、問題の迅速な特定と修正を可能にします。

ドキュメントの充実

フローの設計や実装手順を詳細にドキュメント化し、同様の課題に直面している他のユーザーに対するサポートを充実させます。また、SharePointの設定やPower Automateのベストプラクティスについても情報を整理し、共有します。

まとめ

SharePointのファイル存在チェックをPower Automateで実装する際、多くの試行錯誤を経て「パスによるファイルメタデータの取得」アクションを活用することで、動的なパス指定においても正確にファイルの存在を確認できることが分かりました。この方法により、フローの安定性と信頼性を大幅に向上させることができました。

Power AutomateとSharePointを利用している皆さんも、ファイルの存在チェックに悩まされることがあるかと思いますが、ぜひ今回の経験を参考にしていただき、フローの設計に役立ててください。今後もフローの改善や新たな課題に挑戦しながら、より効率的な自動化を目指していきたいと思います。

あんちゃん
あんちゃん

以上SharePointカスタマイズの挑戦記録でした。皆さんの参考になれば幸いです!これからも、色々なツールや技術に挑戦しながら、学びを深めていきたいと思います!

参考資料:

コメント

タイトルとURLをコピーしました