Power Automate Desktopがなんとなく使える講座 #8 特別なフォルダーを取得とリストの並び替え

　前回作成したフローのトピックを説明していきます。

## 特別なフォルダーを取得
　ファイルの置き場所は、使用する人によって変わります。通常、デスクトップは **C:\Users\xxxxxx** のようになっており、xxxxxxの部分はログインユーザー名が使用されます。ログイン名が変われば、当然その部分は変わりますし、人によっては、デスクトップを別のドライブ、ディレクトリに変更している人もいます。
　Power Automate Desktopは、「特別なフォルダーを取得」で、デスクトップやドキュメントなどの特別フォルダー(Special Folder)の場所を取り出し、フォルダーのパスが変数に入ります。（英語では Special Folderと言います。日本語では特別フォルダーや特殊フォルダーと記述されますが、どちらも同じものを指します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/bffd471d-60f2-a350-7d61-7a8bf8f025da.png)
　特別なフォルダーの名称を開くと、いくつもの名前が並びますが、よく使うのはドキュメント、デスクトップです。規定では、フォルダーのパスを示す **%SpecialFolderPath%** という変数が生成されます。画面上にはフォルダーのパスが表示されていますが、違う環境になれば、この表示は自動で変更されます。
　このフォルダーを使ってフォルダーやファイルの操作を行います。下の例では、デスクトップのパス %SpecialFolderPath% に続けて、エクセルファイル **\personal_information1000.xlsx** を開く処理を行っています。スペシャルフォルダーの後ろには、表記では 「\」 になっていますが、日本語キーボードの「￥」をつけてファイル名やフォルダー名をつなげてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/e80bf716-64bc-8a61-4c75-81cd132250bd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/c91d8d67-6ee6-ed5a-907b-d0a0754542c9.png)
　最後、エクセルを保存する場合も、**%SpecialFolderPath%** を使って保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/51c21739-5c55-01b8-c61b-49922ff580cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/11828c91-0f4c-452a-85a9-d1ff38aaf2fc.png)

### OneDriveのフォルダーを取得
　その他、OneDriveのフォルダーの場所は、環境変数を使って取得することができます。OneDriveは「**OneDriveConsumer**」、OneDrive for Businessは「**OneDriveCommercial**」という環境変数にパスが設定されていますので、以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/42c0f3a2-3fdb-b5dd-d966-738dbab9df34.png)

　もし、OneDriveがインストールされていない環境が混在する場合は、先の「特別なフォルダーを取得」を先に実行させ、同じ変数 **%SpecialFolderPath%** にOneDriveのパスを入れるようにしてやります。OneDriveの環境変数がない場合はエラーになるので、エラー発生時は次のアクションに移動するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/ef4b23ad-5412-b2a0-64f0-16fa5be837cf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/cd30ae4f-b31c-e979-186f-c5d11cb7ca54.png)
　これで、OneDriveがある環境なら、OneDriveのパス、なければ特別なフォルダーのパスを取得するように設定できます。
　OneDriveにファイルを作成して、Power Automateを走らすという使い方もできますね。
　GoogleドライブやDropboxについては、やり方がわかりませんでした。ご存じの方、教えてください。

## リストで並び替えする
　変数アクションの中に、リストの処理についてのものがあります。

|アクション|内容|
|---|---|
|リストの作成|空のリストを作成します。変数を作成するかしないか選べますが、作成しない場合の利用方法は不明です|
|項目をリストに追加|作成済みのリストに項目を追加します|
|リストのクリア|リストの内容を削除し、空の状態にします|
|リストから重複する項目を削除|項目で重複する項目を削除し、ユニークな値のリストにします|
|リストの統合|2つのリストを1つに統合します。|
|リストから項目を削除|リストの中から特定の値を削除します。削除したい値がリストに含まれていない場合はエラーになります。|
|共通リスト項目の検索|2つのリストに共通する値のリストを作成します。並び順は最初のリストの順になります。|
|リストの内容を減らす|1番目のリストの中から2番目のリストの項目を削除します。1番目のリストに同じ削除対象の項目が複数あっても削除されます。|
|一覧の並べ替え|リストの値を昇順に並べ替えます。|
|リストを逆にする|リストの値を降順に並び替えます。|
|リストのシャッフル|リストをランダムに並び替えます。|
|データテーブル列をリストに取得|データテーブルの列を取り出し、リストを作成します。|

　各アクションを頭に入れて、使い方を工夫すると、様々なことができます。
　簡単なのは、数字をつけて「一覧の並び替え」を使えば、小さい順に並び替えが行えます。今回の並び替えでは、項目が日本語で、最初の出身地リストが出現順に項目が入っているので、工夫が必要になります。
　出身地リストと別に、既に整列済みの都道府県リストを作成します。そのリストと出身地リストで「共通リスト項目の検索」を行うと、都道府県リストの並び順のままで、出身地リストにない項目は削除されたリストができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/fba76c30-4092-cc1b-7b2c-58e19d96a9ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/8026068e-862a-1931-d669-59291ad41c95.png)

### リストを「変数の設定」で作成する方法
　リストの作成、項目の追加で作成する代わりに、「変数の設定」で一括でリストを作成することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/5852a30f-d0ee-821c-ddba-4986512473b3.png)
%[ と ]% の間に、項目をカンマで区切ります。ちょっと癖のある書き方ですが、覚えておくと便利です。

```
%[1, 2, 3, 4, 5]%
```
文字の場合は、 ' (シングルクオーテーション）で囲みます。

```
%['a', 'b', 'c', 'd', 'e']%
```
　これだけの操作で色々な処理が可能ですが、リストを使用した操作について、**Zero Sysさんの「[Power Automate Desktop の変数（5）「リスト型」](https://qiita.com/sys_zero/items/82951049466791b2b728)」**に更に細かく書かれています。

### リスト項目の検索を使って並べ替える
　変数の設定で **値 IN リスト** を使うと、値がリストの中に存在するか調べることができます。これを使って2つ目の並び替え方法を作ってみます。
　今回は、TodoufukenList をループ処理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/ddd1c0a1-19fd-dd6a-c0a0-c63a5d210801.png)
　TodoufukenListに存在する場合のみ、処理を行うようにするため、INを使って評価をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/1e392199-9696-c86b-c39a-7bce093bff04.png)
　ループは必ず TodoukenList の項目数行われますが、1000件よりは少ない回数で済みます。

### カスタムオブジェクトのリストで並び替える
 Power Automate Desktopでは、JSON形式の値を変数に設定することができます。これをカスタムオブジェクトと言います。変数の設定では、**%{'Name':Value}%** のように設定します。JSONは、文字を「"」（ダブルクォーテーション）で囲みますが、Power Automate Desktopは「'」（シングルクオーテーション）なので、ご注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/328a56c7-146a-78f3-2f0d-40bc799e8cbc.png)

```
%{ 'Name': 'Tokyo', 'Value': '03' }%
```
　設定した値は、**%CustomObject.Name%** あるいは **%CustomObject['Name']%** のようにして取り出すことができます。%CustomObject.Name の書き方は、エラーになって入力できないことがありますので、その場合は %CustomObject['Name']% を使ってみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/92ff0d18-df09-c13d-bd9e-948aee6a3128.png)

```
%CustomObject.Name%
%CustomObject.Value%
```
```
%CustomObject['Name']%
%CustomObject['Value']%
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/ed0d0f98-e182-8ef4-c01b-92695b400b33.png)

　カスタムオブジェクトをリストにして操作すると、少し凝ったことができます。例えば、都道府県リストを以下のような地域分けの項目を追加し、地域分けに対応したシートに振り分けることも出来ます。以下概略のみ説明しますので、興味のある方はチャレンジしてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/c6a4482d-5551-3ead-eb41-a565e9c6cc25.png)
　カスタムオブジェクトのリストは、Excelから読み取ったデータテーブルをループさせて作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/ff4d7b5f-3aa3-2f6e-0d44-4192dc58bb37.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/403b5175-b968-3f22-b1f5-4b0722588df7.png)

```
%{ 'No': CurrentItem2[0], 'Todoufuken': CurrentItem2[1], 'Block': CurrentItem2[2] }%
```
　カスタムオブジェクトのリストをループに使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/d102f224-4a3c-2a5f-bdd5-08671a3e6987.png)
　アクティブなＥxcelワークシートの設定で、まだシートが作られていない場合はエラーになりますので、サブフローでシートの作成処理を行い、次の処理に続けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/13e9e12f-0a75-2e1e-3da6-31c1a4b4b0a2.png)
　ページ設定などのシートの設定は、Blockのリストを作成して、まとめてやります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/76e52929-d6f2-265c-3130-3191d7b6ba25.png)
　最終的に、このようなシートを作ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/0ede3430-d6bd-c413-2934-6f206cebbabb.png)

　こんな面倒なことしなくても、データテーブルでいいじゃないかという意見もあると思います。今回は、この機能を使っていませんが、カスタムオブジェクト・リストには、カスタムオブジェクトの項目を使った並び替えができるからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/652dca13-37d8-6516-727b-937957b57ddc.png)
　「**一覧の並べ替え**」を開くと、「**リスト項目のプロパティで並べ替え**」というスイッチがあります。これを開いて並べ替えの基準にする最初のプロパティで、カスタムオブジェクトの項目を入力し、昇順、降順を選択して並び替えることができます。更に、並び替えの項目は、複数を使うことができるので、並び替え機能としては、高機能です。ただし、数値として並び替えをしてくれるのではなく、文字列扱いのため以下のようになってしまうので、一筋縄でいかないのですが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/55a531e9-7c51-6b81-3cc6-5fba0b102959.png)

## Excelでセルを指定するときの列の表記法
　Power Automate DesktopでExcelを操作で、セルの列の指定方法は、A1形式のアルファベットで示す方法と、R1C1形式の数字で示す方法の両方が使えます。以下のように列を **A** としてもいいし、 **1** と入れることもできます。通常はアルファベットの方が使いやすいですが、ループや計算式の結果で示したいときは、数値にすると便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/67d4b4a2-c04c-1249-b5f3-b5bd30599f62.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/3a455adf-66e2-f0e4-319a-5ff132f15efd.png)
　混在させても、動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/c4e6c3c5-7e3e-6f89-b560-3f51d54549aa.png)