【UiPath】逆引き


フォルダ内のファイル一覧取得

アクティビティ無し。System.IO.Directory.GetFiles を使う。
参考:Directory.GetFiles メソッド (System.IO) | Microsoft Docs

サンプル
System.IO.Directory.GetFiles("C:\test")

' フィルタ指定。*と?が使用できる
System.IO.Directory.GetFiles("C:\test", "*.xlsx")

' サブフォルダを含めるかどうかの指定
System.IO.Directory.GetFiles("C:\test", "*.xlsx", System.IO.SearchOption.AllDirectories)

パスワード付きzipファイルの解凍

.NET、UiPathに用意されている機能では扱えないので、ほかのツール(7zip)を使う。

PCに7zipをインストールする。
(コマンドラインが使用できて、パスワード付きの解凍ができるツールであればなんでも良い)

コマンド実行して解凍する。実行方法は後述の「コマンドを実行して終了を待つ」参照。

C:\test\test.zipをパスワード123456を使ってC:\testへ解凍する例。

コマンド例
"C:\Program Files\7-Zip\7z.exe" x C:\test\test.zip -oC:\test -p123456

コマンドを実行して終了を待つ

「プロセスの開始」(StartProcess)は非同期なので、コマンド実行中でも後続のフローがさっさと進んでしまう。
代わりに「PowerShellを呼び出し」を使い、PowerShell内でStart-Process -Waitを使う。

参考:UIPathでPowerShellを実行する方法 - Qiita

まず実行するps1ファイルを用意して、プロジェクトフォルダ内に保存する。

7zip実行.ps1
Param(
     [string]$zipPath
    ,[string]$destDir
    ,[string]$password
)

$exePath = "`"C:\Program Files\7-Zip\7z.exe`""

$args = @("x", "`"${zipPath}`"", "-o`"${destDir}`"", "-p${password}")

Start-Process -FilePath $exePath -ArgumentList $args -Wait

UiPath側でps1ファイルを読み込み、「PowerShellを呼び出し」で実行する。

「PowerShellを呼び出し」アクティビティのプロパティのうち、「スクリプト入力」にチェックを入れ、スクリプトに渡すパラメータは「パラメーター」に指定する。

DataTable の DataType を変更する

現象

「CSVを読み込み(ReadCsvFile)」で読み込んだ DataTable は、列の DataType が全て String 型になる。
Excel の「範囲を読み込み(ExcelReadRange)」で読み込んだ DataTable は、列の DataType が全て Object 型になる。

同じ名前の列名が両者に存在し、DataTypeが異なる場合、「データテーブルをマージ」で合体させようとしても、DataType の不一致でエラーになる。

↓エラーメッセージ

データ テーブルをマージ: .列名 と .列名 は競合するプロパティがあります : DataType プロパティの不一致

DataType を揃えれば良いのだが、データがある DataTable に対して DataType の変更はできない。

解決策1

UiPath Connect で公開されているコンポーネントを利用する。
Datatable - Change Column Datatype - RPA コンポーネント | UiPath Connect

解決策2

元の DataTable のスキーマを元に新しい DataTable を作成し、DataType を変更してから元データをインポートする。
…という処理を「コードを呼び出し」に実装する。

DataTypeをObjectへ変える例
out_table = in_table.Clone()

For Each column As DataColumn In out_table.Columns
    column.DataType = GetType(Object)
Next

For Each row As DataRow In in_table.Rows
    out_table.ImportRow(row)
Next

↓引数の設定

名前 方向
in_table 入力 DataTable DataTable型の変数を指定
out_table 出力 DataTable 上記と同じ変数を指定

Json を扱う

参照設定にUiPath.Web.Activitiesが必要。

Json.NETが使われている。