概要
Power Automate Desktopで DataTable を扱う際、「必要な列だけを取り出したい」というケースがあります。
ただし、PAD の標準アクションでは「列の削除」は可能なものの、不要な列を1つずつ削除していく必要があり、列数が多い場合はループ処理が煩雑になりがちです。
本記事では、「.NET スクリプト実行(VB.NET)」アクションを利用して、Datatableから特定の複数列をまとめて抽出する方法を紹介します。
※Power Fxを有効化した状態で説明しています。
やりたいこと
たとえば、以下のような DataTable があるとします。
- 0列目:社員番号
- 1列目:氏名
- 2列目:部署
- 3列目:メールアドレス
このとき、1列目 と 2列目 だけを取り出して、新しい DataTable として保持したい、というイメージです。
実装概要
「.NET スクリプト実行」アクションを使用し、言語には「VB.NET」を指定します。
本実装では、以下を行います。
- 抽出対象の列インデックス文字列を分割し、列番号の一覧を作成する
- 指定された列だけを持つ新しい DataTable を作成する
- 元の DataTable の各行から、必要な列の値だけを新しい DataTable にコピーする
この方法を使うことで、不要な列を削除していくのではなく、必要な列だけを新しい DataTable として作成できるため、処理をシンプルにできます。
'--------------------------------------------
' strKeepIndexes に「残したい列のインデックス」を ; 区切りで渡す想定
' 例: "0;2;5" → 0列目, 2列目, 5列目を残す
'--------------------------------------------
' 残す列インデックスを格納する List
Dim indexes As New System.Collections.Generic.List(Of Integer)
' 文字列を ; で分割して1つずつ処理
For Each s As String In strKeepIndexes.Split(";"c)
' 空文字や空白だけの要素は無視
If s.Trim() <> "" Then
' "2" などの文字を Integer に変換して List に追加
indexes.Add(System.Int32.Parse(s.Trim()))
End If
Next
'--------------------------------------------
' 出力用の DataTable を新規作成
'--------------------------------------------
Dim dt As New System.Data.DataTable()
'--------------------------------------------
' 1) 出力DataTable(dt) に「残す列」だけ作成する
' dtInput から列名と型(DataType)を引き継ぐ
'--------------------------------------------
For Each idx As Integer In indexes
dt.Columns.Add(dtInput.Columns(idx).ColumnName, dtInput.Columns(idx).DataType)
Next
'--------------------------------------------
' 2) dtInput の各行を走査して、残す列だけコピーする
'--------------------------------------------
For Each row As System.Data.DataRow In dtInput.Rows
' 出力用DataTable(dt) の新しい行を作成(まだ dt には追加されない)
Dim newRow As System.Data.DataRow = dt.NewRow()
' indexes に入っている「残す列」だけを順番にコピー
' ※ newRow(i) は出力側の i列目(0~)を意味する
For i As Integer = 0 To indexes.Count - 1
' 入力行 row の「指定列(indexes(i))」の値を、出力行 newRow の i列目へ
newRow(i) = row(indexes(i))
Next
' 作成した行を出力DataTableに追加
dt.Rows.Add(newRow)
Next
'--------------------------------------------
' 最終結果を dtOutput に返す
'--------------------------------------------
dtOutput = dt
スクリプトパラメーター設定
以下のように 入力値(In)と出力値(Out)を設定します。
入力値(In)
-
dtInput
抽出元となる DataTable -
strKeepIndexes
抽出したい列インデックスを ; 区切りで指定した文字列
例:1;2
出力値(Out)
- dtOutput
抽出後の DataTable
実行イメージ
たとえば、元の DataTable の列構成が以下だったとします。
- 0列目:社員番号
- 1列目:氏名
- 2列目:部署
- 3列目:メールアドレス
この状態で strKeepIndexes "1;2"を指定すると、出力される dtOutput には、次の2列だけが含まれます。
- 氏名
- 部署
また、strKeepIndexes の指定順がそのまま出力列の順番になるため、"2;1"と指定すれば、出力列も 部署 → 氏名 の順になります。