はじめに
Power Automateって便利そうだけど、とっつきづらいですよね。。
ノーコードで組めますが、どんなブロックがあるか分かりづらい。
ブロックの中で指定できるパラメーターが"個性的"で、テキトーに入れるとだいたいエラーになる。
使いたいと思ったブロックは会社的に利用が禁止されている。
やっとできたと思ったら、期待したような動きをしてくれない。
そのため、過去に何度かトライしてみたことはあるのですが、必ず毎回挫折して、マイフローにゴミが溜まっていく一方でした。。
Sharepointリスト860件の添付ファイルを全部取り出したい!
当社、ソリューション資料というCAEソフトウェアの機能や解析事例、使い方を説明するためのパワポやPDFがたくさんあるんです、その数860件以上!すごいですよね。
一般公開できるものは以下からダウンロードできますので、ぜひご覧ください。
この大量の資料、社内ではSharepointリスト1行ずつにファイル添付することでデータベース化しています。
その添付ファイル資料を今回、"ぜんぶ"取り出すというタスクが発生になりました。さぁ大変。
知ってました?Sharepointのリストの添付ファイルとして登録されたファイルは、Sharepointのどこかのディレクトリに格納されているわけではないんです。
つまり、Sharepointディレクトリを開いて、全ファイル選択、全ファイルコピーが使えない。
1つ1つ丁寧に、添付ファイルを手作業でダウンロードしていくしかないのか、、と。
1件1分で出来る作業だとしても1時間に60件しか出来ない。860件だと…14時間以上!?
そんな手間暇かけてられません。
Power Automateを使おう
こういうときは、やはりPower Automateにやってもらいたい。
今回、何度目かのPower Automateトライで、やっとうまく機能するものができたので、ご紹介します。
フロー全体

今回は定期実行する必要ないので、[フローを手動でトリガーする]を選択しました。
変数設定

まず、設定変数(以降で使うパラメーターの配列)とループ変数を設定([変数を初期化する]で)します。

このように配列タイプで複数のパラメーターを設定すると、あとで便利です。設定を変えるときに各ブロックを探し回らなくて良い。
860件全部一気に取り出す処理にするとミスった時に大変なので、今回は一旦100件分を取り出します。

ループ変数はiとして、初期値として設定変数の1番目(Power Automateの配列は0番から始まる)を指定([式を挿入します]で)します。
ループ処理

[Do until]ループで、Sharepointリスト1件ずつ処理します。
[添付ファイルの取得]をして、[Tryスコープ]内で指定したSharepointディレクトリに保存、[Finallyスコープ]内で変数iを1増やす。

[Do until]ループの設定はこのとおり。
変数iが設定変数の2番目(Power Automateの配列は0番から始まる)より大きくなるまで繰り返す。
ここで1つポイント!Power Automateでは無限ループを避けるため、[Do until]の設定に[件数] (繰り返し回数上限)と[タイムアウト]の時間が設定されています。
今回は100回ループを回すため、[件数]に100を設定しました。
添付ファイルの取得
今回、1番やりたかった処理。おあつらえ向きにそのままの処理ブロックがありました。

サイトのアドレスとリスト名、IDを指定します。
Tryスコープ

今回、[スコープ]を使って、添付ファイルのコンテンツ取得と、指定Sharepointディレクトリへのコピー作成を実施します。
なぜ[スコープ]を使うか。添付ファイル取得がエラーのときに処理が止まらないようにです。
今回のSharepointリスト、全部のIDに添付ファイルが無いんです。。IDが連番になっておらず、途中では抜けになっているところも。。
このようなとき[添付ファイルの取得]がエラーとなるのですが、この[Tryスコープ]があれば、エラーによる途中停止を回避できるんです。

[スコープ]の[パラメーター]には何も指定できないのですが、[設定>この後に実行する]で[添付ファイルの取得]の[成功しました]だけを選びます。これで[添付ファイルの取得]が成功したときのみ[Tryスコープ]が実行される!
ファイルコンテンツの取得とファイルの作成
[Tryスコープ]の中は、[ファイルコンテンツの取得]と[ファイルの作成]を[それぞれに適用する]。それぞれに適用するのは、Sharepointリスト1件に対して添付ファイルが複数ある場合のためです。今回は資料ファイルだけでなく、概要図がリストについていたのですが、それも取得できていました。



[フォルダーのパス]はこんな書き方ができました。
[ファイル名]に関して。添付ファイルのオリジナルのファイル名のままでも良かったのですが、それではSharepointリストのIDとの紐づけが後からできない。。
オリジナルのファイル名の頭にIDに対応する連番をつけることにしました。

式はこのとおり。
SharepointリストIDに対応する変数i、そのままファイル名に付加すると、後からソートするときに「1_XXX」の次に「2_XXX」が並ばずに「10_XXX」が来てしまうので、、
IDが一桁のときは00、二桁のときは0を付け加えることにしました。
その後にアンダーバー、オリジナルのファイル名。それらをconcatでつなげた文字列とする。
変数iやオリジナルのファイル名に対応する記述に関しては、下側の[動的コンテンツ]のリストから選択可能。
「IDが一桁のときは00、二桁のときは0を付け加える」処理も、頑張れば一から書けますが、ちょうど良いところに[Copilotで指揮を作成する]ボタン。ざっくりとしたプロンプトで、この「if(less(・・・」の処理を書いてくれました。
Finallyスコープ

最後、Finallyスコープ。中でやってることは変数iを1増やすだけ。

ポイントは[Finallyスコープ]の中。

[設定]で[Tryスコープ]が成功しても失敗しても、タイムアウトやスキップしても[Finallyスコープ]が実行されるようにしています。
これで添付ファイルが無くても、IDが歯抜けでも、ループが最後まで止まらずに実行できる!
おわりに
このような処理をPower Automateで組んで実行することで、大量にあったSharepointリスト内のソリューション資料を全部自動で取り出すことに成功しました。
そりゃあ処理完了まで多少は待ちますが、その間に他の事ができます。
14時間手作業で頑張ることなく、無事やりたいことができました。
※本記事は筆者個人の見解であり、所属組織の公式見解を示すものではありません。
問い合わせ
本文と全く関係ありませんが、、光学シミュレーションソフトの導入や技術相談、設計解析委託をお考えの方はサイバネットにお問合せください。