Power Appsのデータフローという最高にCoolなデータ活用を解説！

# Power Appsでのデータフロー
`データフロー`というと`Power BI`🧐!!

となりそうですが、[Power Appsでのデータフロー](https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/create-and-use-dataflows)という機能が存在します。

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/create-and-use-dataflows

こちらは`Power Apps ポータル`から活用することができる高度なデータ活用機能です。

`Power Apps`、`Power Automate`において、データ統合の手段は複数存在しますが、**お勧めはダントツでデータフローを用いる**方法です。

こちらについて解説していきたいと思います。

:::note info
この内容は[2024.11.28～30に開催された Japan Microsoft 365 コミュニティ カンファレンス 2024](https://www.docswell.com/s/DemodoriGatsuo/Z7R4RJ-2024-11-29-144307)の登壇でも取り扱わせていただきました。
**Power Platform** でもこの機能が使えるんだ👀✨となれば幸いです！
:::

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/Z7R4RJ/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/DemodoriGatsuo/Z7R4RJ-2024-11-29-144307">A10 Power Appsのデータフローという最高にCoolなデータ活用を解説！ by @DemodoriGatsuo</a></div>


# データフローの詳細
`データフロー`はPower Apps ポータルの中に存在します。`ナビゲーション ウィンドウ`から`データフロー`を選択すると出ています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/1ce8497f-c815-7943-f36f-d5ef415dad4e.png)

この機能は、多様なSaaS・ビジネスデータとの接続、データの保管、加工を可能にします。

データの格納先は、`Microsoft Dataverse` または `Azure Data Lake Gen2 ストレージ`です。

| 方法                    | ストレージ               | Power Query | 他アプリケーションとの連携 | 増分読み込み        | スケジュール更新 | 備考                                              |
|-------------------------|--------------------------|-------------|--------------------------|---------------------|----------------|---------------------------------------------------|
| 標準データフロー Standard V2 | Dataverse               | ○           | Dataverseを通して可能       | 既定               | ○              | ビジネスユーザー部門でも利用しやすい<br>※AI関数・計算されたテーブルは対象外 |
| 分析データフロー         | Azure Data Lake Gen2    | ○           | Power BIのみ             | フルロード<br>※設定可能 | ○              | 高度な機能を含めて提供                              |


## データフローを利用する条件
データフローの活用自体は、**有償ライセンスが必要です。**
2024.12現在では下記のライセンスが該当します。

[Power Apps Premium](https://www.microsoft.com/ja-jp/power-platform/products/power-apps/pricing?msockid=31a97cdc21de62fc38bc68e220a26381)

https://www.microsoft.com/ja-jp/power-platform/products/power-apps/pricing

::: note warn
`Power Apps の開発者向けプラン`では利用できません。ご注意ください。
:::

「有償ライセンス💰」と聞くと、躊躇してしまう部分もありますが、`Dataverse`のリッチなデータ管理機能を使えるというだけでも十分にペイする機能ではないかと思います。

そして個人的に**これは👀🔥**ということが、公式の資料にも記載があります。

>  注意
> データフローを使用するには、有料の Power Apps プランを使用する必要がありますが、データフローを使用することによって別々に請求されることはありません。
>> [データフローの使用方法](https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/self-service-data-prep-with-dataflows?source=recommendations#how-to-use-dataflows)

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/self-service-data-prep-with-dataflows?source=recommendations#how-to-use-dataflows

コストコントロールが一定可能であるともいえます。

## データフローの活用手順
データフローは単一の`Power Platform`の環境内に作成されます。
環境を選択したうえで、下記の順序でデータフローを定義します。

1. **データフローの作成**
1. **Power Queryを用いたデータ加工の定義**
1. **テーブル(Dataverse)へのマッピング**
1. **更新頻度の設定**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5c63dd4c-6d93-6085-6bc0-6aec9543e837.png)

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/create-and-use-dataflows

:::note info
「3.テーブル(Dataverse)へのマッピング」ですが、`新しいテーブルへの読み込み`・`既存のテーブルへの読み込み`の二つをサポートしています。
個人的には`既存のテーブルへの読み込み`を選択し、あらかじめ定義しておいたテーブルにデータを蓄積していく方法がやり易いです。
:::

### 推しのポイント: **2. Power Queryを用いたデータ加工**‼

**`Power BI Desktop`の `Power Query エディター`と同じPower Queryの機能を利用することができます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2be97363-739e-0134-14f8-ff3cb65c17c7.png)

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/create-and-use-dataflows#use-the-dataflow-editor-to-shape-or-transform-data

https://learn.microsoft.com/ja-jp/power-bi/transform-model/desktop-query-overview

私自身、`Power Automate`のデータ加工、`Office Scripts`の解説など、Qiitaで取り上げてきましたが、それぞれ操作性に癖があります。`Power Apps`も同様です。

完全に主観で比較すると下記のようになりました。

|                         | Power Platform データフロー     | Power Automate             | Office Scripts       |
|-------------------------|-------------------------------|----------------------------|----------------------|
| 手段                    | ローコード                     | ノーコード                  | コード                |
| データ変換               | 高度な変換可能                  | 高度な変換にはテクニックを要する | 柔軟に制御可能          |
| エラーハンドリング         | 標準で失敗処理通知を制御          | 柔軟                       | カスタマイズ            |
| スケジュール実行           | 標準                          | 標準                       | 要Power Automate      |
| 外部システム              | ◎ 多数のコネクタ                | ◎ 多数のコネクタ            | 限定的                 |
| 大量データ処理            | 百万単位                       | 千単位                     | 万単位                |
| バッチ処理               | ◎                            | 並列処理は限定的             | 実装は可能             |
| リアルタイム処理           | 要Power Automate               | 最適                       | 要Power Automate       |
| コスト                  | 要プレミアムライセンス            | 追加費用が必要である可能性あり  | 低コスト               |
| アクセス制御              | ◎ 詳細な設定可                 | ◎ 詳細な設定可              | -                    |
| ログ                   | 標準                          | 標準                       | -                    |
| DLP対応                 | ◎ 対応                        | ◎ 対応                     | -                    |

データ加工の手段として、ユーザーフレンドリーである強力な機能は、Power Queryに軍配が上がると自分は考えています。**視覚的に加工プロセスを把握することができ、クイックに加工プロセスを定義することが非常に魅力的です。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b9925d72-8fc0-4a76-fe83-fc2e8ed3facc.png)

この部分は考え方の相違により、ご意見をいただきそうな部分のため、これ以上の持論は避けます。
そしてPower Query自体の説明についても、ほかの文献やlearnに解説を譲らせていただきます。

https://learn.microsoft.com/ja-jp/power-bi/transform-model/desktop-query-overview#power-query-editor

#### 4. Tips !! LoopによるPower Queryのドキュメンテーション
コラボレーションアプリである[Microsoft Loop](https://www.microsoft.com/ja-jp/microsoft-loop)でMermaid図が描画できます。

https://devblogs.microsoft.com/microsoft365dev/microsoft-loop-transforms-the-way-developer-teams-work/

Power Queryの基本機能で`クエリの依存関係`を可視化することができますが、`Power Query M式`からMermaid図の描画がCopilotからクイックにできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/cf28e8c4-cc16-6759-0930-885523d7a102.png)

```plaintext:プロンプト例
下記のPower Query M式をもとに依存関係をMermaid図で描画してください。
# Power Query M
{コードを貼り付け}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4993b5b1-2e40-c9ec-4579-0a13c95f264d.png)

**結果**

```mermaid
graph TD
    A[Source - CommonDataService.Database] --> B[Navigation - gatsuo_salestransaction]
    B --> C[SelectColumns - 選択した列]
    C --> D[RenameColumns - 列名の変更]
    D --> E[NestedJoin1 - gatsuo_customerとの結合]
    E --> F[NestedJoin2 - gatsuo_productとの結合]
    F --> G[ExpandTableColumn1 - gatsuo_customerの展開]
    G --> H[ExpandTableColumn2 - gatsuo_productの展開]
```

:::note info
上記の例は少し微妙ですが、クエリやテーブルの依存関係の可視化し、保守性向上に役立ちますね！

**ちなみにマニュアル作成でもCopilotは大活躍するため、ガンガン使い倒すことをおススメします！**
:::

### 3. テーブル(Dataverse)へのマッピング
「2. Power Queryを用いたデータ加工」の結果は、Dataverseのテーブルに格納することができます。
カスタムテーブルだけではなく、標準テーブルも同様です。

https://learn.microsoft.com/ja-jp/power-query/dataflows/get-best-of-standard-dataflows?source=recommendations

どの列に「2. Power Queryを用いたデータ加工」の結果を当てはめるか、これがマッピングに該当します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/f17cd53b-99d6-f814-3aa1-aa3455ef714e.png)

### 4. 更新頻度を設定する
そして嬉しい機能として[更新頻度の設定](https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/create-and-use-dataflows?source=recommendations#set-the-refresh-frequency)があります。
**コチラは任意のスケジュールでデータフローを更新を自動で設定することができます。**

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/create-and-use-dataflows?source=recommendations#set-the-refresh-frequency

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/07fd8305-3d65-98ac-487a-d89a04ba5daa.png)

:::note info
この機能は`Power Automate`による更新とは別物です。
さらに更新頻度をフレキシブルに設定したい場合は、後述するPower Automateとの連携をご参照ください。
:::

原則的に、Power Appsのデータフローは増分更新です。
取引履歴のようなデータを蓄積し続けます。

マスタのようなデータを更新する機能にする場合は、`Power Platform 管理センター`の機能を活用します。

- [重複データの検出](https://learn.microsoft.com/ja-jp/power-platform/admin/detect-duplicate-data)
- [重複レコードの検出](https://learn.microsoft.com/ja-jp/power-platform/admin/detect-duplicate-records)
- [一括削除](https://learn.microsoft.com/ja-jp/power-platform/admin/view-take-action-bulk-deletion-jobs)

豊富な`Dataverse`・`Power Platform 管理センター`との組み合わせでハンドリングできるイメージです。魅力が満載です。

**大規模なデータを一括で処理するオプションとして、ビジネスユーザー部門からでも心強い機能ではないでしょうか。**

### Power Automate テンプレート
[Microsoft learn](https://learn.microsoft.com/ja-jp/power-query/dataflows/dataflow-power-automate-connector-templates)にて、データフロー コネクタを利用したテンプレートが紹介されています。

https://learn.microsoft.com/ja-jp/power-query/dataflows/dataflow-power-automate-connector-templates

自分で一から考えずとも用意されているのは、ありがたいです🐟

# さっそく作成してみましょう🐟
せっかくなので、データフローを作成する手順をみていきます。
今回は特定のデータソースからデータを取得せずに、Power Queryによる計算結果を用いたカレンダーテーブルを作成します。

```plaintext: power query m
let
    // 現在の年を取得
    CurrentYear = Date.Year(DateTime.LocalNow()),

    // 会計年度のロジック
    GetFiscalYear = (date) =>
        let
            year = Date.Year(date),
            month = Date.Month(date)
        in
            if month >= 4 then Text.From(year) & "-" & Text.From(year + 1) else Text.From(year - 1) & "-" & Text.From(year),

    // 開始日と終了日
    StartDate = #date(CurrentYear, 1, 1),
    EndDate = #date(CurrentYear, 12, 31),

    // 日付リストの生成
    DateList = List.Dates(StartDate, Duration.Days(Duration.From(EndDate - StartDate)) + 1, #duration(1, 0, 0, 0)),

    // テーブル化
    DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}),

    // 必要カラムを追加
    AddYear = Table.AddColumn(DateTable, "Year", each Date.Year([Date]), Int64.Type),
    AddFiscalYear = Table.AddColumn(AddYear, "FiscalYear", each GetFiscalYear([Date]), type text),
    AddMonth = Table.AddColumn(AddFiscalYear, "Month", each Date.Month([Date]), Int64.Type),
    AddDayOfMonth = Table.AddColumn(AddMonth, "DayOfMonth", each Date.Day([Date]), Int64.Type),
    AddDayOfWeekName = Table.AddColumn(AddDayOfMonth, "DayOfWeekName", each Date.DayOfWeekName([Date]), type text),
    AddDayOfWeekNumber = Table.AddColumn(AddDayOfWeekName, "DayOfWeekNumber", each Date.DayOfWeek([Date]) + 1, Int64.Type),

    // 祝日データのモックアップ（ここをカスタマイズ）
    AddHolidayName = Table.AddColumn(AddDayOfWeekNumber, "HolidayName", each if Date.Day([Date]) = 1 and Date.Month([Date]) = 1 then "New Year's Day" else null, type text),
    AddHolidayType = Table.AddColumn(AddHolidayName, "HolidayType", each if [HolidayName] <> null then "Public Holiday" else null, type text),
    AddHolidayDescription = Table.AddColumn(AddHolidayType, "HolidayDescription", each if [HolidayName] = "New Year's Day" then "Celebration of the new year" else null, type text),
    AddIsNationalHoliday = Table.AddColumn(AddHolidayDescription, "IsNationalHoliday", each if [HolidayName] <> null then true else false, type logical),
    DuplicatedColumn = Table.AddColumn(AddIsNationalHoliday, "strDate", each Text.From([Date], "ja"), type text),
    TransformColumnTypes = Table.TransformColumnTypes(DuplicatedColumn, {{"Date", type date}})
in
    TransformColumnTypes
```

## 具体的な作成の流れ

1. `Power Apps`で`データフロー`を作成する環境を選択
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/d7676625-f27f-df0d-b800-bccd0777df35.png)

    ::: note info
    登壇に合わせて `#JapanM365CC2024 `という名称の環境を作成しています。
    
2. `ソリューション`に`カスタムテーブル`を設けて`データフロー`を作成
   - 今回は、新たに`ソリューション`を作成して進めます。まずは`カスタムテーブル`を作成
     - **例:** カレンダー用のExcelを用意して読み込ませています
   ![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/a6188c80-0603-5c6a-75a9-94c0fe5e4aff.png)

3. `ソリューション`から`Dataflow`を選択
`Dataflow`を選択したあと、`分析`にチェックを入れないで、`データフロー`の作成画面に遷移しましょう。

    ![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/34f23e28-e2fe-9bf0-95aa-68a5bb237596.png)

    ::: note info
    開くと非常に多くの`データコネクタ`が表示されます
    ![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5ef2bcb9-970f-f15b-1be5-3fbc79248496.png)

4. データソースを選択する
データソースとして`空のクエリ`を選択します。
今回は`サンプル`としてカレンダーを作成して`テーブル`に読み込ませます。`コネクタ`の認証に関する解説は、公式記事をご参照ください。

5. Power Query M式でカレンダーを作成
   - 空のクエリで以下のPower Query M式を使用してカレンダーを作成
6. `宛先を設定する`画面で設定を行う

   6-1. 読み込み先の設定
      - (2)で作成した`カスタムテーブル`を選択
      ![スクリーンショット 2024-11-28 233507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/9bbde501-d6b0-6c28-059f-e4b8f8eab152.png)
      ::: note info
      メタデータからサジェストされることが凄いAIパワーを感じますね📊
      :::

   6-2. インポート方法の設定
      - インポート方法: `append`を選択
      ![スクリーンショット 2024-11-28 233518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c7de8707-47fd-084e-0a8a-d541a8a2648d.png)

   6-3. 列のマッピング
      - データの列を適切に`カスタムテーブル`の列に割り当てます
      - 必須列ではない場合、割り当てをせずに、読み込まないということができます
      - データ型が不一致の場合、アラートが表示されます。型の一致を確認してください
      ![スクリーンショット 2024-11-28 233904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ce34453b-ca1e-9517-8260-9b1034592569.png)

7. 設定の更新と更新頻度のスケジュール
   - データフローの設定を更新します
   - 必要に応じて更新頻度をスケジュールして、自動更新を有効にします
   ![スクリーンショット 2024-11-28 233917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4a785cdb-35a4-1d24-db75-65bf70a241b5.png)
 
8. 公開!
![スクリーンショット 2024-11-28 233917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/aad2692d-b541-b6ac-6d22-5a5869e60304.png)

実行すると**Dataverse**に値が格納されます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5c65d505-6027-461d-fdb4-b91a87403d75.png)

最初は面食らうところがありますが、これにより外部システムから、システムジョブとしてデータを取り込むことができます。

**多様なコネクタがサポートされ、定期的にデータを更新できるCoolな機能です！**
是非試してみてください。