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

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


スポンサードリンク

Power Automateを利用してSharePointリストのテナント間移行を行う


スポンサードリンク

はじめに

SharePointリストのテナント間移行を行いたい人なんて少数かもしれませんが、この記事では以下のやり方も纏めてあります。

  • Power Automateを用いて特定のSPOリストからフィールド情報を取得する
  • Power Automateを用いてリストを作成する
  • Power Automateを用いて特定のリストにフィールドを追加する
  • Power Automateのアクションをコピペする(おまけ)

PnPとか使ってスクリプト書く方法もありますが、テナントによっては管理者に許可されていない場合もありますからね。

ざっくり構成

こんな感じで

  1. Tenant A(移行元)でリストのフィールド情報をPower Automateを利用して取得
  2. Tenant B(移行先)のPower Automateに 1. で取得した情報を設定
  3. Tenant Bにリストを作成

を行います。

手順2は手動ですね。

フローを作成する

リストの情報を取得する

フローの全体イメージはこんな感じです。

こちらは移行元のテナント(Tenant A)で作成して実行します。

アクションを順にみていきましょう。

リストが存在するサイトのアドレスでは取得したいリストが存在するアドレスのリンクを設定します。

リスト名では取得したいリストの表示名を設定します。

SharePoint に HTTP 要求を送信しますで上記変数で設定した情報をもとにリストのフィールドを取得します。
今回の設定では、デフォルトフィールドは取得しないように省いています。
ユーザが作成したフィールドだけが欲しいですからね。

もしすべてのフィールドを取得したければ、filterを外してください。

このアクションの出力結果として、以下のようなbodyが取得できます。

欲しいのはd.resultsなので、結果を加工して作成に格納します。
この結果は配列で取得されるのでarray関数を利用しています。

array(body('SharePoint_に_HTTP_要求を送信します')?['d']?['results'])

これで対象リストのフィールド情報が取得できました。

「作成」で得られた出力はこの後使いますので控えておいてください。

リストを作成してフィールドを作成する

フローの全体イメージはこんな感じです。

こちらは移行先のテナント(Tenant B)で作成して実行します。

まずはリスト作成に必要な情報だけみていきましょう。

リストを作成するサイトのアドレスにはリストを作成したいサイトのアドレスを設定します。

リスト名には作成したいリストの内部名(表示名にも利用します)を設定します。

残り二つの変数は、フィールド作成の時に利用するものですので、後述します。

SharePoint に HTTP 要求を送信します(リストの作成)で先ほど設定した2つの変数をもとにリストを作成します。

説明を変えたい場合は、"Description"を変更してください。

リストを作成している箇所は以上です。

続いて先ほど作成したリストに先ほど取得したフィールド情報をもとにフィールドを作成していきます。

ListFieldObjに先ほど移行元で取得したフィールド情報をコピペします。

booleanは条件分岐のtrue or falseの判定に利用したいだけですので、trueとだけ設定しておきます。

続いてリストのフィールド作成を実行していくわけですが、フィールド作成は1フィールドずつしか行えません(多分。知らんけど。)

試しにArray情報を渡してみたらObject情報を渡せ。とのエラーで怒られました。

よって先ほど設定したArray変数からObject単位で情報を取得してアクションを実行していこうと思います。

これを実現するためにApply to eachを利用しています。

まず最初のJSON の解析ではApply to eachのitems()つまり、1フィールドの情報に対して解析を行っています。

ここは、フィールドの型などによってサンプルから生成したスキーマが異なり、そのまま利用するとエラーになってしまうので、地味にめんどくさかったですね。

続いて、JSON の解析(metadata)では__metadataの内容のうちtypeだけが欲しかったので、解析を行っています。
'body('JSON_の解析')?['__metadata']?['type']でもよかったかもですね。(試してはないです)

いよいよフィールドの作成を行っていくのですが、フィールドの型が選択肢か否か。でPOSTする際のBodyが変わってきます。

今ブログを書いているときに思いましたが、型がSP.FieldChoiceどうか?で判断すればよかったかな?とは思いましたが、今回作成したフローでは選択肢が設定されているかどうか?で判断しています。

empty(body('JSON_の解析')?['Choices'])選択肢が空であれば、Choicesを利用しません。

まずがChoicesを利用しない(Bodyに設定しない)パターンです。

SharePoint に HTTP 要求を送信します(フィールドの作成)では選択肢を作成しない場合のフィールドの作成を行っています。
リストは先ほど作成したリストを指定しています。

続いてChoicesを利用する(Bodyに設定する)パターンです。

Choiceで得られた結果は以下のようになっています。

"Choices": {
    "__metadata": {
        "type": "Collection(Edm.String)"
    },
    "results": [
        "選択肢1",
        "選択肢2",
        "選択肢3"
    ]
}

このうち欲しいのはresultsの結果ですので、JSON の解析(Choices)で抜け出せるようにしてあげます。

SharePoint に HTTP 要求を送信します(フィールドの作成(Choicesあり))では選択肢を作成する場合のフィールドの作成を行っています。
選択肢には先ほどの解析で得られた選択肢を設定します。

リストは先ほど作成したリストを指定しています。

以上でTenant A(移行元)からTenant B(移行先)へSPOリストを移行させる仕組みを作成することができました。

とはいえ色々な型やフィールドの設定などは未検証なため正しく動かない部分があるかもです。

もしそのような場合は、どのようなフィールド設定がエラーとなったか?エラー内容はどのようなものか?を教えていただけると助かります。

フローコピペ用コード

リスト情報を取得する

リストが存在するサイトのアドレス

リスト名

SharePoint に HTTP 要求を送信します

作成

リストを作成してフィールドを作成する

リストを作成するサイトのアドレス

リスト名

ListFieldObj

boolean

SharePoint に HTTP 要求を送信します(リストの作成)

Apply to each

なにこのコード?どうやって使うの?

いずれかのコードをクリップボードにコピーした状態でフローを開いて、

「自分のクリップボード > Ctrl + V」をすると、アクションが選択肢に追加されますので、それを選択すると、フロー内にアクションが追加されます。
便利

ここには自分のテナント内でコピーしたアクションであればCtrl + Vをしなくとも、自動でアクションが溜まっていきます。
もちろんログアウト行ったりするとリセットされます。

ただこの機能、プレビューなだけあって「条件」アクション内や「スイッチ」アクション内などにはこの方法でアクションを追加することはできない。などの制限があるようです。
残念

おわりに

短時間で作ったフローなのでちょっと作り雑だったり検証不足だったりする箇所があります。
お気づきの点があればご指摘いただければー

それでは


スポンサードリンク