PowerAutomateでPowerBIのデータを自動取得

本記事は「 [TTDC Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ttdc) 」 16 日目の記事です。

# はじめに
最近は、PowerAutomate、PowerBIを活用する方が増えています。  
本記事は、今から始める方・始めたいと思っている方をターゲットにした記事です。  
PowerAutomateでPowerBIから最新のデータを取得する方法を紹介します。  

# 本記事でわかること
- PowerAutomateのスケジュール実行方法
- PowerBIのデータ絞り込み方法
- 絞り込んだデータのCSV出力方法

# PowerAutomate、PowerBIとは
[PowerAutomate](https://www.microsoft.com/ja-jp/power-platform/products/power-automate)とは、Microsoft社のRPA（ロボティック・プロセス・オートメーション）ツールです。Microsoft 365製品や他の外部サービスと連携して業務プロセスを自動化することができます。  

[PowerBI](https://www.microsoft.com/ja-jp/power-platform/products/power-bi)とは、Microsoft社が提供しているBI（ビジネス・インテリジェンス）ツールです。膨大なデータを分析・可視化し、経営や業務の意思決定に役立てることができます。

# やりたいこと
PowerBIのレポートから、必要なデータを絞り込んで、OneDrive上へCSV出力します。  
PowerBIのレポートイメージは、下記の通りです。  
![sample_data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/34516d15-0d2f-f2fc-4ac5-dcf902f97aff.png)

このデータを使って、以下の条件に当てはまる人達を絞り込んで、CSV出力します。
- 20歳以下の人
- いちご好きの人
- アレルギーのある人

# フロー
PowerAutomateでPowerBIのデータを自動取得するフローは、下記の通りです。  
![flowchart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/447fb360-75cf-1a28-68da-29dbc8df5b8f.png)

今回紹介するフローでは、フローを開始する`トリガー`と、処理を行う`アクション`を組み合わせています。  
フロー編集画面からは、各処理のブロックをクリックして設定を確認・編集することができます。

## Recurrence
PowerAutomateでは、トリガーを使ってフローを開始します。  
スケジュール実行では、`Recurrence`というトリガーを使用します。  
このトリガーは、フローを一から作成する場合は、以下の赤枠のアイコンから使用可能です。  
![recurrence1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/bbbf646c-dc24-95c6-0585-e7cd3d41faef.png)


クリックすると、以下のような編集画面が開くので、お好みで設定を行ってください。  
下の図は、「毎週1回 月曜日 10:00」に実行する設定です。  
![recurrence2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/50a18144-d60e-2ab3-ed63-516d708edcb0.png)

## データセットに対してクエリを実行する
次は、`データセットに対してクエリを実行する`というアクションを追加します。  

アクションを追加するには、`＋`を押下して「アクションの追加」を表示します。  
![add_action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/ffedc8c8-5057-6f6e-7ab0-0b158ac05951.png)  

「アクションの追加」を押下すると追加可能なアクション一覧が表示されます。
![add_action2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/662595e0-d5ab-0193-6a61-e0786039290e.png)  
この中から`PowerBIコネクタ`の`データセットに対してクエリを実行する`を選択してください。  

クリックすると、以下のような編集画面が開きます。  
![powerbi1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/65e59c51-0086-0cdc-b08d-d927d090dfe3.png)

`ワークスペース`と`データセット`から、入力するPowerBIレポートを選択します。  

`クエリテキスト`には、PowerBIのレポートからデータを絞り込むクエリを書きます。  
クエリは、`DAXクエリ`を使用します。  
クエリには、レポートのテーブル名を使用します。テーブル名は、PowerBIレポートを編集画面で開いたときの下図赤枠部分です。  
![powerbi2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/bda03a6d-d4d7-1654-1447-7a97b72fb1e2.png)

今回絞り込むクエリの書き方は、以下のようになります。
- 20歳以下の人  
  `誕生日が20年前の日付以降の人`を絞り込みます。  
  ```
  FILTER ( Sheet2, Sheet2[誕生日] >= EDATE(TODAY(), -240) )
  ```
  `EDATE(TODAY(), -240)`は、今日の日付から240ヶ月(20年)前の日付です。

- いちご好きの人  
  `好きな果物列がいちごの人`を絞り込みます。  
  ```
  FILTER ( Sheet2, Sheet2[好きな果物] = "いちご" )
  ```

- アレルギーのある人  
  `アレルギー列が空白じゃない人`を絞り込みます。  
  ```
  FILTER ( Sheet2, NOT( ISBLANK(Sheet2[アレルギー]) ) )
  ```

上記の条件を組み合わせて絞り込む場合は、`&&`を使って複数の条件を結合します。
```
FILTER(Sheet2, Sheet2[誕生日] >= EDATE(TODAY(), -240) && Sheet2[好きな果物] = "いちご" && NOT(ISBLANK(Sheet2[アレルギー])))
```

## 選択
次は、`選択`というアクションを追加します。  
このアクションは、`データ操作コネクタ`から使用可能です。  
`データ操作コネクタ`は、アクション一覧のランタイムを`組み込み`で絞り込むと検索しやすいです。  
![select0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/097c35d4-d185-f021-ea69-c3f3ef0e9abe.png)  

クリックすると、以下のような編集画面が開きます。  
![select1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/363ccfe5-67c0-c0b7-b637-0fcff52fcd84.png)  

`From`には、絞り込んだ結果を指定します。  
From選択時に表示される`雷マーク`を押下すると、これより前のフローのデータ(変数)がブロック名ごとに表示されます。  
ここから使用したい変数を選択可能です。  
絞り込んだ結果を指定するには、1つ前のブロック=`データセットに対してクエリを実行する`から、`最初のテーブルの行`を選択します。

`Map`には、`キー`と`値`を指定して、CSVファイルに出力するテーブルを作成します。    
`キー`は、自由に設定可能です。(元のレポートと違う列名にもできます。)  
`値`は、値選択時に表示される`fxマーク`から、手動で以下の関数を設定します。
```
item()?['テーブル名 [ 列名 ]']
```  
![select2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/82d64ee6-e630-e664-8a9c-4ed3fcddeec9.png)  

追加直後は下図のようなfxの濃いピンク色の表示ですが、フロー保存後に表示が変わってPowerBIの黄色い表示になります。  
![select3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/a5595261-ebd3-fe60-3ca6-36de7a4ef312.png)  

## CSVテーブルの作成
次は、`CSVテーブルの作成`というアクションを追加します。  
このアクションは、`データ操作コネクタ`から使用可能です。  

クリックすると、以下のような編集画面が開きます。  
![csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/0e8fcc45-edbd-b3a3-811e-335d065ef0ff.png)  

`From`に、1つ前のブロック=`選択`から、`Output`を指定します。  

## ファイルの作成
次は、`ファイルの作成`というアクションを追加します。  
このアクションは、`OneDrive for Businessコネクタ`から使用可能です。  

クリックすると、以下のような編集画面が開きます。  
![onedrive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/5bf76e6e-d690-af30-998a-6a4c47a14874.png)  

`フォルダーのパス`と`ファイル名`から、ファイルの出力先を選択します。  

`ファイルコンテンツ`は、1つ前のブロック=`CSVテーブルの作成`から、`Output`を選択します。  

基本はこれでOKですが、データに日本語が含まれる場合は文字化けしてしまいます。  
日本語を出力するには、`fxマーク`から、以下のように関数を変更してください。[(参照)](https://jpdynamicscrm.github.io/blog/powerautomate/Avoid-Character-Corruption-Methods/)
```
concat(decodeUriComponent('%EF%BB%BF'),body('CSV_テーブルの作成'))
```

# 出力ファイル
フローを実行すると、`ファイルの作成`で指定した出力先に、以下のCSVファイルが作成されます。  
期待通り、絞り込んだ結果をCSV出力できていることが確認できます。  
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936035/c0cf8363-6f72-db1f-9a60-d882ef3c6995.png)  

以上で、PowerAutomateでPowerBIから最新のデータを取得するフローは完成です!

# 注意事項
PowerBIのレポートを使用する際の注意事項です。  
セマンティックモデルを使用して作成されたレポートを2か月間表示しないと、スケジュールが一時停止されます。この機能はリソースの浪費を回避するための機能です。[(参照)](https://community.fabric.microsoft.com/t5/Service/Your-scheduled-refresh-has-been-paused-How-to-stop-this-for-some/m-p/2123310)  
スケジュールの停止を回避するためには、2か月に一度、レポートにアクセスしてください。

# 最後に
本記事では、PowerAutomateでPowerBIから最新のデータを取得する方法を紹介しました。  
読んでくれた方のお役に立てれば幸いです!  

最後まで読んでいただき、ありがとうございました。  
最後になりますが、本記事の内容に誤りなどあれば、コメントにてご教授お願いいたします。