ロボットにアプリケーションへのデータ登録作業をさせる場合、人間が後で作業結果を確認できるよう
作業の前後それぞれのスクリーンショット(画面コピー)を撮って保存する必要があると思います。
よくあるのが、Excelの申請書に沿ってデータ登録させたら
- PrtScキーでスクリーンショットを撮って
- Excel申請書ファイル自体にシート追加して
- Ctrl+Vでシートにスクリーンショット貼り付けて
- Excel申請書を履歴フォルダに保管
ですが、UiPathは意外とコレに苦戦する!
詳細を説明します。
1.UiPathでのスクリーンショットの撮り方
Send HotkeyでPrtScキーを送り込んで終わりでしょ?
じゃないんだよね、Send HotkeyにPrtScが無いから・・・
その代わり、Take Screenshotという直球のアクティビティがあるんだけど
これだとクリップボードに保持してくれないのでCtrl+Vで貼り付けられない。
Outputの型は"Image"だから、Save Imageアクティビティで画像ファイルとしてしか保存できない。
Excelに貼り付けたいんだよね…良いやり方がないか調べてみました。
Invoke Method
一番スマートなのがInvoke Methodで SendKeys.SendWait メソッド を呼ぶ方法。
TargetTypeはSystem.Windows.Forms.SendKeysなので、プルダウンの[Brows For Types...]から検索。
プロパティのParametersで"{PRTSC}"を指定すれば、PrtScキーを送り込んで
アクティブな(=最前面の)アプリケーションのスクリーンショットを撮ってくれます。
※画面全体のスクリーンショットが欲しい場合は"^{PRTSC}"のように、先頭に^を付けます。
スクリーンショット取得アプリの利用
Snipping Toolとか、Capture XPとかWinShotとか世の中に山ほどスクリーンショット取得アプリがあるので、
それを起動して撮るのも1つ・・・というかコッチの事例の方が多数派かもしれない。
(プログラマーじゃない人にInvoke Methodを使えよって言ってもね…)
Take Screenshot + Clipboard.SetImage
hanageroidoさんのアドバイスによる第三の案。
最初にTake Screenshotアクティビティは"Image"を返すだけでクリップボードに入れてくれない
という話をしましたが、だったらClipboard.SetImageでクリップボードに入れてしまえ、というもの。
Invoke methodでTargetType = System.Windows.Forms.Clipboard、MethodName = SetImage
パラメータの型はSystem.Drawing.Imageで、ValueにはTake Screenshotから受けたImage変数。
これでクリップボードに入るので、Ctrl + Vで貼り付けられるようになりました。
2.Excelにシート追加
Add Excel Sheetアクティビティもありそうで無いんだよね…
Shift + F11でシート追加
ベタですが、Excelのショートカットキーでシート追加。シート名を指定できないのが欠点。
後はCtrl + Vでスクリーンショットを貼り付けて、Save Workbookでシート保存すれば完了。
Invoke Method
シート名まで指定して追加したい場合はInvoke Methodで
Excel.WorkbookApplication.SetSheet(String sheetName, Boolean createNew)
を呼ぶ。
(xlsWorkbookはExcel申請書のWorkbook変数)
Parametersの1つ目はシート名、2つ目はTrueにすれば新規シート追加。
シート追加の後は同様にCtrl+Vして、Save Workbookで保存。
今回はここまで。
UiPathは意外と痒いところに手が届かず、Invoke Method頼みなところがあるんだよね…
Continueのように気づいたら追加でアクティビティ実装されてたりすると嬉しいんだけど。
※去年までは「なんでBreakはあるのにContinueが無いんだ!」と世界中でツッコまれてました。