【ワンランク上のPower Apps】 CSVインポート その① パターン紹介編

# はじめに
こんにちは。ヨウセイです。

今回Microsoft Power Apps Advent Calendar 2022 に初参加しました。
カレンダー２の12/5用の記事です。

Power Appsでのインポート要件について、ファイル種類や取り込み方法のパターンが何通りかあります。
それぞれメリデメがありますので、そのあたりのご紹介（所感メイン）と、自社アプリへの機能追加としてインポートするサンプルを作成して概要やポイントをご紹介しようかと思います。
※想定よりだいぶ大容量になったので、今回はその① パターン紹介編となります。

**★続きの12/6の記事を書きました。**
[【ワンランク上のPower Apps】 CSVインポート その② Automateで解析・登録編
](https://qiita.com/youseibubu/items/1068b4e1e3ec0f36a5d8)

**★続きの12/11の記事を書きました。**
[【ワンランク上のPower Apps】 CSVインポート その③ Automateで解析・Appsで登録編 ＆プログレス表示](https://qiita.com/youseibubu/items/b04358342098648326eb)

# インポート要件について

そもそもSPOをデータソースにする場合はリスト上でそのままグリッド編集も可能なので、管理者にそのように運用してもらうケースも多いかと。SPOリストを触らせない前提で、ユーザー向けにインポートさせたいケースや数十件の登録がフォームからだと面倒なのでほしい。といった場合にインポート機能の実装があるかと思います。

ちなみに今回本機能を追加した自社アプリはこちらで以前ご紹介しております。
各種実装ポイントを掲載しておりますのでご興味あれば。

https://www.nsurf.co.jp/archives/1825
# 実装サンプル　
その②バージョン。次回以降の記事で実装面をご紹介予定です。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">CSVインポートサンプル <a href="https://t.co/UXKKmO5L2R">pic.twitter.com/UXKKmO5L2R</a></p>&mdash; ヨウセイ (@youseibubu) <a href="https://twitter.com/youseibubu/status/1598708509352562688?ref_src=twsrc%5Etfw">December 2, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

その③で作成したサンプル実装。前回のものからプログレスバー＆ログ表示を追加。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【ワンランク上のPower Apps】 CSVインポート その③ Automateで解析・Appsで登録編 ＆プログレス表示<a href="https://t.co/5NUcRq7Lud">https://t.co/5NUcRq7Lud</a> <a href="https://t.co/nJniSuQrWu">pic.twitter.com/nJniSuQrWu</a></p>&mdash; ヨウセイ (@youseibubu) <a href="https://twitter.com/youseibubu/status/1600559079403196416?ref_src=twsrc%5Etfw">December 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# ファイルの種類と解析のパターン
取り込み対象のファイル種類として、CSV、エクセル、マクロの比較です。メリデメは所感含まれてますのでご容赦ください。
ファイルのアップはPower Apps上で添付ファイルコントロールを利用してアップし、Automateへ渡す実装が前提となります。

<table>
  <thead>
    <tr>
      <th>ファイル</th> <th>プレミアムのみ</th><th>メリット</th><th>デメリット</th>
    </tr>
  </thead>
  <tr>
    <td> CSV </td><td>ー</td>
    <td>・シンプルな内容であれば高速解析が可能（ループなしで）<br>
        ・一時保管用ライブラリは不要 
    </td>
    <td> 解析（JSON化）がカスタムになる</td>
  </tr>
  <tr>
    <td>エクセル（.xlsx）</td><td>ー</td>
    <td>・一般的なExcelOnlineコネクタで操作可能<br>
    </td>
    <td> ・大量だと若干遅い？<br>・テーブルしか読み取れない<br>・一時保管用ライブラリが必要</td>
  </tr>
  <tr>
    <td>エクセル（.xlsx）／ マクロ（.xlsm）</td><td>〇</td>
    <td>・マクロファイルはExcelOnlineコネクタでは利用不可だが、GraphAPIでExcel操作すれば高速な処理が可能（エクセルももちろんOK）
    </td>
    <td> 有償版のみ利用可<br>・一時保管用ライブラリが必要</td>
  </tr>
</table>

エクセルでの取り込みが一般的ですが、ExcelOnlineコネクタはテーブルしか読み込めないので、事前にテーブル化したフォーマットを用意し使ってもらう必要があります（アプリからDLして使えるようにするなど工夫すると良い）まあCSVの場合もマクロも同じくフォーマットが必要なのは同じですね。
ExcelOnlineコネクタで帳票のような決まったフォーマットのシートから読み取る場合は、各セルの値を別シートでテーブル作って参照させてそこから取得するか、フォーマットをそのままテーブル化するなどで読み取る必要があります。
マクロを含むファイルの場合、ExcelOnlineコネクタでは読み込めないので、GraphAPIを使ってエクセル操作することで対応ができます。GraphAPIのエクセル操作なら高速な読み込みや書き込みが可能で、セル単位や範囲での指定も可能です。ただしこちらはプレミアムライセンスが必要です。
エクセル系はいずれもOneDriveかSPOライブラリなどの場所にファイルを（一時的にでも）配置して解析する必要があります。取り込み後不要なら削除する、他に見えないようにするなどの検討も場合により必要かと思います。CSVの場合は特に一時ファイルの配置は不要です。（文字列をそのまま解析する）

CSVの場合は文字コードがUTF-8であることが前提となります。（システム的にSJISなどは使えない）
また、文中に改行があり、レコードの改行と同じコード（CRLF）だと解析できないのかなと思います。（深く調べてないですが）　文中の改行が（CRかLF）でレコード改行と異なる前提であれば大丈夫ですが、ダブルクォーテ囲み＆文中カンマやダブルクォーテありのタイプだと同様に解析が面倒だと思われます。（これも深くは調べてないです）そういった場合はエクセルのほうがカスタム解析が不要なので良いかもですね。


その他、別パターンとしてCSV文字列をそのままPower Appsに渡して解析する以下のような実装例もあります。MVP：HIROさんの記事

https://mofumofupower.hatenablog.com/entry/parse_csv_collection


→今回はCSVのシンプルな内容（文中改行はCR、ダブルクォーテ囲みはなし、文中のカンマもなし）という前提で取り込みサンプルを作ってみます。

# 取り込みのパターン
次にファイルの解析まではAutomateに任せたとして、データソースに登録する方法のパターンです。データソースはSPOとします。
<table>
  <thead>
    <tr>
      <th>取り込み</th><th>方法</th> <th>メリット</th><th>デメリット</th>
    </tr>
  </thead>
  <tr>
    <td> Automateで登録 </td><td>SPOコネクタで登録</td>
    <td>一般的な実装なので基本部分は比較的楽<br>
    </td>
    <td> ・エラーハンドルをしっかりやる場合は工数かかる<br>・アプリに返却までのタイムアウトが2分<br>・件数が多いとAPIコール数がかさむ
</td>
  </tr>
  <tr>
    <td>PowerAppで登録</td><td>PowerAppへ応答でJSON文字列を返却<br>Patchで登録 </td>
    <td>・以前はカスタム解析（Ismatchなど）が必要だったが、JSONParse関数が使えるようになった<br>
・アプリ側でエラーハンドル（内容チェックなど細かくやる場合も）がしやすい
    </td>
    <td>JSONParse関数がまだ実験的機能である<br><br></td>
  </tr>
  <tr>
    <td>PowerAppで登録（プレミアム版）</td><td>応答アクション（プレミアム）でコレクションで返却<br>Patchで登録</td>
    <td>・コレクションでそのまま使える<br>
        ・エラーハンドル周りは上記同様
    </td>
    <td> 有償版のみの利用となる</td>
  </tr>
</table>

Automateでそのまま登録が楽そうですが、しっかりエラーハンドルやってそれをAppsへ返却する場合は結構工数かかるイメージです。また、ループ内で条件判定などいろいろやっていたらさらにAPIコール数がかさみます（通常プランで6000回／日・ユーザーなど制限があるため考慮必要）。
また、アプリから呼び出し→返却までの時間が2分を超えるとタイムアウトしアプリに返却できませんので考慮が必要です。（と言いつつ、次回ご紹介するサンプルです）

解析したJSONをアプリに返却する方式の場合、プレミアム版なら応答アクションでコレクションにそのまま入れて使えますので一番いいですが、通常版だと文字列としてしか返せないため、従来はIsMatchなどでの解析のカスタム実装が必要でした。
が、最近JSONParse関数が実験的機能でリリースされたのでそれだと結構いい感じに使えます。またエラーハンドルなどもアプリ実装に慣れている人はこっちのほうがなどやりやすいのではと思います。（上記の次にご紹介予定）

# おわりに
ということで、今回はインポート機能の際の取り込みや解析のパターンについて書きました。ほかにもパターンがあるかもしれませんがとりあえず主要なものを挙げた感じです。
実際のインポートサンプルの投稿は次回投稿いたします。（カレンダー２の12/6に予定しています。間に合わせます。）


**★続きの12/6の記事を書きました。**
[【ワンランク上のPower Apps】 CSVインポート その② Automateで解析・登録編
](https://qiita.com/youseibubu/items/1068b4e1e3ec0f36a5d8)

**★続きの12/11の記事を書きました。**
[【ワンランク上のPower Apps】 CSVインポート その③ Automateで解析・Appsで登録編 ＆プログレス表示](https://qiita.com/youseibubu/items/b04358342098648326eb)