Power Automate Desktop  の変数（5）「リスト型」 

## 概要  

Power Automate Desktop(以下PAD) の変数についての記事5回目「リスト型」です。PADのベース言語Robinのドキュメントを参考に試したものをまとめました。「変数の設定」アクションを中心に簡略化した例を挙げながら整理してみようと思います。コードはPADにコピペで試せます。

## 目次

1. [概要、数値型](https://qiita.com/sys_zero/items/13e06a41834cf40988ea)
2. [テキスト型](https://qiita.com/sys_zero/items/0f5b54dd4dbbf0d31e71)
3. [Datetime型](https://qiita.com/sys_zero/items/7804ffffea5b244c46c4)
4. [ブール型](https://qiita.com/sys_zero/items/68deda047c4b50c66458)
5. [リスト型](https://qiita.com/sys_zero/items/82951049466791b2b728)<今回の記事>
6. [データテーブル型](https://qiita.com/sys_zero/items/171d73ba24e123dd1b66)
7. [カスタムオブジェクト型](https://qiita.com/sys_zero/items/6006ab42e2af60c170b5)

## 注意

- すでに使いこなしているかた向けの記事ではありません。
- Robin言語はあくまでベースであるためPADと異なる部分があります。
- この記事の内容はすべて試していますが公式の見解とは異なる可能性がありますのでご注意ください。
- Power Automateクラウドフローの入出力変数については触れていません。
- 2021年2月の記事です。
- あくまでも個人のまとめです。
- 誤りがありましたらコメントでご指摘いただけると幸いです。
- Robinの公式サイトは2021年4月30日に終了しました。

## リスト型変数について  

リスト型変数は複数の値が1方向の集合になった「リスト」を持ちます。リストは配列とも呼ばれます。値が同じ型で構成されているリストの場合、リストの型は値のタイプと同じになります。タイプの違う値でリストが構成されるときは一般の値リストとなります。

* リスト型は0ベースのインデックス番号を持っています。


![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/557a7e41-d9fb-61c5-10de-3901f740d9bd.png)




* プロパティにリスト項目のカウントもっています。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/440a8615-53d2-347b-a0a2-125e8b9a5a35.png)


### リストを作成する

リストを新規に作成するにはいくつかの方法があります。

- **「変数の設定」アクションからリストを作成**

角括弧[]のなかにカンマ区切りで値を書き、%で囲います。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/c9662e6e-4278-f032-e7af-562841a2ec4d.png)

項目がテキストの場合は'シングルクォーテションで囲います。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/c9f993b1-5948-335b-0450-0a73c321b363.png)

リストに変数を使用する場合はシングルクォーテションを使いません。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/fe536ecd-fd32-76e5-c062-e522ee34c5f0.png)


![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/a074c46f-3026-9cc1-fe59-32a5879e8f63.png)

- **変数アクション「新しいリストの作成」→「項目をリストに追加」からリストを作成**

組み合わせてリストに項目を追加し作成します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7fba51cc-5b87-431b-5008-f81bded36171.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/a3ec338a-40b9-f80e-8115-c78a8dab2f6c.png)


- **「データテーブ列をリストに取得」アクションでリストを作成**

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/891cad7d-5cc1-274f-427e-597894f554d4.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/449706cc-6f64-26a2-0d77-35b32cc58023.png)

列名（例だとname）またはインデックス番号（例だと1）指定で一度にリストが作成できます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/04743c6d-6497-baeb-76e9-67f505a35238.png)


- **「乱数の生成」アクション**
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/84c2ea79-7614-6b1e-708c-00f3e93a20d0.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/3dd0217b-5c6d-fe0a-e8fe-4124f3b84a0e.png)


### リストの値を指定する

#### インデックス番号で値を指定

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d1f4688c-374b-5202-3e24-3fb6ed8832fc.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7155893f-6372-7d50-6ee8-b8e0df310c70.png)

#### リストのスライス

リストをスライスして新たなリストを作成できます。
[start:stop]でインデックスを指定します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/eb05ad3e-f962-9045-662d-01e75aaf59aa.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7d5f79f0-1c48-20bd-5196-90158a04650d.png)

値の間の線で考えるとわかりやすいかもしれません。
![](2021-02-22-20-46-10.png)![2021-02-22-20-46-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/a4dc4c8c-fbfa-2ade-e2b6-e8ea57861fa9.png)


### リストに項目を追加する  

#### 変数の設定で項目を追加（後方）

数値
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/89a0ffe6-ca12-7dc6-840b-93968a954272.png)


テキスト値
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/5d99695d-8027-6182-a955-b72b000f697b.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/5643fba0-69bb-731e-06ba-41361703be7f.png)
「項目をリストに追加」アクションでも同じように値を追加できます。

#### 変数の設定で項目を追加（前方）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/badf0535-5f4b-9023-611d-cd7af1953a82.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/254d3504-e73a-d10f-22dc-e1993ee4d80d.png)


#### 変数の設定で項目を追加　リストのネスト（入れ子）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/23715439-a2e0-53c0-e969-8d671084faa3.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/10cf17b2-672e-5b21-c27b-5cdd20db171a.png)

ネストされたリストのスライス
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d7e5f6fe-4ef2-c72e-ab71-60ec2f0039d0.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/fd363c67-3e37-91cd-7bde-c3997c9b91ae.png)

####「リストの統合」アクション
  2つのリストを1つにマージします。変数の設定アクションからではできません。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/3a5d1d5d-b17d-de16-ba04-9e21241c3756.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ead4b410-1866-77c1-bd27-c1a2647003d2.png)

#### リストに項目をインサート
スライスとリスト統合アクションを使ってリストの任意の場所に項目を追加します。
リストに追加アクションは最後尾にしか追加できないため、挿入するためにはいくつか手順を踏みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/98e995de-42ec-417f-b214-60ea5a8dcdf4.png)

- 追加したい値と場所（インデックス）のペアを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/86f67865-815f-abfd-d01d-ae3269bbb0f7.png)
- 値と場所をそれぞれ変数に代入しておきます。最初から変数に値を書いても可能です。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/c14dfdf1-531d-52ac-3a81-61e2f9b1c852.png)
- 値を挿入したい位置でリストをスライスして、そこに値を追加します。```%List1[:InsertPosition] + Insertvalue%```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/cc6d9e3a-f787-4d0c-1ddd-6cc5df25a0b1.png)
- スライスしたリストの後方部分を統合すれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/421d5781-aa19-9ab1-66c7-1ba95c53df69.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f00da294-2ffd-8681-5d7d-d400a968b154.png)

- わかりやすくするために順を追って書きましたが、つまりはリストの統合アクションだけでも値の挿入が可能です。
![Screenshot 2021-03-13 174910.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/922ad6e3-486f-d026-8fac-f9fd89714533.jpeg)

### リストから項目を削除  

「**リストから項目を削除アクション**」を使用します。変数の設定アクションからではできません。
インデックス番号か値を指定できます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7b05304e-b3d3-332e-5537-90eebaba592f.png)



###「**リストの内容を減らす**」アクションについて

~~2つのリストの差分をつくれるはずなのですが、2021年2月時点ではWinautomationと異なる挙動をするため注意が必要です。
1番目のリストに重複が含まれている場合、このアクションで差分リストをつくると重複項目が一意化されます。
例　[1,2,3,4,5,5]と[1,2,3]でこのアクションを使用した場合、期待する値は[4,5,5]ですが返される値は[4,5]となります。Winautomationでは同様のアクションを使用した場合[4,5,5]が返されます。~~
2021-08-14追記
久しぶりに再確認したところ期待した動作になっていました。
次の例では空白やスペースのみをリストから取り除いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f93be734-5689-3171-2bb1-22be7dc6a7b8.png)

```r
SET A TO [1, ' ', 1, 2, 2, 3, 4, 5, '', ' ', 0]
SET B TO ['', ' ']
Variables.SubtractLists FirstList: A SecondList: B OutputList=> ListDifference
```

### リスト項目の検索

検索する値がリスト内の項目に含まれているかをTrue、Falseで返します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9280aee6-f3a7-3f24-8d10-6378cb39538f.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/427761bd-4513-e935-556d-279a6b2b28fe.png)


検索する値がリスト内の項目に含まれていないかをTrue、Falseで返します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/73031f31-baa1-eff1-bdbb-ffb8316e6031.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b1f4a694-d13b-cc76-51cb-b5125bd94962.png)


### リスト項目の置換  

リスト内項目の置換は2021年2月時点では公式ドキュメントやRobin言語のドキュメントでも触れられていない内容ですのでご注意ください。
変数の設定アクションから変数名にリスト名とインデックスを記述することでリスト項目の置換が可能です。ただし設定したアクションをもう一度開いて保存し直すと通常の変数名に戻るので注意が必要です。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/33745bd4-b6c4-42b1-7343-9e675598a88f.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/59e8b4d5-c73c-6128-266f-b3fe16079444.png)


変数名に記述するインデックスを変数にしても可能
SampleListを作成し**2**を**A**に置換えてみます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/3c844cf0-998d-8541-7e18-536074a0d942.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8bc25c3e-422a-194b-a5bc-9aba36809277.png)

ループ内の変数の設定アクション　置換はこのように書いています。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/c12721ff-1870-02cb-44e6-21fcb6f7a02a.png)


## 今回のコード  

```
SET List1 TO [1, 2, 3, 4, 5]
SET List2 TO ['a', 'b', 'c', 'd']
SET Var1 TO 5
SET List3 TO [1, 2, Var1, 4, 5]
SET ListCount TO List1.Count
Variables.CreateNewList List=> List4
LOOP LoopIndex FROM 1 TO 5 STEP 1
    Variables.AddItemToList Item: LoopIndex * 2 List: List4 NewList=> List4
END
Variables.GenerateRandomNumber.ListOfRandomNumbers MinimumValue: 0 MaximumValue: 100 NumbersCount: 10 AllowDuplicates: False RandomNumbers=> RandomNumbers
SET ListVar TO List1[3]
SET ListSlice TO List1[1:3]
SET ListAddNum TO List1 + 1 + 2
SET ListAddText TO List1 + 'a' + 'b'
SET ListAddF TO '前方追加' + List1
SET NestedList TO List1 + List2
SET NestedSlice TO NestedList[5][1:3]
Variables.MergeLists FirstList: list1 SecondList: List4 OutputList=> OutputList
# Start'Insert to list'
SET Insert TO [999, 2]
SET Insertvalue TO Insert[0]
SET InsertPosition TO Insert[1]
SET sublist TO List1[:InsertPosition] + Insertvalue
Variables.MergeLists FirstList: sublist SecondList: List1[InsertPosition:] OutputList=> List
Variables.MergeLists FirstList: List1[:3] + 777777 SecondList: List1[3:] OutputList=> OutputList2
# End 'Insert to list '
Variables.RemoveItemFromList.RemoveItemFromListByValue Item: 2 ItemMatchAllOccurrences: True List: OutputList NewList=> OutputList
Variables.SubtractLists FirstList: OutputList SecondList: [1, 3, 10] OutputList=> ListDifference
SET SearchList1 TO 8 IN List1
SET SearchList2 TO 0 NOT IN List1
SET List1[1] TO 999
SET SampleList TO [1, 2, 3, 1, 5, 6, 4, 3, 1, 2, 6, 9, 5, 6, 2, 1, 2, 3, 8, 4, 2, 5]
SET SearchNum TO 2
SET ReplaceValue TO $'''A'''
LOOP LoopIndex2 FROM 0 TO SampleList.Count - 1 STEP 1
    IF SampleList[LoopIndex2] = SearchNum THEN
        SET SampleList[LoopIndex2] TO ReplaceValue
    END
END
```

## 今回のまとめ　　

%[]%と記述することでリストを変数の設定から作成可能です。
リスト型のインデックスは0ベースです。
リスト型の応用範囲はとても広く強力なので、PADで可能なことをしっかり理解したほうがよいとあらためて認識しました。
リスト内項目の置換が可能とわかったのは収穫でした。
また変数名のインデックスに変数を使用して動的にリストを変更できます。

## 参考

[Robin - RPA language](https://robin-language.org/)