Power Automate を使ってリスト内のアイテムを一気に他のリストに移動させたいということもあります。しかし、残念なことに、SharePoint Designer で開発するワークフローには存在していた「アイテムのコピー」というアクションは SharePoint コネクターにはありません。
一つ断っておくとすると、SharePoint Designer での開発はサイトを越えた処理は基本的にはできず、SharePoint REST API を使うなどしていましたので、もともとそう高機能だったというわけでもありません。
話を戻しましょう。
Power Automate の場合は元のアイテムのデータをもとに新しいリストにアイテムを新規に作成するという、コピー作成を行うことになります。「移動」にしたければ最後にアイテムを削除すればよい。
まずは機能検証するためにコピーまでとし、元のリストアイテムの削除はしません。これを実現する最も手軽な方法は、次の SharePoint コネクターのアクションを使うことです。
- 複数の項目の取得 (Get items)
- 項目の作成 (Create an item)
さて、複数のアイテムがあるのでこれを一気にコピーしたいのですが、とりあえず手動でフローをトリガーしてやることにします。処理が終わったらMicrosoft Teams にチャットメッセージを投稿するようにします。以上を踏まえると以下のようなフローの組み立てがシンプルです。
さて、フローをテスト実行し、手動開始してみます。今回、元のリストには1,000件以上のアイテムがあります。が、試すと Apply to each では 100件までしか処理していないことが分かります。
さて、なぜこうなっているのか?
昔から SharePoint の一括操作(バルク処理)は100がしきい値というのはおなじみのところであり、SharePoint の API もクエリを使って取得するデータの上限は既定値が 100 というのもよくある話。さて、これはどこの設定が関わっているのか確認してみましょう。
先ほどの「複数の項目の取得」の詳細オプションを確認すると「上から順に取得」という項目あります。英語だと Top Count という項目です(英語の方が分かりやすい...)。SharePoint の開発をしたことのある方なら、ここでピンとくるかもしれません。これが要はREST API の引数の $top に当たるわけです。これが既定値のままだと、100アイテムを取得するという既定の動作となるのです。
この値を2000ほどに変更しておくと、今度は1,000件以上のアイテムが取得できました。
なお、「上から順に取得」で指定できる上限は SharePoint は一度の呼び出しで最大 5,000までしか取得できません。
そして このアクションのあとに Apply to each を使用しますが、 Office 365 およびフリーのライセンスでは5,000までしか対応していません。これ以上の値を指定したい場合は Power Automate per flow または per user (もしくは Plan2 か Plan1)が必要になります。有料プランであれば上限は100,000 になります。
このことについては詳しくは下記に記載されているので一度目を通しておきましょう。
さて、5,000以上指定したい場合は、上記のライセンスを持っているのであれば、「複数の項目の取得」アクションの設定から、改ページ (Pagination) のしきい値をたとえば20,000などに指定します。
改ページをオンにすることで、しきい値の指定がなければすべてのアイテムを、もしくはしきい値があればその値に達するまで呼び出しを続けるようになります。「改ページ(Pagination)」に関しては次のブログに記載されています。
Do Until の利用
ところで Power Automate per user や per flow などの有料プランを持っていない場合に対処方法はあるのか?
Do Until を使う方法であれば、これをクリアできそうです。たとえば、上限である5,000アイテムずつ繰り返し取得して行くというアプローチが取れるようになります。ただし、フローは若干、複雑になります。
まず変数の準備。次のように変数を用意します。
次に Do Until を挿入します。条件は ItemEmpty が true になるまで。
あとはこのコンテナの中に「複数の項目の取得」アクションと「項目の作成」アクションを挿入します。
「複数の項目の取得」アクションの設定で改ページをオンにします。しきい値は5,000にしておきます。
また「複数の項目の取得」アクションのフィルター条件に TargetItemID の値以上を指定します。
Do Until コンテナ内の処理の続きとして条件を指定します。
条件は「empty(body('複数の項目の取得')?['value'])」が true です。
「はい」のときは ItemEmpty を true に設定し、「いいえ」のときは TargetItemIDの値に「複数の項目の取得」アクションで取得した最後のIDを格納します。式は次の通り。
このIDを使ってスライディングウィンドウを作るイメージです。
全体像は次の通りです。
謝辞および参考資料
Power Automate を使って SharePoint のアイテムを一括で処理するところで悩んでいたところ、それを Twitter でつぶやいたら Yellow11(@br_Yellow11) さんが助け舟を出してくださいました!
ここら辺が参考になりませんか?https://t.co/Vhga6toEoy
— Yellow11 (@br_Yellow11) April 3, 2020
Do Until の利用か! なるほど、と思い、いろいろと調べていたところ、細かいところが分かったので、忘れないうちに記事にしようと思い立ったわけです。
また、海外の方が書かれている下記の記事も見つけることもでき、これを含めて今回の日本語の記事にまとめました。
How to get more than 5000 items from SharePoint Online in Flow
皆さんのおかげです
Pay it forward !!