Power Automate for desktop「PowerShellスクリプトの実行アクションからCSVデータテーブルを操作する」

## Introduction

Power Automate for desktopでCSVデータテーブルを操作する場合、EXCELファイルに変換し「SQL ステートメントを実行する」アクションで操作することができます。しかしデータテーブルに「007」「008」のような数値をテキストとして扱いたい列を含むときはEXCEL変換時、数値に変更されてしまうため困ることがあるかもしれません。

そこで「PowerShellスクリプトの実行」アクションを使ってCSVデータテーブルを操作するフローを紹介します。PowerShellは直接CSVファイルを読み込むことができ、SQLのようにデータテーブルの操作が可能です。今回は「007」「008」のようなテキストとして扱いたい列を維持しながら日付列を操作します。

![CleanShot 2022-08-27 at 16.06.30@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/31229272-e477-b1a9-0d6e-f8f8d93ad3f1.png)

sample.csv

```csv
RowID,Name,TextValue,Created,Modify
dd3341fb-bb89-ec11-93b0-000d3a40692d,AZX,00765,2022/02/09 15:21,2022/02/09 15:21
1cdf548a-8468-ec11-8943-000d3a40fca2,XZZ,0345,2021/12/29 8:51,2021/12/29 8:51
ef162ef4-8468-ec11-8943-000d3a40fca2,XZy,0385,2021/12/29 8:54,2021/12/29 8:54
d007bc9b-0967-ec11-8f8f-002248622feb,MVS,0787,2021/12/27 11:39,2021/12/27 11:39
236685ce-0967-ec11-8f8f-002248622feb,PAD,00888,2021/12/27 11:40,2021/12/27 11:40
```

Modify列の日付を操作します。

![CleanShot 2022-08-27 at 16.09.08@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ab3677f6-25d2-6864-43dc-f2a8b13557f5.png)

## Note

- 自己責任でお願いします。
- Windows 10 Pro 21H2
- Power Automate for desktop 2.23.114.22217
- 2022年8月の情報です。

## Flow Description

デスクトップにsample.csvを作っておきます。このフローでは一時ファイルを作成し、PowerShellスクリプトの実行アクションでデータテーブルを操作、一時ファイルに書き出すところがポイントです。

![CleanShot 2022-08-27 at 17.55.26@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/e2e569f1-d77f-4028-8f65-ba9bdbf45635.png)

1. Get special folder
   デスクトップフォルダーを取得します。
2. Get temporary file
   一時ファイルを生成します。

   ![CleanShot 2022-08-27 at 17.57.20@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/82638889-1760-2b07-d747-0139785677e8.png)


3. Run PowerShell script
   PowerShell scriptを実行します。一時ファイルに書出時 -NoTypeInformationを忘れないようにします。

   ![CleanShot 2022-08-27 at 17.59.02@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/c53fef0c-6c8f-4c55-704d-ec1afdd9e5a8.png)


```ps1:PowerShell
# CSVを読み込み
$datatable = Import-Csv "%SpecialFolderPath%\sample.csv" -Encoding utf8
# Modify列をdatetimeオブジェクトに変更
$datatable | ForEach-Object{$_.Modify = [datetime]($_.Modify)}
# Modify列の値に＋7日
$datatable | ForEach-Object{$_.Modify = ($_.Modify).AddDays(+7)}
# 一時ファイルにデータを書き込み
$datatable | Export-Csv -Path "%TempFile%" -NoTypeInformation -Encoding utf8
```
⒋ Read from CSV file
   Tempファイルからデータを読み込みます。
   ![CleanShot 2022-08-27 at 18.02.47@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/6ba1eabf-547c-e086-5ebe-59ce767393b1.png)


## DateTime Manipulation Options

参考 [DateTime Struct](https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime?view=net-6.0)
今回使用した[DateTime.AddDays(Double) Method](https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime.adddays?view=net-6.0)の他にも日時操作に関するメソッドが多数用意されています。

![2022-08-26-01-32-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8b53fb6b-c154-c009-d35b-9e0e1e11a692.png)


たとえばToStringメソッドを利用することで書式を変更できます。

![CleanShot 2022-08-27 at 18.11.30@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/67b79674-1260-81e1-20db-f01605552356.png)

![CleanShot 2022-08-27 at 18.10.14@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7e92082f-bdc3-7def-12eb-76d320df28c5.png)


![](2022-08-26-01-27-13.png)

## Data Table Operations

Select-Objectで列を選択したりWhere-Objectを利用することで値をフィルターできます。

![2022-08-27-18-16-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9c52f88d-515d-cae5-5473-953d03fd39ba.png)


![CleanShot 2022-08-27 at 18.17.25@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/37aa9b7a-6783-5e84-dcd6-4b1f8c27be8e.png)

参考

- [Selecting Parts of Objects (Select-Object)](https://docs.microsoft.com/ja-jp/powershell/scripting/samples/selecting-parts-of-objects--select-object-?view=powershell-7.2)
- [Removing Objects from the Pipeline (Where-Object)](https://docs.microsoft.com/ja-jp/powershell/scripting/samples/removing-objects-from-the-pipeline--where-object-?view=powershell-7.2)

## Conclusion

「PowerShellスクリプトの実行」アクションを使用することで、テキストとして扱いたい列を維持しながらCSVデータテーブルを操作しました。今回は一時ファイルを利用しましたが、データによってはJSONで出力した方が便利な時もあります。
[Power Automate for desktop「最初に知りたかったデータテーブルの扱い方」](https://www.syszero.net/post/padcsv/)

今回の記事はMicrosoft Power Automate Community Forumの質問をネタに書きました。
細かな使い方ですが便利だと思います！

[CSV to PAD Table - How to query table using sql? Loops to change column data takes way to long.](https://powerusers.microsoft.com/t5/Power-Automate-Desktop/CSV-to-PAD-Table-How-to-query-table-using-sql-Loops-to-change/m-p/1724284#M17265)