MEMONICA

MEMONICA

RPAやプログラミングなどの自分用技術メモブログです。

【Blue Prism】Tips

Blue Prismの小ネタを書きます。

四捨五入

Blue PrismのRound()は銀行丸めです。

Round(Number, Places)  Places桁目で銀行丸め

小数点以下第N桁目が奇数 → 5未満は切り捨て(それ以外は切り上げ)

小数点以下第N桁目が偶数 5以下は切り捨て(それ以外は切り上げ)

例) N=1

・小数点以下第1桁目が奇数 → 実質四捨五入

Round(1.14, 1)  →  1.1

Round(1.15, 1)  →  1.2

・小数点以下第1桁目が偶数 → 5以下は切り捨て

Round(1.25, 1)  →  1.2

Round(1.26, 1)  →  1.3

そのため、四捨五入をする場合は、四捨五入する桁に5を足した数字をRndDn()で切り捨てます。

RndDn(Number, Places)  Places桁目で切り捨て

RndDn(1.24+0.05, 1)  →  1.2

 1.24 + 0.05 = 1.29のため、切り捨てると1.2

 RndDn(1.25+0.05, 1)  →  1.3

1.25 + 0.05 = 1.3のため、切り捨てても1.3

四捨五入になっている。

整数の四捨五入

例) 1240000を5桁目で四捨五入

RndDn(124000/10000+0.5, 0)*10000  →  120000

① 四捨五入したい桁数で割る

➁ 0.5を足した値をRndDn()で切り捨てる

③ 最初に割った桁数をかけ直す

 

1250000の場合、四捨五入すると130000に切り上がります。

RndDn(125000/10000+0.5, 0)*10000  →  130000

正規表現

Blue Prismで正規表現を扱うオブジェクトには、Utility - Strings、AVO.Regexがあります。AVO.RegexはDXからダウンロード可能です。

https://digitalexchange.blueprism.com/dx/entry/3593/solution/avoregex

Utility - Strings

Utility - Stringsで正規表現を扱うオブジェクトは2つあります。

・Extract Regex Value

・Test Regex Match

まず、正規表現の名前付きキャプチャについて記載します。

正規表現の名前付きキャプチャは、マッチしたテキストの一部分に名前を付けて抽出する機能で、Utility - Strings > Extract Regex Valueを使用します。

Extract Regex Value

f:id:zamdin:20200830201925p:plain

Regex Pattern (?<name>pattern)という形式で名前付きキャプチャを指定。
name:名前付きキャプチャの名前部分
pattern:マッチさせる正規表現
Target String 抽出対象の文字列
Named Values "Name"フィールドと"Value"フィールドの2つのフィールドのみで
構成されたコレクションを指定。Name列に名前付きキャプチャし
たいパターンの名前を1行ずつ並べ、Value列は空欄にする。

f:id:zamdin:20200830202148p:plain

Outputsには、名前付きキャプチャの結果が格納されたコレクションが返る。InputsのNamed Valuesで指定したコレクションをそのまま使うことが多いです。

Named Values コレクション

f:id:zamdin:20200830182936p:plain

f:id:zamdin:20200830202024p:plain

f:id:zamdin:20200830202041p:plain

"(?<数量>\d*)個(?<金額>\d*)円"

のように、2つの名前付きキャプチャを指定したい場合、Named ValuesコレクションのInitial Valuesにも、Nameフィールドに"数量"と"金額"の2つの行を設定しておきます。

"りんご1個120円、みかん1個80円"のように2箇所マッチする文字列を指定したとしても、抽出されるのは最初にマッチした1箇所のみとなります。みかんにもマッチするには、さらに数量と金額の行を増やし、パターンも追加する必要があります。

Test Regex Match

マッチ箇所があるかどうかを、True、Falseで判定します。

f:id:zamdin:20200904201118p:plain

f:id:zamdin:20200904201241p:plain

AVO.Regex

 AVO.Regexオブジェクトで使える機能には以下の5つがあります。

f:id:zamdin:20200830210618p:plain

 Escape Text For Use In Regex

エスケープ文字¥をエスケープします。

f:id:zamdin:20200901233019p:plain

f:id:zamdin:20200904194312p:plain

Extract All Matches As Colletion

マッチ部分全てを抽出し、コレクションに出力します。

f:id:zamdin:20200904194758p:plain

f:id:zamdin:20200904194533p:plain

Extract First Match As Text

最初にマッチしたテキストを抽出します。名前付きキャプチャを使用できます。

f:id:zamdin:20200904195204p:plain

f:id:zamdin:20200904195224p:plain

Regex Replace

正規表現でマッチした箇所を、指定した文字に置き換えます。いくつか使い方があります。

1.マッチした箇所を全て置き換える

f:id:zamdin:20200831210536p:plain

f:id:zamdin:20200901232155p:plain

Regex Pattern 正規表現パターン
Text To Do Replacement On 置換対象の文字列
Replacement Text 置換文字列

2.プレースホルダ

f:id:zamdin:20200831210216p:plain

f:id:zamdin:20200901232050p:plain

Regex Patternの()でキャプチャした文字列は、Replacement Textで$1~$99を使って参照できます。

上記例では、$1に"マッチ文字列の"120円"が格納されます。$1 = 120円

注意したいのが、マッチした順番に$1、$2、$3…と格納されるのではなく、()グループごとに割り振られている点です。

f:id:zamdin:20200831215522p:plain

f:id:zamdin:20200901231802p:plain
上記例だと、$1 = (\D*)であり、「りんご」「、ぶどう」「、みかん」にそれぞれマッチするため、Replacement Textに"$1"を指定すると「りんご、ぶどう、みかん」となります。

3.名前付きキャプチャ

Utility - Strings > Extract Regex Valueで使用した名前付きキャプチャも使えます。

f:id:zamdin:20200901085406p:plain

f:id:zamdin:20200901231716p:plain

Regex Pattern の値で名前付きキャプチャ?<name>を指定し、Replacement Textでマッチした値を参照するには、${name} とします。

 

Tipsは随時更新していきます。

【Blue Prism】アクションMEMO

個人的に良く使うアクションのメモ

[Collections]

アクション名

概要

入力

出力

Copy Rows

指定した行数分コピーしたコレクションを作成

Collection Name
Start Row
End Row

Collection

 

[Collection Manipulation]

アクション名

概要

入力

出力

Append Field(Number, Text)

フィールドを追加し、Valueを設定。(既存のすべての行にValue値が設定される)

Collection (Collection)

Field Name (Text)

Value (Text)

Appended Collection (Collection)

Merge Collection

2つのコレクションを結合(フィールドが横に並ぶ。Append FieldではNumberText型のみだが、それ以外も可能)

Collection 1 (Collection)
Collection 2 (Collection)

Collection 3 (Collection)

Append Rows to Collection

コレクションAにコレクションBを追加(結合)

Main Collection (Collection)
Collection to Append (Collection)

Combined Collection(Collection)

Set Column Names From First Row

最初の行をフィールド名として設定したコレクションを作成

Input Collection

Collection

Filter Collection

WHERE句でマッチした行だけ抽出したコレクションを作成

Collection In
Filter

Collection

Collection Contains Value

 

コレクションの指定した列に"Exact Value”で指定した値、もしくは”Regex”で指定した正規表現パターンを含んでいるかを判定Regexを設定した場合、コレクション内で最初にマッチしたグループを返す

Collection
Column Name (Text)

Exact Value (Text)
Regex (Text)

Contains Search Term (Flag)
Groups (Collection)

Collection Contains Filed

コレクションの指定したフィールドに値が入っているか判断

Input Collection (Collection)

Field (Text)

Success (Flag)
Error Message (Text)

 

[Utility - File Management]

アクション名

概要

入力

出力

Get Files

ファイルの取得

Folder
Patterns CSV
*使用可能、カンマ区切りリスト)

Files (Collection)

Success
Message

Copy File

ファイルのコピー(既にある場合は上書き)

File Path
Destination Path

Success
Message

Move File

ファイルの移動、名前変更
(既にある場合はエラー)

File Path
Destination Path

Success
Message

Delete Files

ファイルの削除

Folder (Text)
Pattern (Text, *
使用可能)

 

Get CSV Text As Collection

CSVファイルパスを指定し、データをコレクションに格納 (データ型を自動的に推測し設定⇒思った通りにならないことも)

CSV File Path
First Line Is Header (Flag)

CSV Values(Collection)

Write Text File

テキストデータをファイルに書き込む

File Name (Text)
Text (Text)

Success
Message

Read All Text from File

テキストファイル(主にCSV)を読み込み、テキストデータに出力

File Name (Text)

Success
Message
Text (Text)

 

[Utility - String]

アクション名

概要

入力

出力

Get Collection as CSV

コレクションをCSVデータ(カンマ区切りテキストデータ)に変換

Input Collection (Collection)

Collection CSV (Text)

Get CSV As Collection

CSVテキスト(カンマ区切り)をコレクションに格納。Schema=Column Nameフィールドに指定した値に格納後のフィールド名が変更される

CSV (Text)
First Row Is Header (Flag)
Schema (Collection)

 

Test Regex Match

テキストに指定した正規表現が存在するか判断

Regex Pattern (Text)

Target String (Text)

Matched? (Flag)

Extract Regex Values

テキストから指定した正規表現にマッチする箇所を名前付きキャプチャとしてコレクション出力(入力コレクションのFieldNameValueのみ)

Regex Pattern (Text)
Target String (Text)
Named Values (Collection)

Named Values (Collection)

Join Text

テキスト結合。入力コレクションは、結合したい値を「Item Value」フィールドに格納し、それ以外のフィールドは存在してはならない

Values (Collection)
Join Character (Text)
Trim Values (Flag)

Joined Text (Text)

 

[MS Excel VBO]

アクション名

概要

入力

出力

Get Worksheet As Collection

Excelデータをコレクション出力

handle
Work book Name
Worksheet Name

Collection

Get Number Of Rows

Excelの最終行取得

handle
Work book Name
Worksheet Name

Number

 

[Utility - Environment]

アクション名

概要

入力

出力

Wait for Process Window

指定したウィンドウが開かれるまで待機

Process Name (Text)
Window Title (Text,*使用
可能)
Wait (Number)

Found (Flag)

【Blue Prism】日時について

Date型、DateTime型、Time型についての要点まとめ

日時の計算

Date型

Date型の加減算は、基本的にAddDays()、AddMonths()、DateAdd()で行う。

関数(引数)

内容

戻り値

AddDays(Date, Days)

DateDays(Number)を加減算
AddDays("2020/6/9", 3)
AddDays("2020/6/9", 3.21)
AddDays("2020/6/9", 22)
AddDays("2020/6/9", 60)
AddDays("2020/6/9", -3)

Date
6/12/2020

6/12/2020
7/1/2020
8/12/2020
6/6/2020

AddMonths(Date, Months)

DateMonths(Number)を加減算
AddMonths("2020/6/9", 3)
AddMonths("2020/6/9", 8)

Date
9/9/2020

2/9/2021

DateAdd(Interval, Number, Date)

選択したInterval(0:年、1:週、2:日、4:四半期、5:)で、Number分、Dateに加算
DateAdd(0, 3, "2020/6/9")  
//
DateAdd(1, 3, "2020/6/9")  
//

DateAdd(2, 3, "2020/6/9")  //

DateAdd(3, 3, "2020/6/9")  //無効

DateAdd(4, 3, "2020/6/9")  //四半期

DateAdd(5, 3, "2020/6/9")  //

Date

6/9/2023

6/30/2020
6/12/2020
6/9/2020

3/9/2021

9/9/2020

Date型同士の差

関数(引数)

内容

戻り値

DateDiff(Interval,
Start Date, End Date)

Interval(0:年、1:週、2:不明、3:日、4:四半期、5:月)を選択し、その基準でStart DateとEnd Dateの差を求める
DateDiff(0, "2020/6/09", "2021/6/21")  //年
DateDiff(1, "2020/6/09", "2021/6/21")  //週
DateDiff(2, "2020/6/09", "2021/6/21") //不明
DateDiff(3, "2020/6/09", "2021/6/21")  //日
DateDiff(4, "2020/6/09", "2021/6/21")  //四半期
DateDiff(5, "2020/6/09", "2021/6/21")  //月

Number

1

54

53

32572800


12

DateTime型とTIme型

DateTime型とTime型の加減算は、基本的にTimeSpan型で行う。

ToTime("10:12:00") + MakeTimeSpan(3, 2, 10, 10)

12:22:10 PM
Hours, Minutes, Seconds部分のみ加算(Days部分は消える)

 

日時関連

Local Timeの取得

日本で使うRPAであれば通常、日本のローカル時刻基準である「JST:Japan Standard Time」が設定されたコンピュータ上で動く。JST兵庫県明石市(UTC+9時間)を基準としたタイムゾーンである。JST:Tokyo Standard Timeと記載されることもある。

1.Utility - Date and Time Manipulation > UTC To Local

「Time Zone ID」入力項目に何もいれなければ、自動的に実行端末に設定されたローカル時刻が適用される

2.Now() + MakeTimeSpan(0,9,0,0)

タイムゾーンが複数存在し、それぞれの拠点でBlue Prismの端末を持つような場合には使用できない(日本:+9)

3.Today() & LocalTime()

秒数まで出力できない

UTC、Local Timeの取得関数

 

Date Time

Date

Time

UTC

Now()

なし

UTCTime()

Local Time

Today()

Today()

LocalTime()

 

FormatDate

関数(引数)

内容

戻り値

FormatDate
(Date,Format)

Dateの出力をFormat形式に変換

FormatDate( "2020/6/09", "yyyyMMdd")

FormatDate( "2020/12/19", "M-d-y")

FormatDate( "2020/12/19", "yyy-MMMM-dddd")

FormatDate( "2020/12/19", "yyy-MMM-ddd です")

※大文字Mは月(Month)、小文字mは0

MMMのように3つ重ねると英語略表記

MMMMのように4つだと英語フル表記

dddのように3つ重ねると曜日英語略表記

ddddのように4つだと、曜日英語フル表記

Text

20200609

12-19-20

2020-December-Saturday 

2020-Dec-Sat です

FormatDateTIme
(Date, Format)

FormatDate()に、時間情報を追加できる

FormatDate( "2020/6/09 10:12:30", "yyyy-MM-dd hh:mm:ss")

※時間のmは分(minute)

※大文字Hは24時間表記、小文字hは12時間表記(日本ではHを使うことが多い)

DateTime型

2020-06-09 10:12:30

dには、「日付(曜日)」の意味と「カスタム書式」としての意味を持っている。dについて

FormatDate関数において、dを2文字以上重ねた場合は日付や曜日、d1文字の場合は書式設定(M/d/yyyy)の意味となる。

f:id:zamdin:20200822102005p:plain

 FormatDate()、FormatDateTime()で指定できる書式文字列は、.Netフレームワークにおける書式指定と同様となる。

 

 [参考ページ]

<標準の日時指定書式文字列の一覧>

https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-date-and-time-format-strings

<カスタム日時形式文字列の一覧>

https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-date-and-time-format-strings

 

【Blue Prism】CSV出力とコレクション

Blue Prismには、CSV⇔コレクションの変換方法に似たような機能があったりして混乱するのでまとめ。

CSVファイル ⇒ コレクション

CSVファイルのデータをコレクションに格納する方法

Utility - File Management > Get CSV Text As Collection

非常に似ているアクション名に、

Utility - Strings > Get CSV As Collection

があるが、これはCSVテキストをコレクションに格納する場合に使用する(後述)

Utility - File Management > Get CSV Text As Collection

CSVファイルを直接コレクションに格納する。

f:id:zamdin:20200816171651p:plainf:id:zamdin:20200815142024p:plain

CSV File Path CSVファイルのフルパス
First Row Is Header 1行目をコレクションのフィールドとして設定するかどうか

指定したCSVファイルデータを直接コレクションに格納することが出来る。その際、取り込んだフィールドの型はBlue Prismが自動で型を推測して設定する。そのため、思っていた型にならないこともある(大抵、Text型になっていれば問題ないが、Number型としてフィールドが設定されてしまうと文字が取り込めなくなる)

また、取り込むCSVデータがカンマ区切りになってない場合、値が分割されず1つのフィールドにまとまって格納されてしまう。

メリット

CSVファイルを直接コレクションに取り込めるため楽

デメリット

・自動型推測が思った結果にならないことがある

CSVデータがカンマ区切りになっている必要がある

文字コードにより文字化けすることがある(Blue Prismでマルチバイトを扱う際はShift-JISでやり取りされるため、外部環境がUTF-8だと文字化けになる)

自動型推測がNumber型になりText型が取り込めない例

f:id:zamdin:20200821200128p:plain

f:id:zamdin:20200816191733p:plain

f:id:zamdin:20200821195712p:plain

カンマ区切りになっていない例

f:id:zamdin:20200815165929p:plain

1段目:カンマ区切り、2段目:空白区切り、3段目:タブ区切り

f:id:zamdin:20200816191733p:plain

f:id:zamdin:20200815165837p:plain

日本語が文字化けする例

f:id:zamdin:20200821202916p:plain

 f:id:zamdin:20200816191733p:plain

f:id:zamdin:20200821203023p:plain

 

CSVテキスト ⇒ コレクション

Utility - Strings > Get CSV As Collection

CSV形式のText型をコレクションに格納する。

f:id:zamdin:20200816171605p:plain

f:id:zamdin:20200815142048p:plain

CSV CSVテキストデータ。カンマ区切りで区切られている必要がある。
First Row Is Header 1行目をコレクションのフィールドとして設定するかどうか
Schema Filed名を記述したコレクションを指定することで、出力結果のフィールド名を自由に変更できる。実際のデータのフィールド数より少ない場合エラーとなるため、早期のエラー検知として機能する

Text型を指定するため、Utility - File Management > Read All Text from Fileを使い、CSVファイルをBlue PrismにText型として一度取り込む必要がある。

メリット

・カンマ区切りになってない、余計な空白や文字が入っている、といったCSVファイルをBlue Prismで編集した上でコレクション化できる

・Schema引数でフィールド名も指定できる

・Text型として取り込む際に文字コードを指定できるオブジェクトを使えば文字化けを回避できる

デメリット

CSVファイルから取り込む際は、CSVファイル ⇒ Text ⇒ コレクション、のようにひと手間かかる

f:id:zamdin:20200821202123p:plain

f:id:zamdin:20200816191733p:plain

f:id:zamdin:20200821202547p:plain

Utility - Strings > Get CSV Text As Collection の方を使う時

1.File Management > Get CSV As Collectionの自動型推測が思った結果にならない時

2.カンマ区切りでなかったり、最初に空白行などは入っているCSVデータの時

3.文字コードが適切でなく文字化けが起きる時

 

コレクション⇒ CSVファイル

Blue Prismには、コレクションをそのままCSVファイルに保存する機能はない

そのため、コレクション ⇒ Textデータ ⇒ CSVファイル

1.Utility - Strings > Get Collection as CSV

2.Utility - File Management > Write Text File

という手順が必要。

手順1.Utility - Strings > Get Collection as CSV

コレクションをCSV形式(カンマ区切り)のText型に変換

f:id:zamdin:20200816164438p:plain

f:id:zamdin:20200816185825p:plain

手順2.Utility - File Management > Write Text File

CSV形式のTextをCSVファイルに書き込む

f:id:zamdin:20200816190549p:plain

f:id:zamdin:20200816191016p:plain

 

f:id:zamdin:20200821204929p:plain

コレクション

f:id:zamdin:20200816191733p:plain

f:id:zamdin:20200821205005p:plain

Text型

f:id:zamdin:20200816191733p:plain

f:id:zamdin:20200821205017p:plain

CSVファイル

【Blue Prism】Global Send Keys , Global Send Key Events

Global Send Keys についてのまとめ。

Glabal Send Keys (グローバルキー送信)、Global Send Key Events(グローバルキーイベント送信)は共に、実際のキーボードからの入力と同じような動作をさせたい時に利用します。

Global Send Keys

ほとんどのアプリケーションで機能し、Key Eventsの上位レベル。まずはこっちを試すといい。 

Global Send Key Events

全てのアプリケーションで機能し、特にCitrixアプリケーションに推奨される送信方法。OSのキーボードのキーストロークを模倣する下位レベルのインターフェース。

使い方

  1. キー送信したいページやウィンドウを「Activate Application」する
  2. 入力欄を「Focus」する (Global Mouse Clickでも可)
  3. アプリケーションに対して「Global Send Keys」

f:id:zamdin:20200725210930p:plain

Global Send Keysは、実行中の全てのウィンドウの最上位になるようにアクティブにする必要がある。そのため、画面がロックやスクリーンセーバー中だと機能しない。

Focus か Global Mouse Click か?

キー送信する前には入力欄をフォーカスする必要がある。

ブラウザ系(IEChrome)⇒ Focus
アプリケーション系、領域 ⇒ Global Mouse Click

Global Mouse ClickはIEChromeなどのブラウザ系のスパイモードで取得した要素には存在しず、代わりにFocusが存在している。逆に、Win32、UIA、AA、UIAなどのアプリケーション系で取得した要素にはGlobal Mouse Clickは存在する。

各モードで使えるAction一覧は操作ステージのヘルプボタンを押せば確認できる。

f:id:zamdin:20200726110623p:plain

 

Ctrl + 〇  やHOMEなどの特殊キーの使用例

Key Glogbal Send Keys Global Send Key Events
SHIFT + {SHIFT}
CTRL ^ {CTRL}
ALT % {ALT}

例1."Blue Prism"と入力した後、"Ctrl + a"で全選択 ⇒ "Ctrl + c"でコピーする場合

f:id:zamdin:20200725212915p:plain

この時、Intervalに値が入っていると、下記のエラーとなる。 

f:id:zamdin:20200725213101p:plain

Internal : Failed to perform step 3 in Navigate Stage '検索ワード入力' on page 'Test' - Special characters (~{}+^%) are not supported in SendKeys if an interval value is provided. Separate calls can be used to send control characters.

Interval:1文字1文字を入力する間の間隔(秒数)

実際の手打ちのスピードを想定してIntervalを設定したい場合は、Global Send Keysを2つに分けるとうまくいく。

f:id:zamdin:20200725220612p:plain

f:id:zamdin:20200725220629p:plain

f:id:zamdin:20200725220647p:plain

Glogbal Send Keys "Blue Prism^a^c"
Global Send Key Events "<{SHIFT}b>{SHIFT}lue <{SHIFT}p>{SHIFT}rism<{CTRL}ac>{CTRL}"
< キー押し込み
キーを離す

これを用いて、<{SHIFT}b>とすれば、Bと送信される。Global Send Key Eventsでは、大文字を直接打ち込んでも機能しない感じ。

同様に、Ctrl + a ⇒ Ctrl + c は、<{CTRL}ac>{CTRL}で表される。

例2.Shiftの押しっぱなし

Glogbal Send Keys "+(blue prism)"
Global Send Key Events "<{SHIFT}blue prism>{SHIFT}"

例3.入力している文字を頭から20文字削除

Glogbal Send Keys "{HOME}{DELETE 20}"

Global Send Key Eventsで20回指定する方法は不明。。