見出し画像

Power Automateで大量データをSharePointリストに一括登録する

はじめに

分析屋の渡邊です。Power Automateは、Microsoftが提供する業務自動化ツールで、プログラミングの知識がなくても、直感的な操作でワークフローを作成できるのが特徴です。一方、大量データを扱うには処理に長時間かかったり、アクション回数上限の制約にかかったりと扱いづらい面があります。
とはいえ、業務環境上、PowerAutomateで数万件/日単位のデータをSharepointリスト上で扱わなければならない場面があります。そのような場合に、ODataの$batchクエリで効率よく処理することが可能ですので、その方法についてご紹介します。

Microsoft参考サイト


ODataとは

ODataのbatchクエリは、複数のCRUD操作を一つのHTTPリクエストでまとめて実行できる機能です。例えば、PowerAutomateで200件のアイテムをSharePointリストに追加したい場したい場合以下のようになります。

一般的な処理:「項目の追加」アクションを200回実行して200件のアイテムを追加
$batchクエリ:「SharePointにHTTP要求を送信します」アクション1回で200件のアイテム追加が可能

複数操作の一括処理:GET、POST、PUT、DELETEなどの異なるHTTP操作を一つのリクエストにまとめることができます。これにより、複数のデータ操作を一度に実行できます。

MIMEタイプの使用:$batchリクエストは、multipart/mixedというMIMEタイプを使用して、各操作を境界で区切ります。これにより、異なる操作を一つのリクエスト内で明確に分けることができます

OData公式ドキュメント

今回のシナリオ

CSVファイルの準備と配置

Sharepointリストに登録する元データとなるCSVファイル(データ件数:6000件)を準備し、SharePointライブラリにアップロードします。今回はCustomerId、RegistrationDate、Statusの3項目を持ったデータを作成しました。

SharePointライブラリ
import_data.csv

2.Power Automateでのフロー作成

CSVファイルの取得:Power AutomateでSharepointライブラリからCSVファイルを取得します。
データの分割:CSVデータを200件ごとに分割し、ODataの$batchクエリオプションを使用して一括登録します。
具体的には以下のようなスクリプトをフローの中で作成し、HTTPリクエストのボディとして設定します。

フローの設定

#1.ファイルの取得(プロパティのみ)

SharePointライブラリからcsvのファイルプロパティを取得します。

#2.ファイルコンテンツの取得

csvファイルのコンテンツを取得します。

#3.#2で取得したバイナリのコンテンツをテキストに変換

#4.テキストを改行コードで分割

※変数varNewLineCode
は以下の内容で事前に設定しておく
decodeUriComponent('%0D%0A')

5.ヘッダー行を覗いて配列を取得

skip(outputs('作成_split_rows'), 1)

200件ずつのバッチに分割するためのインデックスを生成

range(
    0,
    add(
        div(
            length(body(#5のアクション)), 
            200
        ),
        if(
            equals(
                mod(
                    length(body(#5のアクション)), 
                    200
                ), 
                0
            ), 
            0, 
            1
        )
    )
)

以下、分割した数分(今回は6000件/200件=30回)繰り返し(apply to each)

#7.作成

take(
    skip(
        body(#5のアクション'), 
        mul(
            items('それぞれに適用する'), 
            200
        )
    ), 
    200
)

この式は、以下の操作を順に行っています:

①アレイ全体を取得: body('#5のアクション')
②スキップする要素数を計算: mul(items('それぞれに適用する'), 200)
③指定した数の要素をスキップ: skip(...)
次の200件を取得: take(...)
200件分の$batchスクリプトを結合し、1件のリクエストスクリプトとする。

#8.選択

200件分の$batchスクリプトを結合し、1件のリクエストスクリプトとする。

concat(
'--changeset_', <SharePointリスト名>,
uriComponentToString('%0A'),
'Content-Type: application/http',
uriComponentToString('%0A'),
'Content-Transfer-Encoding: binary',
uriComponentToString('%0A'),
'POST https://<SharePointサイト名>/_api/web/lists/getbytitle('SharePointリスト名')/items HTTP/1.1',
uriComponentToString('%0A'),
'Content-Type: application/json;odata=verbose',
uriComponentToString('%0A'),
uriComponentToString('%0A'),
'{',
'"__metadata": {"type": "SP.Data.', 'SharePointリスト名', 'ListItem"},',
'"CustomerId": "', split(item(), ',')[0], '",',
'"RegistrationDate": "', split(item(), ',')[1], '",',
'"Status": "', split(item(), ',')[2], '"',
'}',
uriComponentToString('%0A'),
uriComponentToString('%0A')
)

#9.#8にリクエストヘッダー・フッターを付与

concat(
    '--batch_', 
    'SharePointリスト名',
    uriComponentToString('%0A'),
    'Content-Type: multipart/mixed; ',
    'boundary="changeset_', variables('varListName'), '"',
    uriComponentToString('%0A'),
    body('結合'),
    uriComponentToString('%0A'),
    '--changeset_', 
    'SharePointリスト名',
    '--',
    uriComponentToString('%0A'),
    '--batch_', 
    variables('varListName'),
    '--'
)

#10.SharePointにHTTP要求を送信します

SharePoint REST APIを発行します

$batchクエリを使用することで、6000件のアイテム追加が5分で完了しました。
一方で一般的な「項目の作成」アクションで6000件追加した場合は35分かかりましたので、処理時間は7分の1になりました。

このように$batchクエリを使用することで、処理時間の削減とアクション回数の削減の両方が実現できるのでよかったら試してみてください!


ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

分析屋ではPower BIを使ったデータ可視化に関するサービスもございます。Power BIやPower Automateに関するお困りごとがございましたらお気軽にお問い合わせください。

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。