UiPath Terminalアクティビティについて　(第3話=最終回)

##これまでのあらすじ(第2話まで)

Terminalアクティビティについて(自分なりに)解説した筆者ですが、今回は主に使うアクティビティをもう少し詳しく見ていきましょう。

まだ見ていない方は第1話、第2話からご覧ください。

※注意
今回ご紹介するUiPathのバージョンは2020.10.2、アクティビティのバージョンは2.0.1です。
(知らぬ間に進化しとる...)
この回は2020年6月に開催された「UiPath Friends」イベントで資料公開されたものを抜粋しています。
(オフコンはIBMのAS400を参考に説明します)


#Terminalアクティビティで設定する際のポイント

##1.RowとColumn(行と列)に慣れよう
Terminalアクティビティを使いこなすコツの一つに「行」と「列」という概念があります。
といっても数学の行列の計算でをするのではなく、画面の位置を特定(つまり座標指定)することです。
これがわかれば使いこなせるようになると思います！

まずは下の画面を見ましょう。(これは一例です)
IBMのAS400の場合、画面の行列は行：24、列：80ですが、ここでは分かりやすく説明したいので行：20、列：40とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/148a58fa-1564-da74-ef37-2ce69c976d9b.png)

オフコンの画面を見たり触った経験をお持ちの方であればわかるのですが、オフコンはWebでよくやるマウス操作(Webのようにクリックとか)はできません。
基本はキーボードのキー操作になります。

上記の例を見てみると、画面が真っ黒の中に文字が記載されていますね～。
この場合どのように操作するのかというと、選択欄にやりたいことに対する番号を入力、(なんでもいいのでここでは"1"を入力しましょう)"1"と入力して実行すると次の「勤怠」にするメニューが登場するという流れになります。

※実際は導入企業、導入するエミュレータにより画面のイメージは異なります※

##2.画像で認識させようとしない
第1話でも解説したかと思いますが、画像判定や認識は不具合の原因になりやすいので使用しないことを推奨します。
環境のある方は実際に挑戦してみるとわかりますが、全然要素がつかめません。
(セレクタ(要素)の取得がかなり難しいです。)


#これだけ使えれば多分大丈夫!なアクティビティ

##Get Field at Position(指定位置でのフィールドを取得)

指定した行列番号にあるテキストを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/2424ab65-64d3-c045-7af9-e460b673e7f6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/5b06184f-b559-f723-316c-6a89fde39aaf.png)

【Options】
DelayMS：遅延時間(ミリセカンド)の設定ができます。
TimeoutMS：タイムアウト時間
WaitType：Ready,Complete,None

【Output】
Text：Stirng型の変数を入れるか、文字型で直接入力
(MSはMiliSecondのことです。他のアクティビティでは「MiliSecond」と記載されているのでややこしいですが...。)

【Positions】
Column：列位置
Row：行位置
いずれもInt型変数か数値を設定


ここでは指定した行、列の場所から文字を取得することができます。
例えば

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/b050d52e-8e78-f1da-da40-41dcc386cba6.png)

上記の右上にある「あ」という文字を取得したい場合は以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/27050b74-9307-967e-4d97-106be997811b.png)

「あ」という文字を取得したい場合は、行：2、列：27にある文字を取得することになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/880f0808-d0c3-b9cc-ba3e-9a5ba677b9ee.png)


こういうことですね。。。(おお。。。)


##Get Screen Area(画面領域を取得)
指定した行、列の範囲にある文章を取得します。
(決まった範囲の文字を取得したい時に使用します。)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/d4ca0245-753f-9055-4227-cf9f04974545.png)
※上のタイプは確かVer1.3.4当たりのものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/b9be5cf6-5d0d-e9af-8ef4-09883c92cc32.png)
★上記のものが最新バージョンのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f5c76751-7d22-b15e-f6f6-9b78dd2c447e.png)
【Options】
DelayMS：遅延時間(ミリセカンド)の設定ができます。
TimeoutMS：タイムアウト時間
WaitType：Ready,Complete,None

【Output】
Text：Stirng型の変数を入れるか、文字型で直接入力

【Positions】
Column：列の開始位置
End Column：列の終了位置
End Row：行の終了位置
Row：行の開始位置
いずれもInt型変数か数値を設定


例えば上記の「あ」から「こ」まで取得したい場合は以下のように設定します。
出力は変数を設定しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/10b37191-6d46-deaf-965b-0c05efbe1e22.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/3131a0d3-a281-4fc3-5ac7-f534f39bcb4a.png)

そうすれば「あいうえおかきくけこ」が取得できるはずです。

##Get Text at Position(指定位置でテキストを取得)
指定した行列から何文字分取得したい文字が決まっているときに使用します。
"Length"があるので、取得したい文字数が決まっているときに使用します。
Get Field at Positionとは近いですが、文字取得がしやすいのは(個人的に)このアクティビティだと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/2a62b0f5-2588-c8d2-725d-fb50d2caa46a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/8365a453-f39a-e72c-aada-4a59f9ffdc2e.png)

【Options】
DelayMS：遅延時間(ミリセカンド)の設定ができます。
TimeoutMS：タイムアウト時間
WaitType：Ready,Complete,None

【Output】
Text：Stirng型の変数を入れるか、文字型で直接入力

【Positions】
Column：列の開始位置
length：文字の長さ
Row：行の開始位置
いずれもInt型変数か数値を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/3e561206-1349-df6e-8367-6dd7b4c2b9cc.png)


上記の図で「あ」から「う」まで取得したい場合は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/b1d424aa-ef5a-96b6-2256-e9f86b383175.png)

そうすれば「あ」から「う」まで取得できるはずです。

##Move Cursor(カーソルを移動)

指定した場所へカーソルを移動します。
(マウスは使えないので、特定の場所へ移動させたいときに使用します。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/4986e559-e3f5-2b2c-7619-ce70fcf9e83a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/4e40cafa-f1e3-4a27-c794-3a2732105786.png)

【Options】
DelayMS：遅延時間(ミリセカンド)の設定ができます。
TimeoutMS：タイムアウト時間
WaitType：Ready,Complete,None

【Positions】
Column：列の位置
Row：行の位置
いずれもInt型変数か数値を設定

例えば"1"から"5"まで移動したいときは。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/0846efa9-68b6-2fd4-6328-27dec0128e90.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/ceb65a3f-57f4-9215-48c2-fff96f39c148.png)
簡単に移動可能！


##Send Keys(キーを送信)
キーを送信します。
("F2"のようにキーを書くこともできますが、キーの場合、後述の「Send Control Key」の方が使いやすいと思います。)
私はあんまり使わなかったけど...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/39b4f95e-4c90-6c8c-40fd-b7b68b2b4366.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/7b4ea612-05b1-cc8b-826a-528e8cbeb8fd.png)
【Input】
Keys：キーを入力します。(文字型)
【Options】
DelayMS：遅延時間(ミリセカンド)の設定ができます。
TimeoutMS：タイムアウト時間
WaitType：Ready,Complete,None


##Send Control Key(コントロールキーを送信)
コントロールキーやFunctionキーなどを指定できます。
(下記"Transmit"はEnterと同じく「実行」の意味です。)

文字の削除は"EraseEOF"等でも可能です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f6f7a415-4a2f-c884-cf22-549b39ab9531.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f96e12a2-3765-2b47-3e32-a499d93b19bb.png)
【Input】
Key：プルダウンで選んだキーが出てきます。

【Options】
DelayMS：遅延時間(ミリセカンド)の設定ができます。
TimeoutMS：タイムアウト時間
WaitType：Ready,Complete,None

以下はコントロールできるキーの一覧です。
"Transmit"は"Enter"キーと同じで「実行」のキーになります。
またこの時にキーは1つ設定できますが、複数設定はできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/385344af-defe-149c-70ab-6385ec958bd4.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/53bde7cb-bdb2-6fd4-49c2-b7a11f3ff722.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/415bb6c0-9c37-60fa-28bc-e6efd4c39545.png)




###Send KeysとSend Control Keyはどう違う？
SendKeysは直接入力するタイプですが、ファンクションキーやコントロールキーはSendControlKeyのほうが使用しやすいです。

削除(Delete)やページアップ、ダウン等のキーを使用する場合はSend Control Keyがいいですね。

#Set Field at Position(指定位置でフィールドを設定)
指定の場所にテキストを入力します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/145df9c5-612e-15e5-2316-a4cdaa93ea0b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/a2262b9b-4bb1-2513-e1da-0243a95ddfb4.png)

【Input】
Text：Stirng型の変数を入れるか、文字型で直接入力
【Options】
DelayMS：遅延時間(ミリセカンド)の設定ができます。
TimeoutMS：タイムアウト時間
WaitType：Ready,Complete,None
【Positions】
Column：列の位置
Row：行の位置
いずれもInt型変数か数値を設定

例えば14行目、32列目から5文字入力したい場合は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/22c33f5e-cd79-32b7-602b-18a370b9b804.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/02ce2ebe-c691-ee31-0759-45d3b217ed8e.png)

こうすると、以下のようになるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/9ccbd3ca-f5ae-d1bd-2528-62a314e3f114.png)



#Wait Text at Position(指定位置でテキストを待つ)
指定した場所のテキストが出現するまで待ちます。
(そこまで使用頻度高くなかった...)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/7c2b0a67-9a58-96f9-4355-2b223af2bbbb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/dce42161-97c3-b2ca-650c-1644d4a7b7a8.png)


【Input】
Match Case：Boolean型の変数or TrueかFalseを設定
Text：Stirng型の変数を入れるか、文字型で直接入力

【Options】
DelayMS：遅延時間(ミリセカンド)の設定ができます。
TimeoutMS：タイムアウト時間
WaitType：Ready,Complete,None

【Positions】
Column：列の位置
Row：行の位置
いずれもInt型変数か数値を設定


##まとめ
最近はなかなかお客様にオフコン(エミュレータ)を使うことがない限り遭遇する機会は多くありませんが、
当時は調べても使い方に関する情報が非常に少なく、「これはまずい」と感じたので
この記事を書きました。
思い出しながらなので結構忘れていましたが少しでも活用いただけると幸いです。

ちなみにほかのRPAツール(AutomationAnywhereやBluePrism)でもオフコンとの接続や自動化に対応しているようなので、ぜひ活用してみましょう。

第2話から時間が結構空いてしまい大変申し訳ございませんでした。
最後までご覧くださりありがとうございます。