MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Power AppsからExcelファイルを取り込んでDataverse for Teamsにデータ登録

時には業務で使いそうなものも。

Dataverse for Teams が正式リリースとなりました。もはやTeamsにくっついている環境であればSharePointのカスタムリストを選択するというのはあまりないのかなと思えるくらい便利ですね。

ただちょっと面倒なのが、データをほかのファイルからインポートするという口がないところです。この投稿では、Power AppsでExcelファイルをアップロードし、その中のテーブルに含まれるデータをDataverse for Teamsの指定のテーブルに登録する方法を紹介します。

1回だけの初期データ投入とかならここまでする必要ないかなと思います。どちらかといえば定期的に追加があるような業務向け(簡易的なマスターの管理など)

準備

まず今回考えるのはExcelファイルの中でテーブルが定義されているケースです。そうでない場合にはOffice Scriptsなどを利用して一回テーブルに変換しておく必要があります。

特にここで使っている列は重要ではないので、「テーブル入りExcelファイルが対象」とだけ。

f:id:mofumofu_dance:20201202224607p:plain
インポートするExcelのテーブル

登録先にはDataverse for Teamsのテーブルを用意しておきます。今回は簡単のために列名を揃えましたが、とくに強い制限はありません。

f:id:mofumofu_dance:20201202224001p:plain
Dataverse for Teamsのテーブル

Power Apps

Power Apps側での処理は、以下の通りです。

  1. 添付ファイルコントロールに追加されたファイルをdatauriに変換する
  2. いらない文字列を取り除く
  3. ボタン押下でフロー実行。dataruiを受け渡す
  4. データソースリフレッシュ

これを行うために、最低限3つのコントロールを画面に追加してください。

コントロール 用途
画像コントロール 添付ファイルからdatauriを取り出すためだけの媒介役
添付ファイルコントロール ファイルを選択するために利用。なければ適当なフォームからコピペする
ボタンコントロール フローを実行するトリガー

画面上の構成は下図を参照。

f:id:mofumofu_dance:20201203000215p:plain
アプリの画面構成

1. 添付ファイルコントロールに追加されたファイルをdatauriに変換する

この方法は結構前から知られているもので、Power AppsからファイルをアップロードしてSharePointのドキュメントライブラリに登録するようなケースで使われる手法です。

追加した画像コントロールのImageプロパティに対して、添付ファイルコントロールのファイルを設定します。

Last(AttachmentControl.Attachments).Value

f:id:mofumofu_dance:20201203002612p:plain
画像コントロールのImageプロパティ

通常、添付ファイルコントロールは複数のファイルを受け付けるので、Last()で添付されたファイルの最後をとっています。

あとはボタンコントロールのOnSelectプロパティに

Set(varUploadedFileContent, JSON(Image1.Image, IncludeBinaryData))

を追加すれば、ボタンをクリックしたときに varUploadedFileContentという変数にExcelファイルの情報が入ります。

f:id:mofumofu_dance:20201203003153p:plain
ボタンコントロールではJSON関数でDataUriをつくる

このあたり、詳しく動画で見たい場合にはShane Youngのビデオ参照してください。


PowerApps upload file to SharePoint document library

残りの処理

あとはボタンコントロールのOnSelectに式を書いていくだけです。

ここでは、実行するフローの名前を ImportExcel としています。

Set(varUploadedFileContent,JSON(Image1.Image,IncludeBinaryData));
ImportExcel.Run(Substitute(varUploadedFileContent,"""",""));
Refresh('sample table')

f:id:mofumofu_dance:20201203003431p:plain
ボタンコントロールの全処理

以上でPower Apps側で作るものは完了。簡単ですね。

Power Automate

Power Automate側では以下のステップでデータ登録を行っています。

  1. Power Appsから受け取ったdatauriを使って、SharePointにファイルを作成
  2. 作成したファイルのテーブルを一覧取得
  3. テーブルからデータを取得
  4. 取得したデータをDataverse for Teamsのテーブルに追加

f:id:mofumofu_dance:20201203000918p:plain
フローの構成

ループが出てしまうところをそのままにしているので、それほど難しくはないかなと思います。

1. SharePointにファイル作成

ここまでがちょうどShaneのビデオで紹介されている範囲です。

Dataverse for Teamsのチームサイトのドキュメントライブラリに対して、適当な名前でファイルを作成します。 この時、ファイルコンテンツには

dataUriToBinary(triggerBody()['Createfile_FileContent'])

このように、datauriToBinaryを使った式を指定します。なお、triggerBody()[]部分は「Power Appsから取得」で追加してください。

f:id:mofumofu_dance:20201203004244p:plain
SharePointへのファイル作成はdatauriToBinary

2. テーブル一覧取得

テーブル一覧の取得をしておきます。ファイル内のテーブルからデータを抽出する際にテーブルIdが必要なのですが、毎回作成するファイルが違って動的に指定しなければならないからです。

Excel Online (Business) コネクターを利用してください。

f:id:mofumofu_dance:20201203004859p:plain
テーブル一覧を取得するExcel Onlineのアクション

3. テーブルからデータ取得

ここもExcel Onlineのアクションを使います。先ほど取得したテーブル一覧を使って (配列なのでApply to eachのループが発生します) 中のデータを取得します。

f:id:mofumofu_dance:20201203005159p:plain
データ取得対象のテーブルは動的コンテンツからIdを指定

ここはfirst関数を使うことで不要なApply to eachのループを除外できます。詳しくは以下の投稿を参考にしてください。

mofumofupower.hatenablog.com

4.データ登録

あとはDataverse for Teamsのテーブルにアイテムを追加するだけです。テーブルから取得したデータは複数個なのでここでもApply to eachのループが発生します。

データ登録する際には、Excel内の列名を使って item()?['Excelの列名']で式から追加してください。(動的コンテンツには出てこないので式で追加する

f:id:mofumofu_dance:20201203005848p:plain
Dataverse for Teamsへの追加にはCommon Data Service (Current environment)を使う

おわり

以上で簡単ですが、Excelファイル→ (Power Apps)→ Dataverse for Teams のデータインポートの仕組みが作れました。

最初に書いた通り、一回限りのデータ登録にこんな仕組みを作るのは大変なので、定期的なファイルからの一括登録が発生するようなシーンで苦労しないために、作っておくと便利かもしれません。

f:id:mofumofu_dance:20201203010723p:plain