2021年6月16日 (水)

[回避策] Office Scripts スクリプトを実行することでファイルがロックされる

  昨年末に次の記事を公開しました。

[Office Scripts] Excel 内のデータを使って SharePoint ライブラリのプロパティを自動設定しよう (weblogs.jp)

この記事で使っていたのは GA 前の Office Scripts でパブリック プレビューでした。しかし、2021年5月27日に General Availability (GA) に達したことが発表されました。

Office Scripts is now generally available in Excel for the web - Microsoft Tech Community

さて、この記事で説明したフローですが、久しぶりにファイルをアップロードして動作させてみると SharePoint コネクターを使ったファイルのプロパティ更新のアクションが実行できない。で、原因を探るためエラーを確認するとファイルがロックされてしまっているようです。

2021-06-16_13-03-28

エラーのメッセージの要点は「ファイル <ファイルパス> は、<フローの所有者> が排他的に使用するためにロックしています。」というところです。Office Scripts 実行時にファイルの内容を読み取っているので、File Open の状態となっているのでしょう。比較のために単純に、SharePoint コネクターだけを使って「ファイルが作成されたとき(プロパティのみ)」のトリガーを使い、次のステップで「ファイルのプロパティの更新」を実行してみますが、特にファイルがロックされることはありません。

さて、これをどう対処しよう。が、結局のところファイルが排他ロックされるとSharePoint 上でファイルが解放されるまで待つしかありません。ですが、どのタイミングで解放されるのかはよくわからない。そこで、Power Automate を使って SharePoint 上のファイルのプロパティを更新するときに何らかの理由でファイルロックに遭遇した人はいるだろうと、なにかよさそうなアプローチがないかネット上で探してみます。予想通り、複数の記事を見つけましたが、結局、みな共通しているのはファイルのロック状態が解除されるまで Do Until で繰り返しトライするしかなさそうです。

まず結果から言うと、5分ほど待機すればロックが解除されるようです(現時点)。

ですが、念のため30秒ごとにロック解除を繰り返し確認するようにロジックを変更してみましょう。まず、ロック状態を判定するために IsFileLockedという名前でブール値の変数を用意します。既定値は true。

2021-06-16_13-36-30

Office Script 実行後すぐにファイルのプロパティを変更していましたが、直後にDo until を追加しこの中に「ファイルのプロパティ更新」アクションを 移動させます。Do until の条件は 「IsFileLocked の値が false に等しい」です。

2021-06-16_13-37-59

次に変数の設定アクションを追加し、IsFileLocked にファイルが引き続きロックされていれば true、そうでなければ false を格納するように式を書きます。

2021-06-16_13-48-18

if
(
  and
  (
    equals(outputs('ファイルのプロパティの更新')?['body']?['status'],400), 
    contains(outputs('ファイルのプロパティの更新')?['body']?['message'], 'ロックされています')
  )
  ,true
  ,false
)
 
ただし、このままでは前のステップが失敗すると次に進まないため、実行条件の構成を行い、成功だけでなく失敗時にもこのステップに進むように変更します。
2021-06-16_13-50-39
あとは、IsFileLocked の値を条件判定して、true なら 30秒待機するように構成します。
2021-06-16_13-51-41
 
以上でファイルアップロード後に5分程度待てば、Excel の内容を読み取り SharePoint ドキュメントライブラリ上の列を自動的に更新してくれるようになるはずです。
 
2021-06-16_14-05-54

なお参考にしたサイトは下記の通りです。

 

コメント