PowerAppsのギャラリーをCSVでエクスポートする方法【PowerAutomate】

## 前置き
先日PowerAppsを使用したアプリ開発をした際に、ギャラリーの情報をエクスポートする機能の検討をする必要がありました。関連しそうなワードで調べながら開発をしましたが実装するまでに苦戦する内容もあったので、ここに書き残すことで誰かの役に立てばいいなと思います。

## すでに開発されている前提条件
今回表題のような機能を実装するにあたり、すでにある程度開発されたアプリに対したの追加実装だったため前提条件も軽く提供しておきます。
* データベースはSharepointのリストを使用
* 社内の情報を取りまとめた情報を表示するギャラリーが実装されている
* ギャラリーのOnselectにはFilter関数やSearch関数が入っていて、絞り込みの条件を設定するとリアルタイムでレコード数が変更される

## ギャラリーを出力するために必要なこと
まず最初に機能を実装するにあたり、先程の前提条件をもとにギャラリーを出力するために考えるべき問題を先に考えました。
* エクスポート機能を実行するボタンを画面上に配置
* ギャラリーの出力は絞り込みの条件に一致するすべてのレコードを出力したい
* 出力形式はExcelかcsvを検討しているが、後々の出力速度を考えてcsvを採用
* データの保存先は使用するユーザーによって左右されないようにOnedriveではなくデータベースとして使用しているSharepointを使用する
* エクスポート後にOutlookで使用しているメールにリンクが届くとワンクリックでファイルを表示できるので使いやすい
* PowerAppsでボタンを押したときにPowerAutomateフローを実行する

ここまでで前提条件と実装する機能の仕様のイメージを固めたので次の項目から実際に開発した手順をまとめていきます。

## 1.絞り込んだ条件に一致するすべてのレコードを出力する
まず最初に着手したのは表題にもなっている「条件に一致するレコードをすべて出力する」の部分です。すべてのレコードを出力する場合は単純にSharepointリストのエクスポートをすることで要件を満たすことができますが、絞り込んだものを出力するために今回はコレクションの機能を使用しました。
前提条件にもあるようにギャラリーのItemsには絞り込みの条件式が書かれているので、コレクションの作成にもほとんど同じものを使用することでこの要件は満たせます。
### 関数の例
* ギャラリーのItemsプロパティ
```
Search(
    Filter(
        your_database,
        Filter1 &&
        Filter2),
    Search)
```
こちらはギャラリーの絞り込みの機能を実装しているItemsプロパティの一例です。使用する場合はご自身の環境に合わせて書き換えてください。

* エクスポートボタンのコレクション関数
```
ClearCollect(ExportData, ShowColumns(
    Search(
        Filter(
            your_database,
            Filter1 &&
            Filter2),
        Search),
    Columns1,Columns2,…))
```
ClearCollectはコレクションをリセットしてから作成する関数です。これを使用することで新しくデータを保存することができるので前回実行時のデータが残ることを防ぐことができます。
Showcolumns関数はコレクションに保管したい列を選択する関数です。出力する列を厳選する場合などに使うことができます。またすべての列をコレクションに保存した時"{"が含まれる列などがあるとこの後の処理でエラーを吐いてしまうため、エラー回避のために使用しています。
## 2.コレクションをJsonに変換する
次の手順は先ほど作成したコレクションをJsonに変換します。この手順を踏む理由はPowerAutomateフローにデータを渡す際に文字列でデータを渡す必要があるからです。
（詳細はフローの作成のところで説明します）
* コレクションをJsonに変換する関数
```
//この関数をClearCollectの下に追加
Set(Export,JSON(ExportData,JSONFormat.IndentFour))
```
Set関数も併せて使うことで変数としてコレクションのJsonを変数に格納することができます。フローにデータを渡すときにはこの変数を使用します。

## 3.PowerAutomateでフローを作成
ギャラリーをコレクションにして、Jsonに変換できたところでフローを作成する準備が整いました。
ここで作成するフローの流れとしては、以下のようになります。

<dl>
  <dt>トリガー</dt>
  <dd>Power Apps(V2)</dd>
  <dt>アクション</dt>
  <dd>・Jsonの解析</dd>
  <dd>・csvテーブルの作成</dd>
  <dd>・SharePointにファイルの作成</dd>
  <dd>・SharePointのリンクをメールで送信</dd>
</dl>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767329/280f2c22-5e7c-40e8-8b0e-2eb9a1a2ef1b.png)
>ファイルの作成とメールの送信の間にある変数の初期化のアクションはメールを送る際のURL作成のためのものです。ここで解説すると長くなるので、別記事にてまた解説します。

次にトリガーやそれぞれのアクションの詳細を見ていきます。
トリガーのPower Apps(V2)はPowerAppsのボタンを押したときにフローで受け取る値を指定しています。1行目の電子メールはAppsを使用しているユーザーのメールアドレス、入力にはJsonに変換されたコレクションが入るように後ほど設定していきます

最初に実行するアクションはJsonの解析です。コンテンツはPowerAppsからの入力を受け取り、スキーマには以下のようにJsonで各列の形式などを指定します。

```{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "Column1": {
                "type": "string"
            },
            "Column2": {
                "type": "string"
            },
            "Column3": {
                "type": "string"
            },…
```
その次にcsvに変換のアクションを設定します。開始の項目は動的なコンテンツで先ほど設定したJsonの解析の本文がスコープで表示されると思うのでそれを設定してください
詳細オプションの列は自動のままで進めて問題ないです。

次のアクションはSharepoint上にファイルの作成するものですが、ファイルコンテンツの項目をCSVテーブルの作成の出力の動的コンテンツを設定してください。サイトのアドレスやフォルダのパスなどはご自身で使用する環境に合わせていただければと思います。
ファイル名に関しては名前で被ってしまうと作成ができなくなってしまうので、ファイル名に日付を入れてあげるとオリジナルの値になりその対策となります。
```
formatDateTime(addHours(utcNow(),9),'yyyyMMddHHmmss')
```
上の数式を使っていただきそのあとに.csvとつけていただくとファイル名が202041008114522.csvなどのオリジナルな値になります。

ここから先のメールに送信するためURLを取得するためのフローはこちらの記事にて紹介したいと思います。
[PowerAutomateでエクスポートしたファイルのリンクを変数で取得する方法](https://qiita.com/hedaozhenye/items/a7cc4b52d931388d63f5)


## 4.PowerAppsからフローの呼び出し
最後にPowerAppsでフローを呼び出す関数について確認していきたいと思います。
```
//この関数をSetの下に追加
Flow.Run(User().Email,Export)
```
フローの呼び出しには上のような関数を使用します。Flow.Run()の部分でフローを呼び出して、()の中の値を先ほどのトリガーの時に説明したアプリから渡す値として設定します。
今回のトリガーには電子メールと入力の二つの値を設定しているので、User().Emailでアプリ使用者の電子メールを、手順2でグローバル変数として設定したExportでJson化されたコレクションをそれぞれフローに渡しています。

:::note info
追記
ファイルをローカルにダウンロードする方法についても記事を投稿しました。
:::
https://qiita.com/hedaozhenye/items/7e4183435986933bf4d0