SharePointリストのデータをDataverseへコピーする（データフロー）

Power Apps でアプリを作る場合、データソースとして SharePoint がよく採用されます。
扱いやすいですし、気軽に試せるのもいいですね。

　データ量が多くなった場合や公開の範囲を変更する場合など、 Dataverse へ移行したい！という要望をよく聞きます。この場合考慮事項はそれなりにありますが、アプリの変更はそんなに難しくありません。
　今回は「データをコピーする」ことを考えてみます。

# SharePoint リストと Dataverse テーブルの定義

まずはテスト用にリストを作ります。左からテキスト、選択肢、数値（小数点１けた）になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/3e822a54-bfac-540d-4bdc-e3cb6ab40569.png)

「選択肢」の扱いはSharePointとDataverseで異なっており、変換は結構癖があります。それについては別途記事にしようかと思っています。ここではDataverse側はType列はテキストにしてみます。
なのでDataverse側は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f79bd5de-9e6b-7942-c9d3-2d071b58579e.png)

# まずは Power Automate クラウドフローでデータのコピーをしてみる

SharePointリストにデータが入ったらそれをDataverseに送ればいいので、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/dc3c9ec7-dd59-34bc-ff8a-f484966f43dd.png)

データをリストに追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/769fe6e2-a8e9-cb87-084b-9cab52d7938a.png)

確かにDataverseに値が入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/1035ce63-cfd7-d410-97bf-6e0adea49bed.png)

「アイテムが作成または変更されたとき」というトリガーもあるので、値が変更されたときもDataverse側で行を指定できれば更新できそうです。

# データフローを使ってみる

もう少しスマートにデータのコピーをする方法として「データフロー」という機能があります。
先ほどのクラウドフローはいったんオフ（無効）にしておき、こちらの機能を試してみましょう。

1. データフロー→新しいデータフローを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/9c3e536e-3571-fe61-fd77-f497804667f3.png)

2. 名前を付けて作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/769eefe2-ca50-ba7c-686e-b4c0860f817c.png)

3. データソースから SharePoint リストを選択します。これは「元」側ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/8a0d2381-1c7e-dc01-0af8-7d5abd608d7d.png)

4. サイトのURLを入力します。リストのURLではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f6049bd9-4561-b7ed-a0ff-9fa2de18c83f.png)

5. 組織アカウントを指定してサインインします。もちろん、今作業しているアカウントの情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/cef97865-4e18-b5ec-3fa3-b75d776b10fe.png)

6. 以下のような表示になったら右下の[次へ]を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/2ddb9eaf-ab94-1e23-1bf8-7201ee78dfae.png)

7. 左側ペインにサイトのリストやそうでないもの（？）の一覧が出てきますので意中のリストにチェックを入れます。すると右側にリストの中身が表示されます。[データの変換]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/cb418e66-3bad-70f1-f6ab-74afeae4357c.png)

8. すると以下のような画面が出てきます。なぜか[Id]と[ID]という列があるので、Idのほうを削除します。[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/07af6af8-46cf-362c-9788-93d86e2d268a.png)

9. 既存のテーブルを読み込むを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/b2d32dc7-3b5a-258d-d079-f1088cee4cd6.png)

10. 意中のテーブルを選択します。テーブル名は表示名ではなく内部名になっているのでこの例のように*****_テーブル名のような形式になっています。(crf42はお使いの環境によって変わります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/bdad5a04-2d49-53fc-6081-975ee8f1e3ad.png)

11. 列マッピングを行います。今回の場合リストの列とテーブルの列を同じ名前にしているのでわかりやすいですが、そうでない場合は正しくマッピングしてください。できたら[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/a1472e2d-ade5-4168-2816-f521eded13eb.png)

12. 最後に[自動的に更新]を選択して更新頻度を設定します。右下の[公開]を押すと実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/4ba3853a-7026-423e-6508-990c9f44c267.png)

13. 公開済みになったら成功です。最終更新に日付が表示されたら同期も完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/07332f5e-1be6-d5c4-f6b7-21ee259f22f6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/42bb99e8-415a-a6ba-8cf2-23b562e24e1d.png)

14. テーブルに値が入りました。「ライオン」のエントリが重複していますが、これは先ほどのクラウドフローで入れたデータですね。そのまま残っていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/a6832ee6-8196-d043-d52d-39b108b95e5c.png)

15. SharePoint リストの値を変えてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/b31763a2-5f77-fbbf-2537-0b32242081ba.png)

16. 変更していないデータも重複登録されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/55f522e2-7a8a-bfb0-1669-dc325c20b6cb.png)

17. 何も変更しないで次の更新を待ってみます。するとやっぱり重複登録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/410f5c77-4ce7-bae7-d180-5745632e3e96.png)

# 重複しないようにする

このままだと更新があってもなくても重複したデータが格納されることになります。ある時点でのスナップショットをとってロールバックする…など使い道はなくはなさそうですが、今回はSPOリストとDataverseテーブルを同じにするのが目的なのでそのように設定してみます。

1. Dataverse テーブルのキーをクリックし、[キーの追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/971063a1-a26f-f26a-7c17-14ef29519657.png)

2. Title をキーにします。（キーが重複不可になります。今回の例だと、Weightの異なるアメショを２つ以上登録できなくなります。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/caf39dd1-abe7-0eec-33bf-14c672c0ce77.png)

3. データフローを[編集]します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/2c6fefb8-899f-d4bc-4d88-64a5a2648b78.png)

4. [次へ]をクリックしてマップテーブルの編集画面にします。[読み込みの設定をリセット]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/72d06053-6d88-ca8f-6e21-40fce15b436e.png)


5. キー列が設定されていることを確認し、[クエリ出力に存在しない行を削除します]にチェックを入れます。ソース列を設定しなおして[公開します]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/843e8fa5-a6fa-2584-690f-85182712fde3.png)

6. 最終更新（日時）が更新されたら、テーブル内のデータを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/caaa40c4-e9b1-c681-f31d-519c131b82fa.png)

7. SPO リストを更新します（シーズーのWeightを追加、ライオンを削除、ケルベロスを新規作成）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/ba4f44e1-aee9-6c92-6fb9-3f1b14832785.png)

8. データフローで[最新の情報に更新]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/c18847e5-365b-4e01-90e6-74e1076fa7da.png)

9. 最終更新（日時）が更新されたら、テーブル内のデータを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/5a28c5ea-5730-f5e5-adde-aa6eb141739f.png)


今度はリストから消えたアイテム（行）はテーブルからもきえており、追加・更新も同様にできています。

# まとめ

SPOリストからDataverseテーブルへの移行は、可能です。
データのコピーについては、単純な仕組みであればAutomateクラウドフローでもいいですが、データフローを使うとよりよいでしょう。
更新間隔は最短で1分に設定できますが、それでもわずかにリストとテーブルの情報に差異が生じるタイミングは発生するのでご注意ください。
Dataverse は強力なデータベースであり、Power Platformのメインのデータソースになりますので、SPOリストのサイズやアクセス権制御等気になりだしたら、ぜひDataverse導入をご検討ください。