背景
複雑にPowerAutomateのデスクトップフローとクラウドフローを連携しなければいけない事例が発生した。
大まかに言うとデスクトップフローとクラウドフローで同じファイルを見に行こうとして場合にロックがかかってしまう事への回避策について記す。
状況としてはかなり特殊であり、おそらく同様のことで悩む人はいないと思うが、自分用のメモとしての意味合いを込めてこの記事を残しておく。
要件
- SharePointOnline(以下SPOとする)上にあるエクセルファイルをPowerAutomateDesktop(以下PADとする)を使い、ローカル上のSQLiteのテーブルに内容をインポートする。
- インポートが完了したファイルはSPO上の元のフォルダから別のフォルダに移す。
- なお、PADのプレミアムライセンスは使えないため、PADのSPO用のコネクタは使えない。
PADのプレミアムライセンスが使えないというのが今回の問題のキモとなっている。このコネクタさえ使えればそもそもロック問題は発生しなかったはず。
実装方針
- エクセルファイルを入れるフォルダ(以下テンプフォルダとする)ローカルフォルダとSPOフォルダはリンクフォルダを使って同期を取る。
- テンプフォルダからエクセルファイルを読み込んでSQLiteへインポートするのはPADフローを使う。
- PADフローでインポートが完了した時にインポート完了用のファイルを作成し、インポート完了用フォルダに入れる。これもSPOとのリンクフォルダにする。
- SPO側のインポート完了用フォルダにインポート完了用のファイルが作成された事をトリガーにして、クラウドのファイル移動フローを起動しファイルを格納先フォルダに移動する。
問題発生
インポートフローは問題なかったのだが、その後のクラウドでファイルを移動する時にファイルにロックがかかっているというエラーが発生した。
実際に対象のファイルを手動で移動や削除をしようとしても操作ができなかった。
時間が経てば(10分ほど)ファイルの操作は可能になるが、ただでさえフロー自体は遅い上にどれだけ待てばいいか不確かなため待機処理を入れて解決する方法は避けたかった。
解決方法
後述でいくつか試してもうまくいかなかったアプローチ方法も記載する。
うまくいった方法としてはシンプルにローカルのテンプフォルダから別のローカルの作業フォルダの方にコピーしてそこからインポートを行うという方法だ。
インポートフローの中で作業フォルダの作成とファイルコピーを行う処理を追加している。
うまくいかなかったアプローチ
ファイルの移動
そもそもこれでうまくいかなかったのが事の発端だ。
この方法だと対象のファイルに対しロックがかかっているということで、エラーが発生した。
HTTPリクエストの送信
http://www.cleverworkarounds.com/2021/02/21/how-to-clear-annoying-excel-file-locks-in-power-automate/
上記の記事を参考にし、HeaderにPrefer:bypass-shared-lockを追加して移動リクエストを送信する。
この方法を使えばロック状態を無視してファイル移動ができるはずだったが、、、結局ロックは解除できず。ロックがかかっていない状態ならファイル移動自体はできた。
チェックイン・チェックアウト
https://powerusers.microsoft.com/t5/Building-Flows/Unable-to-Delete-file-File-is-locked-for-shared-use-by-me/td-p/762698
上記の記事を参考にし、チェックイン・チェックアウト処理を試みた。
チェックアウトを行おうとした時点でロックエラーが発生してしまった。