はじめに
この記事はPower Automateで色々なデータソースに対してBulk Insertを行うのDataverse編です。
登録を行う元データは上記記事の「Bulk Insert」セクションを参照してください。
Power Automateではデータソースに対してレコードを作成するアクションを標準で搭載してはいますが、どれも1件ずつの登録しかできません。
これでは例えば500件のデータを登録したい場合など、ループアクションが必要になり、APIコール数もこれだけで500回も消費してしまいます。
このような事態を避けるためにも1回のアクションで複数件のデータを登録する方法をこの記事ではまとめています。
あくまでもここで紹介しているのは一例に過ぎないのでご注意ください。
Dataverseに対してBulk Insertを行う
登録を行うDataverseには以下のようなテーブルが存在しています。
列名 | 種類 | 説明 | 元データとのマッピング |
---|---|---|---|
Name | プライマリの列(1行テキスト) | GUIDが含まれています | GUID |
Number | 整数 | 数値が含まれています | Number |
Text | 1行テキスト | 文字列が含まれています | Text |
Date | 日付のみ | 日付が含まれています | Date |
Dataverseにデータ登録を行うにはDataverse Web APIを利用します。
SharePoint Listの時と同様にbatch
操作での複数件登録を行います。
ドキュメントを見てもらえればわかる通り、要求のBodyにはSharePoint REST APIと似たような形式の要求が必要です。
よって、ここの要求はSharePoint REST APIでBulk Insertしたときと同様に、「選択」アクションと「作成」アクションでBodyを作成していきます。
Dataverse Web APIの利用に関しては以下記事で紹介していますので、こちらをご参照ください。
Dataverseにbatch
操作で登録を行うには以下のようなBodyが必要です。
--batch_[batch GUID] Content-Type: multipart/mixed;boundary=changeset_[changeset GUID] --changeset_[changeset GUID] Content-Type: application/http Content-Transfer-Encoding:binary Content-ID: 1 POST [Organization URI]/api/data/v9.2/[tableName] HTTP/1.1 Content-Type: application/json;type=entry [Registered Data in JSON] --changeset_[changeset GUID] Content-Type: application/http Content-Transfer-Encoding:binary Content-ID: 2 POST [Organization URI]/api/data/v9.2/[tableName] HTTP/1.1 Content-Type: application/json;type=entry [Registered Data in JSON] --changeset_[changeset GUID] Content-Type: application/http Content-Transfer-Encoding:binary Content-ID: 3 POST [Organization URI]/api/data/v9.2/[tableName] HTTP/1.1 Content-Type: application/json;type=entry [Registered Data in JSON] --changeset_[changeset GUID] Content-Type: application/http Content-Transfer-Encoding:binary Content-ID: 4 POST [Organization URI]/api/data/v9.2/[tableName] HTTP/1.1 Content-Type: application/json;type=entry [Registered Data in JSON] --changeset_[changeset GUID]-- --batch_[batch GUID]--
"Content-ID"が存在しているなど、SharePoint REST APIのときと微妙に呼び出しが変わっている箇所がありますね。
このような形式になるように登録データを整形していきます。
SharePoint REST APIのとき同様、"Batch ID"と"Changeset ID"が必要になってくるのでこれらを追加しておいてください。
また、"Organization URI"も作成しておいてください。
登録データの作成
大枠はSharePoint REST APIの時と同じなので省略して書いていきます。
まずは"changeset"を作成していきます。
開始(from)
range(0, length(outputs('Origin_Data')))
マップ(select)
concat( '--changeset_', outputs('Changeset_ID'), uriComponentToString('%0A'), 'Content-Type: application/http', uriComponentToString('%0A'), 'Content-Transfer-Encoding:binary', uriComponentToString('%0A'), 'Content-ID: ', add(item(), 1), uriComponentToString('%0A'), uriComponentToString('%0A'), 'POST ', outputs('Organization_URI'), '/api/data/v9.2/cr1f8_mysampledataverses HTTP/1.1', uriComponentToString('%0A'), 'Content-Type: application/json;type=entry', uriComponentToString('%0A'), uriComponentToString('%0A'), '{', uriComponentToString('%0A'), uriComponentToString('%09'), '"cr1f8_name": "', outputs('Origin_Data')?[item()]?['GUID'], '",' ,uriComponentToString('%0A'), uriComponentToString('%09'), '"cr1f8_number": ', outputs('Origin_Data')?[item()]?['Number'], ',' ,uriComponentToString('%0A'), uriComponentToString('%09'), '"cr1f8_text": "', outputs('Origin_Data')?[item()]?['Text'], '",' ,uriComponentToString('%0A'), uriComponentToString('%09'), '"cr1f8_date": "', outputs('Origin_Data')?[item()]?['Date'], '"' ,uriComponentToString('%0A'), '}' )
今回だと連番となる"Content-ID"を設定したいので、0~登録データ数分だけの連番が設定された配列を「開始」(from)に設定しています。
/api/data/v9.2/cr1f8_mysampledataverses HTTP/1.1
のcr1f8_mysampledataverses
は自身のテーブル名に合わせてください。
また、"v9.2"となっているバージョンは記事作成時のバージョンで記載していますので、適宜最新の情報に置き換えてくださいね。
'{', uriComponentToString('%0A'), uriComponentToString('%09'), '"cr1f8_name": "', outputs('Origin_Data')?[item()]?['GUID'], '",' ,uriComponentToString('%0A'), uriComponentToString('%09'), '"cr1f8_number": ', outputs('Origin_Data')?[item()]?['Number'], ',' ,uriComponentToString('%0A'), uriComponentToString('%09'), '"cr1f8_text": "', outputs('Origin_Data')?[item()]?['Text'], '",' ,uriComponentToString('%0A'), uriComponentToString('%09'), '"cr1f8_date": "', outputs('Origin_Data')?[item()]?['Date'], '"' ,uriComponentToString('%0A'), '}'
ここは登録したいデータに置き換えます。
Bodyを作成する
この選択アクションで作成された"changeset"をもとに"batch"を作成していきます。
--batch_@{outputs('Batch_ID')} Content-Type: multipart/mixed;boundary=changeset_@{outputs('Changeset_ID')} @{join( body('選択(Dataverse)'), concat( uriComponentToString('%0A'), uriComponentToString('%0A') ) )} --changeset_@{outputs('Changeset_ID')}-- --batch_@{outputs('Batch_ID')}--
これでBodyは作成完了ですので、あとはAPIを投げるだけですね。
Dataverse Web APIを実行する
これまで作成された情報を元に、Dataverse Web APIを実行してBulk Insertを行っていきます。
@{outputs('Organization_URI')}/api/data/v9.2/$batch
ヘッダー
{ "Content-Type": "multipart/mixed;boundary=batch_@{outputs('Batch_ID')}", "OData-MaxVersion": "4.0", "OData-Version": "4.0", "Accept": "application/json" }
本文
@{outputs('作成(Dataverse)')}
URIやヘッダーに記載のバージョンは記事作成時のバージョンで記載していますので、適宜最新のバージョンに置き換えてくださいね。
認証情報に設定してあるのは以前ブログで紹介したときと同じものを利用しています。
今回はセキュリティ上で保護できるように「作成」アクション利用しましたが。
おわりに
Power AutomateからDataverseへのBulk InsertはDataverse Web APIを利用する必要があり、Dataverse Web APIを実行するためのアクションは現時点では用意されていない(はず!)のでプレミアムアクションである「HTTP」アクションを利用する必要があります。
Dataverseを利用できる環境を考えるとあまりプレミアムかどうかは考慮すべき事項じゃないかもですが。
また、今回はPower Automateからの登録ということで紹介しませんでしたが、Dataverseへのデータ登録でいうとデータフローを活用したほうが目的としてはあっているのではないかな?と思います。
データフローについても、気が向いたらか要望あればまたまとめますねー