データテーブルに列を追加するにはどうすればいい?
という疑問に答えて、Power Automate for desktopでデータテーブルに列を追加する方法をサンプルフローを使って解説します。
こんにちは。完全自動化研究所のこさいです。結構問い合わせのある内容ですね、これは。具体的な例を挙げながら考えていこうと思います。
下図のようなCSVファイルを読み込んで、データテーブルを作成します。この「SalesDetailData.csv」は675行あるので、[For each]アクションを使ってグリグリ操作するとなると、少し負荷があります。サンプルとしては軽すぎず、重すぎず、というところでしょう(10万件とかになると別次元になるので、この記事では触れません。データベースを使うべきでしょう)。
「SalesDetailData.csv」を使ったフローの概要を下に示します。「SalesDetailData.csv」からデータを取得し、データテーブル[CSVTable]に格納します。データテーブル[CSVTable]の最後の列の後に、[新しい列]という名前の新しい列を追加します。新しい列には値を書き込みます。
下図が列が追加されたデータテーブル[CSVTable]のイメージです。新しい列に「●」というテキストを書き込む条件は、列[SalesAmount]が1,000以下であることです。
Power Automate for desktopにはデータテーブルを操作するアクションが用意されていますが、列を追加するアクションは存在しません。UiPathと比べてデータテーブル関連が充実しているとは言えません。
この場合、3つの選択肢が考えられます。
それぞれの方法でフローを作ってみようと思います。どれも正解というわけではないし、他にも方法は考えられるので、参考程度にしてください。もっと良い方法があれば、コメントで教えてくれれば幸いです。
データテーブルやリストを駆使して何とかする
データテーブルやリストを駆使して何とかする方法を考えていきましょう。以下のようなフローが考えられます。
上記フローを解説します。最初にCSVファイルから取得したデータをデータテーブル[CSVTable]に格納します。次に新しいデータテーブル[NewTable]を作成します。データテーブル[NewTable]はデータテーブル[CSVTable]の全フィールド+[新しい列]を持っています。
データテーブル[NewTable]の型が出来上がったら、データテーブル[CSVTable]の件数分ループしながら、データテーブル[NewTable]に列を追加していきます。このループ中に[新しい列]に、値も入れていきます。
最後にデータテーブル[NewTable]をデータテーブル[CSVTable]に上書きします。これでデータテーブル[CSVTable]に列が追加されたように見える、というわけです。かなり手間がかかりますね…。
フローを解説
では、上記フロー図をPower Automate for desktopのフローで作った場合を見ていきましょう。
CSVデータをデータテーブル[CSVTable]に格納する
最初に「SalesDetailData.csv」からデータを読み取って、データテーブル[CSVTable]に格納します。「SalesDetailData.csv」はドキュメントフォルダー内に作成した[PAD]という名前のフォルダーに配置されているものとします。
実際にフローを作って確認したい方は以下のボタンからSalesDetailData.csvをダウンロードしてください(ダウンロードするにはユーザー登録(無料)が必要です)。
“SalesDetailData.csv” をダウンロード SalesDetailData.csv – 16 回のダウンロード – 61.04 KBSalesDetailData.csvの最初の行には列名が入っているので、[CSVファイルから読み取る]アクションの[最初の行に列名が含まれています]は[有効]にしてください。
新しいデータテーブル[NewTable]を作成する
CSVファイルから取得したデータをデータテーブル[CSVTable]が作成できたので、次に新しいデータテーブル[NewTable]を作成します。データテーブル[NewTable]はデータテーブル[CSVTable]の全フィールド+[新しい列]を持っています。
4ステップ目で新しいリスト[List]を作っています。このリストにデータテーブル[CSVTable]のヘッダー行(CSVTable.ColumnHeadersRow)を使って、リスト項目を追加します。これで、[CSVTable]が何列あるかを知らなくてもリストを作成できます。
さらに[新しい列]というリスト項目を追加します(8ステップ目)。リスト[List]が完成しました(上図の右側)。
9ステップ目でリストをデータテーブルのカラム名として、データテーブル[NewTable]を作成しています。^(ハット)を付けるとリストをカラム名として認識してくれます。
これで列が追加されたデータテーブルの枠ができました。現在のデータテーブル[NewTable]の様子は以下の図です。
新しいデータテーブル[NewTable]に行を追加する
データテーブル[NewTable]の型が出来上がったので、データテーブル[CSVTable]の件数分ループしながら、データテーブル[NewTable]に列を追加していきます。データテーブル[CSVTable]の値をデータテーブル[NewTable]に転記していく、ということです。加えて、このループ中に[新しい列]に、値も入れていきます。
[NewTable]を[CSVTable]に上書きする
最後にデータテーブル[NewTable]をデータテーブル[CSVTable]に上書きします。これでデータテーブル[CSVTable]に列が追加されたように見えます。
1行を追加するだけで大変な手間ですが、「それだけの価値がある」「どうしてもデータテーブルでデータを扱いたいんだ!」という場合はいいと思います。
データテーブル以外のツール(Excel)を使う
データテーブル以外のツールを使う方法を解説します。データテーブルを使うなら、Excelを利用した方がいいでしょう。ただし、Excelがインストールされている端末限定の方法になります。
上記フローを解説します。CSVファイルから取得したデータをデータテーブル[CSVTable]に格納します。ここまでは前出の方法と同じです。
ここから、新しいExcelドキュメントを作成し、そのドキュメントにCSVTableのデータを書き込みます。そして、一番最後の列の右側の1行目のセルに「新しい列」と入力します。こうすることで1列追加された表が出来上がり、この表を読み取ることで1列追加されたデータテーブルが生成される、というわけです。
最後にこのデータテーブルの[新しい列]に値を入れたら完成です。前出の方法と比べて、シンプルな方法ですね。
フローを解説
上記フロー図をPower Automate for desktopのフローで作った場合を解説していきます。
CSVデータをデータテーブル[CSVTable]に格納する
最初に「SalesDetailData.csv」からデータを読み取って、データテーブル[CSVTable]に格納します。ここまでは前出の方法と同じです。
新しいExcelを使って列を追加する
[Excelの起動]アクションを使って、新しいExcelドキュメントを作成し(Excelインスタンスは表示する必要はありません)、データテーブル[CSVTable]の内容を書き込みます。
1番最後の列の右側の1行目のセルに「新しい列」と入力します。こうすることで1列追加された表が出来上がります。この表を読み取ると、1列追加されたデータテーブルの出来上がり、というわけです。データテーブル名を[CSVTable]とすることで、上書きされます。
ここまでいったら、Excelはこれ以上必要ないので閉じます。
新しい列に値を書き込む
最後にこのデータテーブル[CSVTable]の[新しい列]に値を入れたら完成です。データテーブルの件数分ループしながら、[SalesAmount]が1000以下の列に「●」を入れていきます。
データテーブルやリストを駆使して列を追加する方法よりシンプルかつ柔軟性があり、600件近いデータ件数がある場合、高速で動作します。「Excelが必要」「Power Automate for desktopだけで操作したことにならない」という点を除くと、こちらの方法がよいと思います。
データテーブルをあきらめる
最後にもう1つ方法を解説します。データテーブルをあきらめてカスタムオブジェクトを使う方式です。正確にはJSONを利用して文字列を加工し、JSONをカスタムオブジェクトに変換することで、列を追加する方式です。わかりにくいので、フロー図を使ってもう一度解説します。下図をご覧ください。
最初にPowerShellスクリプトを使って、CSVファイルからJSON形式でデータを取得します。このJSON形式のテキストが格納された変数を[Json1]とします。[Json1]を編集し、[新しい列]を追加します。テキストなので加工が簡単なので、この方式を採用しています。
加工後の[Json1]をカスタムオブジェクトに変換し、後はデータテーブルの時と同様に[新しい列]に値を書き込みます。
この後のフローでカスタムオブジェクトのデータを使うだけなら、この方法でも十分ではないでしょうか?このカスタムオブジェクトのデータをCSV形式やExcelドキュメント形式で出力する、となってくるとデータテーブルでデータを扱った方が便利ですが。それではフローを見てみましょう。
フローを解説
上記フロー図をPower Automate for desktopのフローで作った場合を解説していきます。
変数の設定
CSVファイルのパスを変数[csvfilename]に格納します。このあと使います。
CSVデータをカスタムオブジェクトに変換する
[PowerShell スクリプトの実行]アクションを使って、CSVデータをJson形式で読み込みます。このアクションの解説は後ほど行います。このJSON形式のテキストが格納された変数を[Json1]とします。Json形式のテキストは加工が簡単です。[Json1]を編集し、[新しい列]を追加します。
完成したJson形式のテキストをカスタムオブジェクトに変換するというフローです。
[PowerShell スクリプトの実行]アクションの[実行するPowerShell コード]は以下のように記述します。
Import-CSV %csvfilename% -Encoding Default | ConvertTo-Json
CSVデータを読み込んでJson形式に変換してくれます。アウトプットされるデータは[生成された変数]に入るので、[Json1]とします。この変数の中身を確認すると、下図のようになります。
[新しい列]という列を追加するには、「},」というテキストを下図のように置換すればいい、というわけです。
[テキストを置換する]アクションでテキストを置換すると、下図のように新しい列が出来上がっているのがわかります。
[JSONをカスタムオブジェクトに変換]アクションを使って変換すると、下図のようにカスタムオブジェクト[Cobj1]ができます。[詳細表示]をクリックして0行目を確認すると、図の右側のように[新しい列]という項目が作られていますね。
新しい列に値を書き込む
後はデータテーブル以外のツール(Excel)を使うと同様に、このカスタムオブジェクトの[新しい列]に値を入れたら完成です。カスタムオブジェクト[Cobj1]の件数分ループしながら、[SalesAmount]が1000以下の場合は「●」を入れていきます。
まとめ
Power Automate for desktopにはデータテーブルを操作するアクションが用意されていますが、列を追加するアクションは存在しません。列を追加したい場合に対応するケースとして、3つの選択肢を考えました。
それぞれの方法でフローを作ってみました。2番目のデータテーブル以外のツール(Excel等)を使うという方法がデータテーブルやリストを駆使して列を追加する方法よりシンプルかつ柔軟性があり、高速で動作するので、「Excelが無いと動かない」「Power Automate for desktopだけで操作したことにならない」という点を除くとよい方法だと思います。どうしても、「Power Automate for desktopだけ」にこだわる方は1番目の方法になります。
3番目の方法はデータテーブルに列を追加したわけではないので「ずるい」方法ですが、Power Automate for desktopの開発者たちは、データテーブルはそこまで重要視していなさそうで、むしろカスタムオブジェクトを使ってほしいのじゃないかな?と思うので、あえて入れました。目的が達成できればOK、という場合は、データテーブルにこだわらず、カスタムオブジェクトやJSONも視野に入れてフローを組むといいのではないでしょうか。
この他にも方法はあると思います。もっと良い方法があれば、コメントで教えてくれれば幸いです。それでは!
コメント ログインすると書き込めます