For Each Rowで遊んでみた(延長戦)

#はじめに
この記事は2020年2月7日金曜日の「UiPath Friends Women's Community vol.3 ~バレンタインスペシャル~」でLT登壇を行った発表内容が5分で語り終わらなかったという発表者を救う為、この記事でLTの延長戦(追加解説)をいたします。


#あらすじ
「For Each Rowで遊んでみた」という内容で発表した"さお"というRPAエンジニアの端くれがいた。
とりあえず、彼女の語りだけでは足りないところを補足しよう。
※プレゼン資料の全体像が見たい場合は後日公開予定です。
なお、今回使用したUiPathのバージョンは2019.11(Community Edition)です。


#補足説明1_For Each Rowとは

For Each Rowとはすなわち・・・「データテーブル型のデータを”行”ごとにループするアクティビティ」です。
と説明しましたが、さすがにこれだけでは説明不足なので簡単に"テーブル"、"データテーブル"について説明しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/4f363581-6f39-1104-815c-1d2a9b874b2d.png)


##テーブルとデータテーブル
私の中ではエクセルでもなんでも「表のかたまり」=テーブルと認識しています。
(本来はもっと専門的な説明があるのですが、まずはイメージで覚えてください)

データテーブルは"テーブル"の中にあるデータと思っています。
要は下図のような感じです。

【テーブル】=エクセル全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/e18223de-dd9f-564a-39f7-c73930b71f94.png)

【データテーブル】=　エクセル全体の中で、データ(表形式のかたまり)があるところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/cd6cdea0-b695-ee1e-0551-d38e5e591739.png)

これじゃさすがにピンと来ない人もいらっしゃると思いますので、皆さんの机(ダイニングテーブルでもいいです)を想像しましょう。
机に本や雑誌、お菓子の詰め合わせなどの荷物があり、片付けの際にどこかにを寄せておいてみると、荷物=データという感じが見えてきます。

【机(イメージ)】
大体このくらいかな、よし、作業しよう。
ということで、モノを置いていきますよ～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/d2a28795-ecda-d47a-71de-9992a5d27d65.png)

【机の状態(整理前)】
モノを置いたまではいいんだけど・・・なんだか雑多な感じが。。。
どこか端に寄せましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/fd320695-07ad-1bef-3729-9e631da8d891.png)

【机の状態(整理後)】
まとめてどこかに置いたら、使えるスペースが増えたわ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/07240e2c-45bb-594a-0ad4-431383e8a6d6.png)

整理してみると、赤点線のかたまりでまとまって何か出てきましたね。
この感じを"データテーブル"とお考えください。

#補足説明2_おまけ

おまけの説明は以下のスライドでしたが、こちらも補足していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/1bfa058a-643c-203d-7f6c-0d87bd8045d7.png)

今回の例では列名にある数字が「可変」だった場合に、こんな感じで式を設定するといいよという感じで説明しました。
そもそも列名が"列1"とか"列2"と書けばええやんと思う方もいるかもしれません。。。
ただもし設計、運用の過程で"列1"、"列2"の"1"や"2"の数字部分がカウント変数(int型)と連動して動く場合はどうでしょう。

例えばSwitchアクティビティでの分岐を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/34a37a72-fca2-b3b4-9228-b7346875b7de.png)
上記の式はintカウント(int型)が初期値=1となっており、これからFor Each Rowで
回してカウントも1を足していく...という感じです。(intカウントに最大値は未設定とします)

Caseが現在1～3のみ設定しています。これだけならまだいいですが、これが100、200と数が多くなってきた場合はどうでしょう。
Switchで同じパターンの解を100ケースも面倒。。。だと思います。
だからといって「>=50(50以上)」とか設定はいちいち面倒だし、ほかの大きな数字が出たらそれも対応するの～？」等不満がたまると思います。
なので、数字の部分が可変になる場合、int型の変数を組み込んでおけばカウントは勝手にロボットが対応します。
要は変数をうまく組み合わせると「**後がラクですよ**」ということです。

#補足説明3_使用するときの注意点(1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/a8e50534-f6de-4c60-7e98-171111eda038.png)

boolean型の変数にいれてからってどういうこと？と思われた方、下記2点を比較してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/897fc8e4-6bdd-02ef-e9ba-ede6e39d1d99.png)

※今回は比較のためParallelアクティビティでわざと並列にしています。
左と右で同じ条件を示しているのですが、IFアクティビティを使用した時の印象が少し変わると思います。
あまり長い式だとパッと見えないのは不満という方は右のフローのように変数に長い式を格納→Boolean式で変数だけ書くのもアリだと思います。
ただし変数が増えるリスク(スコープの適用範囲による管理の大変さ、現場の開発規約で変数に使用制限がある場合等)がありますので、各現場の状況で判断されるのが良いと思います。
※Variablesの「Default」で設定するのは。。。う～ん。

#補足説明4_使用するときの注意点(2)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/de93d0c4-3815-5851-fb60-ec9f24dec752.png)


そもそも「0から始まる？どういうこと？」って思った方がいるかと思います。

※今回の場合、「Read Range」アクティビティで事前にDatatable型を取得していたのですがこの時、「AddHeaders」にチェックを付与しています。
チェックがないとヘッダーも"データの一部分"となってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f0751bca-d5bc-9f47-9d9b-bd10d0ccfddf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/9948f299-ab20-be46-9280-999d9ddb76e3.png)


下記を見ていきましょう。
今回はRange(範囲)が指定されていませんので、データがある分すべて読み込みます。
しかし、ヘッダーのチェックを付与するとどうなるのでしょうか。
結論から言うと、一番最初の行はヘッダーという扱いになりこの部分はデータテーブル型として利用することはできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/d8a240ca-548a-0f9b-a426-2b68e76a35a0.png)

今回の例の場合、グレー部分はヘッダーとなっておりデータとして指定することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/cfacffc3-f922-aad8-4a2d-3c79c0fb118f.png)

ヘッダーを除いて見てみましょう。
基本ITの世界は"0"からスタートというルール？があるので、これに従います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/5877ef61-c34f-393d-d48c-2b7ac3f1802a.png)

今回の場合、「データテーブル内(1,1)セルの座標にあるデータを取り出す」というお題でした。
※(行の番号、列の番号)の順番で書いていきますよ～。

行の番号：1、列の番号：1・・・(1,1)の交差するところにある値を探してみると・・・
赤いセルに書いてある名前が出力されるのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/ee2ec0b7-35fc-d611-27bc-432b4cfc380e.png)

もしこれが、
(2,0)ならば、"2005"、
(1,3)であれば"青"
という感じで出力可能です。


#最後に
今回の発表は内容が細かすぎて伝わりづらかったかもしれません。
しかし、いずれも使いこなすと応用範囲が広がり、開発が容易にできたりと幅が広がるためぜひとも活用していってください。
時間があればもう少し細かい解説がしたい・・・。(続編する？)
長文ご覧いただきありがとうございました。