コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Power AutomateでDataverseに対してBulk Insertを行う


スポンサードリンク

はじめに

この記事は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を利用します。

learn.microsoft.com

SharePoint Listの時と同様にbatch操作での複数件登録を行います。

learn.microsoft.com

ドキュメントを見てもらえればわかる通り、要求のBodyにはSharePoint REST APIと似たような形式の要求が必要です。

よって、ここの要求はSharePoint REST APIでBulk Insertしたときと同様に、「選択」アクションと「作成」アクションでBodyを作成していきます。

Dataverse Web APIの利用に関しては以下記事で紹介していますので、こちらをご参照ください。

koruneko.hatenablog.com

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を行っていきます。

URI

@{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へのデータ登録でいうとデータフローを活用したほうが目的としてはあっているのではないかな?と思います。

learn.microsoft.com

データフローについても、気が向いたらか要望あればまたまとめますねー


スポンサードリンク