SharePoint Online のライブラリに格納されたファイルを Power Automate for desktop で自動的に印刷するフローの作成

#はじめに
SharePoint Online のドキュメント ライブラリに格納されたファイルを自動的に Power Automate for desktop (PAD) で、印刷するフローについて説明します。印刷後には、印刷結果をライブラリに反映し、印刷の管理までを行えるようにしてみたいと思います。

この記事は、Office 365 Advent Calendar 2021 11日目の記事です。

https://adventar.org/calendars/6679



#記事を書いた経緯
2021/11/27 に開催した Power Automate Desktop 勉強会のオンラインイベントで、Power Apps と Power Automate の連携についてのセッションを行ったところ、上記の流れでファイルを印刷して、印刷の管理をしたら面白そうという感想があり、実現可能か検証してみました。

https://www.youtube.com/watch?v=UF_B-BlR1YQ


#前提事項

利用するサービスは以下の通りです。
・SharePoint Online (サイトのドキュメント  ライブラリ)
・Power Automate (クラウド フロー)
・Power Automate for desktop

使用したライセンスは以下の通りです。
・Microsoft 365 Business Basic 
・Power Automate アテンド型 RPA のユーザーごとのプラン
(Power Automate と Power Automate for desktop の連携には、アテンド型 RPA のユーザーごとのプラン のライセンスが必要となります。)

#制限事項
ファイルの印刷には、PAD の [ドキュメントの印刷] アクションを使用して、印刷を行います。
[ドキュメントの印刷] アクションは、Windows 標準の印刷機能を使用しているため、本機能が利用できないファイルでは、使用できませんが、少なくとも Word 、 PDF では印刷できることを確認しています。

<参考情報>

https://support.asahi-robo.jp/archives/1971

#事前準備
PAD から SharePoint ドキュメント ライブラリにアクセスするための方法として、OneDrive 同期クライアント上からライブラリにアクセスし、ファイルを操作することが可能です。

OneDrive 同期クライアントによるライブラリとの接続については、下記の記事をご確認ください。

https://qiita.com/maekawawawa/items/fd1958f196f72b582e42

OneDrive 同期クライアントは利用できず、Edge からのエクスプローラー ビューが利用可能な場合は、@nanoka さんの下記の記事をご確認ください。

https://qiita.com/nanoka/items/2135967a50bc827fcda2


#フローの全体イメージ
こんな流れのフローを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/0b84e24d-7a87-c3e0-d173-ae79ec4e5286.png)

###実際のフローの全体像

####クラウド フロー側 (実行のトリガーと PAD のフローを呼び出す担当)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/b7199ea7-efdb-8b0b-9d08-ef88fd7c7f42.png)

####Power Automate for desktop 側 (ファイルを印刷する担当)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/9fab910e-fa94-b501-5f52-f5d8668716b2.png)

#フローの作成
SharePoint、Power Automate for desktop、Power Automate の順に必要となる設定を記載します。


**1. SharePointの設定**
1) ドキュメント  ライブラリに印刷結果を管理する列を追加する

印刷対象のファイルを保存するドキュメント ライブラリに印刷結果を管理する列を追加します。
対象のライブラリを表示し、リスト ビューのヘッダーから [列の追加] をクリックし、[はい/いいえ] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/0809fb23-3814-719c-56c0-a5988c5aa290.png)


[列の作成] ウィンドウで、名前と既定値を以下の通り設定し、[保存] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/b8fb5381-b330-3a30-2bc8-7e3271f590ea.png)

リスト ビュー上に追加した列が表示されていれば追加は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/2ccb153b-b1da-e581-2f5a-026a24e6dbd0.png)



**2. Power Automate for desktopの設定**
先に Power Automate の設定の前に、PAD 側のフローを作成します。

1) 入出力引数の設定
クラウド フロー↔PAD で、値を受け渡しする入出力変数を設定します。
入出力変数は、フロー デザイナー右上の入出力変数欄の + をクリックして、追加することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/ea1aa7cb-8aa1-c576-3aca-0fa2dbc6646f.png)

今回は、以下の 2 つの変数を追加します。
InFileName が入力変数 (クラウド フローから値を貰う)、OutResult が出力変数(クラウド フローへ値を渡す)です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/589d32b5-eb39-b056-c34c-58324f4fb592.png)

2) ライブラリ上のファイルを取得する設定

PAD からドキュメント ライブラリ上のファイルを取得するためには、**事前準備** の項目の OneDrive 同期クライアントの設定 (またはエクスプローラー ビュー) の設定が行われている必要があります。

ここでは、同期クライアントの利用を前提に手順を記載します。
対象のライブラリにアクセスし、[同期] をクリックして、PC 上に同期フォルダーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/582bde1e-cdd5-772f-d162-07af4465ce7d.png)

ここからは、PAD のアクションを組み合わせていきます。
フロー デザイナーで、[変数の設定] アクションを追加し、以下の設定を実施します。
入出力変数で渡ってきたファイル名と同期フォルダーのパスを連結して、ファイルへのフルパスを作成します。

| 項目 | 値 | 
|:-----------|:------------|
| 設定       | FileName        |
| 宛先      | <同期フォルダーのパス>\%InFileName%        |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/12726510-943c-58b2-a133-06c6dfb67288.png)


3) ファイルの印刷を行う設定
ファイルの印刷は [ファイルの印刷] アクションにファイルを指定し、印刷を行います。
今回は、同期クライアントからファイルが確認できない可能性があるので、印刷前にファイルが存在するかどうかのチェックとして [ファイルが存在する場合] のアクションを入れます。

| 項目 | 値 | 
|:-----------|:------------|
| ファイルが次の場合:       | 存在する        |
| ファイル パス      | %FileName%        |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/afe1bb98-0e35-41b4-c57e-f8ad08273988.png)

ファイルが存在する場合の処理 (正常系) として、[ドキュメントの印刷] アクションを設定します。

| 項目 | 値 | 
|:-----------|:------------|
| 印刷するドキュメント:       | %FileName%             |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/bf597390-6707-5771-ef33-1a034a9867c6.png)

 
4) 処理結果を設定する
上記の 3) までの処理で、印刷を行う設定は完了していますが、今回は印刷が正常に終了しているかどうかを判断する処理を入れたいと思います。実現したい判断と設定としては、以下の通りとなります。

**・正常に印刷が完了している場合**
→ OutResult 出力変数に "成功" を設定し、処理を終了する 

**・印刷が完了しなかった場合 (印刷エラー以外にファイルが見つからなかった場合を含む)**
→ OutResult 出力変数に "失敗" を設定し、処理を終了する

上記の設定については、アクション単位で説明が難しいので、フロー デザイナーで全体像の説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/9d213bc9-0557-f1fd-7431-f77eb89689f1.png)

印刷が完了しなかった場合の処理は、印刷がエラーになった場合を考慮したいと思います。
印刷がエラーとなったかどうかの判断は、3) で設定した [ドキュメントの印刷] アクションの [エラー発生時] の設定で、何かしらのエラーが発生したら、ErrorLable に移動する設定とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/66ecdc97-3685-1b57-a8b1-3afea47b83a0.png)


本設定によりエラーが発生した場合は、ラベルに移動して、印刷が失敗したことを表す結果を設定します。
こんな処理の流れですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/5bc8a00d-14df-916f-13e7-b639eb635f0c.png)

以上で、正常処理の場合と異常処理の場合を考慮した PAD 側の処理が設定できました。
次は、クラウド フローの処理を設定します。

**3. Power Automateの設定**
最後に、PAD のフローと連携するクラウド フロー側の処理を設定します。

1) ファイルの格納を検知するためのトリガーの設定
ライブラリにファイルが保存されたことを検知して、処理をトリガーするためのアクションを設定します。
[SharePoint] コネクタの [ファイルが作成されたとき (プロパティのみ)] のトリガーを設定します。 

以下のように対象のサイトとライブラリを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/9b4a5972-c396-b9ee-4baf-89342b3262e6.png)


2) PAD のフローの呼び出し
ライブラリにファイルが格納されたら、そのファイルを印刷するために PAD のフローを呼び出します。
PAD のフローは、[Desktop flows] コネクタの [デスクトップ用 Power Automate で構築したフローを実行する] アクションで、呼び出して実行することができます。

[Desktop フロー] の項目に上の手順で作成した PAD のフローを指定すると、PAD 側で設定した入力変数の項目が動的に表示されます。
ここに、トリガーのアクションで取得されている [動的なコンテンツ] から "拡張子付きのファイル名" を設定します。これで、PAD 側にファイル名が渡すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/c522c8c0-1095-707f-c415-2b4895e3d802.png)


3) PAD のフローの処理結果に応じて、ライブラリに結果を反映する
最後の処理です。デスクトップ フローの実行結果をドキュメント ライブラリに反映します。

印刷が成功している場合に、ドキュメント ライブラリの [印刷フラグ] 列を "はい" (True) に更新します。
印刷が成功しているかどうかの判断は、[条件] アクションを使用して、PAD 側で出力変数として設定した OutResult の内容から判断します。
OutResult には、成功 or 失敗の文字列が入ってくるので、成功 の場合に、印刷フラグを更新する処理に入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/640fe0ce-c979-061c-61b4-e84f325f87f8.png)


ライブラリ上の印刷フラグの更新には、[SharePoint] コネクタの [ファイルのプロパティの更新] アクションで、対象のサイトとライブラリを指定します。更新するアイテムの ID には、[動的なコンテンツ] から、[ファイルが作成されたとき (プロパティのみ)] アクションで取得していた対象のアイテムの ID を指定します。
印刷フラグ列は、[はい/いいえ] 列なので、"はい" に更新するには、True を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/6c71440e-566f-dfcd-1f85-9ea97bc2d28a.png)


以上で、フローの説明を終わります。

#補足の案内
今回は、ファイルが保存されたタイミングで都度トリガーされるフローにしていますが、1日に1回や数時間に1回などスケジュールでトリガーすることも簡単に設定できます。

また、ファイル名に応じて印刷をするしないといった条件分岐もクラウド フロー側や PAD 側で設定することができるので、汎用的にフローを組むこともできると思います。

Teams やメール宛てに処理結果を通知しても面白いかもしれません。

#おわりに
3 つのツールを連携したフローとなりますが、それぞれの設定はシンプルな構成になりました。
どれか 1 つで実現しようとすると大変だったり、そもそもできないことがありますが、各サービスの連携を行うことで、容易に実現できることも多いのではないかと思います。