自分へのメモ BluePrism ファイルのコピー(拡張子を指定してコピー)
Utility - FileManagementを使ったファイルコピーの簡単なサンプル。
プロセス
SrcDirにあるExcelファイル「*.xlsx」、Wordファイル「*.docx」をSrcDirにコピーしています。
Utility - FileManagement Get Files
フォルダをダ指定して、その中にあるファイルのリストをコレクションとして返します。
★INPUT
Folder:対象のフォルダ
Pattern CSV:カンマで区切ったワイルドカードでの指定
Pattern CSVには「*.xlsx,*.docx」と指定しています。
すべてのファイルを取得したい場合は「*」または「*.*」を指定。
★OUT
Succes:成功したかどうかのFlag
Message: 失敗の場合のエラーメッセージ
Files:指定したフォルダでPattern CSVにマッチしたファイルのリスト
Filesには、
・Path (フォルダ+ファイル名)
・Folder(フォルダだけ)
・Name(ファイル名だけ)
・Extension(拡張子だけ)
・Read Only (読み取り専用かどうか)
・Bytes (Byte数)
のほか、作成日時、更新日時などの情報が含まれています。
サンプルにはないですが、Successはチェックしたほうがいいですね。
取得したFilesコレクションをループでまわしてコピーします。
Utility - FileManagement Copy File
FilePath:ファイルのフルパス(Get Filesで取得したFilesのPathを指定)
Destination Path:コピー先のディレクトリを指定
GetFoldersというアクションでフォルダ配下のサブフォルダのリストも取得できます。
しかし、サブフォルダ配下を含めてフォルダ丸ごとコピーをワンアクションでやってくれるアクションはなさそう・・・
自分へのメモ BluePrism Clipboard操作とExplorerのアドレスバーの操作
Clipboard関連のアクションはこちらにあった。
Utility - Environment::Set Clipboard クリップボードに値を設定
Utility - Environment::Get Clipboardクリップボードから値を取得
Utility - Environment::Clear Clipboard クリップボード
で、やりたかったのはExplorerのアドレスバーにフォルダのフルパスを入力してそのフォルダに移動すること。
(このアドレスバーが厄介で書き込み可能なものとしてSpyできなかった・・・やり方の問題?!)
実装方法の一つとして、以下のやり方でできた。
①アドレスバーを右クリック
②出てきたメニューからアドレスの編集を選択
⇒ アドレスバーが編集可能状態になる
③Utility - Environment::Set Clipboardでクリップボードにフォルダのフルパスを設定
④Global Send KeyでCtr+vを送り、アドレスバーにクリップボードを張り付け&Enterで目的のフォルダに移動。
オブジェクト アクション例
global Send Keyのテキストは
"^v"
"{ENTER}"
自分へのメモ BluePrismでZIPファイルを解凍する(powershellを使う)
BluePrismでZIPファイルを解凍したい。
powershellでいけそうだ。
powershellでコマンドを起動するには、Utility - Environment のRun Process Until Endedがよさそう。
Application⇒powershellの場所を指定
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
Arguments⇒powershellのコマンドを指定
"Expand-Archive -Path c:\Study\data.zip -DestinationPath c:\Study\work -Force"
自分へのメモ BluePrismでZIPファイルを解凍する(&コードステージを使う前準備)
blueprismでZIPファイルを解凍したい。
アプローチはいろいろありそうだけど、コードステージを使ってやってみた。
'圧縮
System.IO.Compression.ZipFile.CreateFromDirectory()
'解凍
System.IO.Compression.ZipFile.ExtractToDirectory()
こちらのページによると、
ZipFile Classは
- Namespace:
- System.
IO. Compression
- Assemblies:
- System.IO.Compression.ZipFile.dll, System.IO.Compression.FileSystem.dll, netstandard.dll
とのこと。
そんなわけで、オブジェクトの初期化ページのこの部分をダブルクリックし、
外部参照にAssenbliesに記載のDLL、名前空間にNameSpaceを指定する。
(そういうことだったのか・・・)
オブジェクト自体はとても簡単で
System.IO.Compression.ZipFile.ExtractToDirectory( _
File, _
ExtractPath)
File⇒解凍したいZIPファイルを指定
ExtractPath⇒解凍先を指定
(本当に標準VBOとしてないんだろうか・・・?File Managementあたりにあってもいいんじゃないだろうか・・・)
自分へのメモ Key、ValueのConfigファイルを読み取り、Collection.Keyの形式でValueを扱えるようにする
こちらのブログを参考にさせていただいて、
こんな感じのKey、Valueの表から
以下のような、Keyをカラム名にしたCollectionに変換するオブジェクトを作ってみた。
Keyをカラム名とした1行のCollectionに変換することで、[Collection.Key]の形式でValueを取得することが可能。
作成したオブジェクトはこちら。
Collection ManipulationのAppend Field、Append Rows to Colletionは曲者っぽい。
先ほどのブログで詳しく解説されているけど、Collectionの初期化処理を行うことで魔法のように動的なCollection作成が可能になる~!
自分へのメモ BluePrism InernetExplorerでファイルをダウンロードして保存する
IrnetExplorerでファイルをダウンロードして保存するサンプルを作ってみた。
#試行錯誤中です。
サンプルの内容
IneternetExplorerで「~を開くか、または保存しますか?」の表示が出ている状態から、「名前を付けて保存」を実施する。
プロセス
(Attach省略していますが、実際にはAttachが必要)
アプリケーションモデラー
InternetExplorerを定義する。
以下を参考にすると、それまで操作していた画面とは別途定義したほうがよさそう。
保存ボタンなど、それぞれのパーツもWin32またはUIオートメーションモードでスパイ。
(このあたりがよくわからない。どういう場合にどのモードがいいのか、いければどちらでもいいのか)
ダウンロードの通知のところ
保存ボタンの右の▼
名前をつけて保存
名前を付けて保存Window
名前を付けて保存の確認ダイアログ
同名のファイルがある場合に表示される
そのOK
ダウンロード後の通知の「ファイルを開く」ボタン
※ダウンロードの完了を検知するために待機ステージで使用
×ボタン
プロセスについて
・ほとんどの操作は要素に対してGlobalMouceClick(Centre)
・それぞれのダイアログやWindowが表示されるのにちょっと時間がかかるようで、それぞれの待機末ステージを入れたほうがよさそう。
・AttachするWindowTitleと保存先をパラメータにすれば共通的につかえるようになるんでは
自分へのメモ BluePrism ブラウザのAttachがうまくいかない
InternetExploreでAttachしたいだけなのにはまってしまった。
IEを立ち上げてとあるURLにアクセス。
それからWindow Titleを指定してAttachしてみるとエラー。
「内部 : ページ 'アクション1' の操作ステージ 'Attach'でステップ1を実行できませんでした - 複数のアプリケーションが基準に一致しました」
タブは一つだけなのに・・・なぜ・・・!
タスクマネージャで見てみると、確かにiexplorerのプロセスが二つある。
わかったこと
・IEはタブを増やすとプロセスも増える(でもタブ1つなら2プロセス、でもタブ2つでも2プロセスの時もある。よくわからない)
・ブラウザ自動化ガイド(BROWSER AUTOMATION GUIDE (JAPANESE))にこんな記載あり「IEはプライマリで起動されたプロセスから生成された別のプロセスで実行できる機能があるのでアタッチが困難になる場合がある(やっぱりトラップあるんだ!)
回避策として以下がある「Child Indexを使う」「TabProcGrowthを使う」
さらに、いつもお世話になっているサイトにズバリの記事を発見。
ひとまずはChild Indexに0を設定することでひとまずのAttachはうまくいきそうな予感。
さらに、上記ブログに言及があるけど、Child Indexに0以外を指定すれば2番目、3番目のタブを操作できるかと思いきや、HTMLモードでスパイできなくなり、焦った!
自分へのメモ BluePrism MS Excel VBOでシートの削除・移動 Delete WorkSheet/Move WorkSheet
明日のために夜な夜な調べ物をするブログです。
BluePrism MS Excel VBOでシートの削除・移動行うサンプルです。
シートの削除 Delete WorkSheet
サンプルプロセス
Sample1.xlsxから「SheetB」シートを削除します。
Delete Worksheet
入力
handle⇒いつもの
Workbook Name⇒削除対象のファイル名。入力しない場合はそのときアクティブなWorkbookが対象になる。
Worksheet Name⇒入力しない場合はそのときアクティブなシートが対象になる。
存在しないシート名を指定した場合は、Exceptionが発生します。
シートの移動 Move WorkSheet
いわゆる「シートの移動またはコピー」です。
サンプルプロセス
Sample1.xlsxの「SheetB」シートをSample2.xlsxの2番目にコピーします。
Move WorkSheet
入力
Handle いつもの
Source Workbook コピー元のファイル名
Source Worksheet コピー元のシート名
Destination Workbook コピー先のファイル名
Destination Position コピー先のファイルの何番目に挿入するか(1始まり)
Copy ⇒ The true or false flag to decide if the moved worksheet will be copied.True: コピー(元ファイルにシートを残す)Flase:移動(元ファイルにシートを残さない)
ちなみにSource WorkbookとDestination Workbookに同じファイルを指定してCopyをTrueにすると、シート名(2)のようにシートが追加されます。
Rename WorkSheetはないんだね・・・!
自分へのメモ BluePrism Excelをオブジェクトとして操作する ジャンプ・範囲選択・並べ替え
Blue Prism Learning Editionのライセンス期間中に夜な夜な調べ物をしているブログです。
Excelをオブジェクトとして操作するサンプルその②を作ってみました。
試行錯誤中なので、たどり着いた方は参考程度でお願いしたく・・・
サンプルでやりたいこと
Excelの中にある表のデータを並べ替えしたい。
どうなんでしょう・・・MS Excel VBOを拡張してやるのがいいんでしょうか?
それともExcelをオブジェクトとして操作するのがいいんでしょうか?
とりあえずこのサンプルではExcelをオブジェクトとして扱って実現しています。
オブジェクト
Attach ⇒ Windowを最大化 ⇒ ジャンプ(Ctl+G)指定したセルに移動 ⇒ 表を選択 ⇒ メニューのデータ/並べ替えで並べ替えを実施⇒A1に戻っって終了です。
Windowを最大
WindowはExcelのアプリケーション全体をWin32モードでスパイした要素になります。
最大化した理由ですが、のちにメニューからデータ、並べ替えを選択した際、「並べ替え」のメニューがWindow内に見えていないと、操作に失敗するため、事前に全画面にしています。Spyの仕方で回避できるんでしょうか??
↓画面が小さすぎで「並べ替え」がなくて操作に失敗した例
ジャンプ(Ctl+G)
今回操作するExcelは「B2:C9」に表があるため、B2に移動したいです。
「B2」セルを要素としてグローバルマウスクリック(中央)のアクションを実施した場合、B2セルがWindowの表示範囲内にあればうまく動きましたが、表示範囲外にある場合、エラーが発生しました。
というわけでジャンプでセル移動。
Global Send Keyではうまくいかず、Global Send Key Eventでうまくいきました。
Excelでショートカットキーの送信は全般的にGlobal Send Key Eventならうまくいく感触です。
ジャンプWindowの参照先を設定
ジャンプWindowの参照先(R):の既存の値を消去して、移動したいセル”B2”を設定します。
ここもGlobal Send Key Eventです。
Writeステージを使えそうですが、なぜかことごとくうまくいきませんでした。
なぜ・・・?
Global Send Key Event(グローバルキーイベント送信)の値は
いっこめ:"{Delete}"
にこめ:"B2"
ジャンプWindowのOKボタン押下
Ctl+Aで表を選択
Global Send Key Eventで"<{CTRL}A>{CTRL}"。
メニューの「データ」をクリック
「並べ替え」をクリック
最優先されるキークリック
最優先されるキー年齢の右にある▽をクリック
最優先されるキーを選択
最優先されるキーのプルダウンは、UIA名をDynamicとして定義。
グローバルマウスクリック(中央)のパラメータでソートキーにする「年齢」を設定。
並べ替えOK
A1に戻る Ctl+Home
最後もGlobal Send Key Eventで"<{CTRL}{Home}>{CTRL}"です。
自分へのメモ BluePrism CSVファイルのデータをCollectionに入れる
CSVファイルからデータを取得してCollectionに格納するやり方はいくつかパターンがありそうなのでサンプルを作ってみました。
その① File Management::Get CSV Text As Collection
入力パラメータ
CSV File Path ファイルのパス
First Line Is Header Trueにすると1行目をヘッダと認識し、1行目の内容をCollectionのカラム名に設定してくれます。
出力パラメータ
CSV Values 格納するCollection名
結果
このアクション、CSVファイルがSJISだとうまくいきますが、UTF8など別の文字コードだと文字化けしました。
その② File Management::Read All Text from File ⇒ Utility-Strings::Get CSV Text As Collection
File Management::Read All Text from Fileで一度ファイルから読み込んで文字列にしてから、Utility-Strings::Get CSV Text As CollectionでCollectionに格納しています。
このやり方の場合、元のファイルはUTF8だと文字化けせずいけました。
その③ MS Excel VBO :: Get WorkSheet As Collection
MS Excel VBOはCSVファイルも行けるようです。
SJISじゃないと文字化けしました。