今回は、集計作業の効率化として、複数のcsvファイルを1つのエクセルファイルに登録するフローをPower Automateで作成します。作業場はOneDrive上になりますが、無料で実装できます。
準備
マイクロソフトアカウントさえあれば、実行可能です。エクセルも不要です。
環境やサインインなどに関しては、前回の無料RPAで作業効率化!Microsoft Power Automateを参照してください。
集計Excelブック作成
フロー上、集計するxlsxファイルには、”テーブル”を作成しておく必要があります。Excel Onlineから、範囲を指定してホームの”テーブルとして書式設定”を実行しておきます。今回、要素セル数は3としました。
CSVファイル作成
登録対象となるcsvファイル(最終空行無し)を、任意のOneDriveフォルダ上に格納しておきます。
a.csv
aaa,1,10
bbb,2,20
ccc,3,30
b.csv
ooo,5,100
ppp,6,200
ワークフロー作成
Power Automateの画面で、ワークフローを作成していきます。
初期設定
まず、[作成]-[インスタント クラウド フロー]を選択します。
フロー名を入力し、”手動でフローをトリガーします“を選択した後、[作成]ボタンをクリックします。
[新しいステップ]をクリックし、”すべて”の”OneDrive”から”フォルダー内のファイルリスト“イベントを選択します。
“フォルダー内のファイルリスト”イベントには、下記を設定します。
- フォルダー:CSVファイルが格納されているOneDrive上のフォルダ名
次に変数を4つ定義します。[新しいステップ]をクリックし、”組み込み”-“変数”-“変数を初期化する“を選択します。
これを4回繰り返します。設定内容は、下記の表を参照してください。順番は任意です。
名前 | 種類 | 値 | |
変数を初期化する | コンテンツ | 文字列 | (設定なし) |
変数を初期化する2 | 改行文字 | 文字列 | 一回だけ改行(リターンキー押下)する |
変数を初期化する3 | 行の配列 | アレイ | (設定なし) |
変数を初期化する4 | 列の配列 | アレイ | (設定なし) |
CSVファイル個数分のループ
csvファイルを複数処理するためのループを作成します。[新しいステップ]をクリックし、”すべて”-“コントロール”-“それぞれに適用する(旧Apply to each)“コントロールを選択します。
“Apply to each”イベントには、下記を設定します。
- 以前の手順から出力を選択:”動的コンテンツ”-“(フォルダー内のファイルのリストの)ID”
この時点で作成される、内側の”Apply to each”は一旦削除します。
[アクションの追加]をクリックし、”すべて”-“OneDrive”-“ファイルコンテンツの取得“アクションを選択します。
“ファイルコンテンツの取得”アクションには、下記を設定します。
- ファイル:”動的なコンテンツ”内の”ID”を選択
次に、変数を2つ設定します。[アクションの追加]をクリックし、”組み込み”-“変数”-“変数の設定“を選択します。
設定は下記の表の通りです。これで、各ファイルから改行文字で切り出して、1行ずつ配列に格納します。
使用できる式の詳細は、式関数のリァレンス ガイド – Azure Logic Apps | Microsoft Docsを参照してください。
名前 | 値 | |
変数の設定 | コンテンツ | “動的なコンテンツ”から”ファイルコンテンツ” |
変数の設定2 | 行の配列 | “式”に”split(variables(‘コンテンツ’),variables(‘改行文字’))”を入力する |
CSVファイル内行数分のループ
取得した行の要素分だけ、xlsxファイルに出力します。
[アクションの追加]をクリックし、”すべて”-“コントロール”-“それぞれに適用する(旧Apply to each)“でもう1ループ作成します。ここのループは分かりやすいように、右側の”・・・”で名前を”loop2″に変更しておきます。パラメータには下記を設定します。
- 以前の手順から出力を選択:”動的なコンテンツ”から”行の配列”を選択
内側の[アクションの追加]をクリックし、”組み込み”-“変数”-“変数の設定“を選択します。以下で設定します。
名前 | 値 | |
変数の設定3 | 列の配列 | “式”に”split(items(‘loop2′),’,’)”を入力 |
カンマ区切りで分割した、1行単位の値が”列の配列”に代入されたので、これで各セルに反映させます。
内側の[アクションの追加]をクリックし、”すべて”-“Excel Online(OneDrive)”-“表に行を追加“を選択します。”表に行を追加”アクションには、以下の設定を行います。
- ファイル:準備で作成したOneDrive上のxlsxファイル
- テーブル:ドロップダウンに表示されるテーブル名
- 列1:”式”に”variables(‘列の配列’)[0]”を入力
- 列2:”式”に”variables(‘列の配列’)[1]”を入力
- 列3:”式”に”variables(‘列の配列’)[2]”を入力
以上で、フローは完成です。
ワークフロー実行
それでは、フローを実行してみます。今回のフローは手動実行なので、画面上部の[実行]ボタンを押すことで動作します。
もう少し値の加工が必要かもしれませんが、xlsxファイルにcsv値が集約されていることが分かります。
まとめ
Power Automateでは、簡単にデータ作業を自動化可能です。開発元がマイクロソフトなので、Office系アプリケーションとの親和性にも良く、また連携サービスも豊富です。ぜひ活用して、単純作業を自動化してみてください。
また、作業の自動化については、PowerAutomateDesktopでCSVをデータベースにも参考にしてみてください。
以上、Power Automateでcsvデータをxlsxに集計する手順の紹介でした。
コメント
flow大変参考になりました!最後のExcelをsherepointに変更しても使用できました。
・動作フローの「項目の作成」で200行ある場合は、200行まで正常に処理して、201行目で項目不足で失敗になるのでしょうか?
・変数の設定で平仮名や漢字などが文字バケしました。文字化けを押えてリストに記載する方法は無いでしょうか?
ありがとうございます。
> ・動作フローの「項目の作成」で200行ある場合は、200行まで正常に処理して、201行目で項目不足で失敗になるのでしょうか?
当方も200行以上のデータで処理してみましたが成功し、再現することはできませんでした。もし、最終行が改行のみの場合除去してみてください。
> ・変数の設定で平仮名や漢字などが文字バケしました。文字化けを押えてリストに記載する方法は無いでしょうか?
こちらも当方では再現できませんでしたが、SharePointにてご利用とのことなので、コンテンツがbase64になっており、base64ToString関数によるデコードが必要ではないかと推察されます。こちらの記事も参考にしてみてください。
ご返信ありがとうございます。
csvのファイルを一度開いて、UTF-8で保存したら文字化けがしませんでした。
文字コードが問題のようでした。
最後の行が失敗するのは、データの中に文字列が有り、その文字列内で改行が入っていました。この改行で行が乱れていたようです。
sherepointの部分は最後の書き込みをExcelからsherepointリストに変更しました。
解決されたとのことで、良かったです。
コードを参考にさせて頂いており、お世話になっております。
csvファイルを複数取り込んで処理した際に、最後に行の配列で読み込んだデータしか取り出すことが出来ずに、数日悩んでおります。
WEBに記載されているフローと、自分のものを見比べてたり、少し処理を変えたりして試してみたのですが、うまくいきません。行の配列が上書きされているような現象なので、もしかしたら基本的な所の可能性もあります。お忙しいところ大変お手数ですが、何かヒント等がありましたら、ご教授頂けないでしょうか。
申し訳ございません。何度か試しましたが、お伺いしている現象を再現させることは出来ておりません。
テスト実行や実行履歴では、コントロール部分を押すことにより処理データを確認することができます。
もしまだ試しておられないようでしたら、期待した変数値とどこが異なっているかを確認してみてはいかがでしょうか。
こちらで再現できる情報が頂ければ、再度試してみます。
山本です、お世話になります。
処理データを確認してみて上手くいかない様ならもう一度、最初から実装してみます。
それで変化がありましたら、ご報告させて頂きたいと思っております。
お忙しいところ、大変お手数をお掛けしました。
上手く動作するといいですね。
お手伝いできることがあれば、またご連絡ください。
いつも参考にさせて頂いております。
「CSVファイル個数分のループ」のところで、エラーが出てしまいました。
Apply to eachイベントを追加し、(フォルダー内のファイルのリストの)IDを登録したのですが、
ファイルコンテンツの取得アクションを追加して、
(動的なコンテンツ内の)IDを選択すると(フォルダー内のファイルのリストの)IDが
「本文」という動的なコンテンツに自動的に変換されてしまいます。
もし可能でしたら、
Apply to eachイベントの工程と、
動的コンテンツから各IDを選択する際の画面キャプチャを
貼って頂くことは可能でしょうか?
宜しくお願い致します。
大変遅くなり、申し訳ございません。
該当箇所の画像を追加してみました。お手元の環境と動作に差異がある場合は、ご連絡ください。再度確認してみます。
追記:中村です。
「CSVファイル個数分のループ」を使用しない場合(フォルダ内には1つのcsvのみ)
フォルダー内のファイルリストイベントと、Apply to eachイベントを
削除することで対応できますでしょうか?
・ファイル名が固定である場合
ファイルリスト化およびeachループを削除して、ファイルコンテンツの取得にファイルを指定すれば、ファイルの内容を読み出すことができます。
・ファイル名が不定である場合
現在と同じロジックで、何かわからないがファイルが1つある、状態を処理するしかないと思います。
ご参考になれば、幸いです。