この記事では、Microsoft Flow を使用して 2 つのデータ ソース間でアイテムを効率的にコピーする方法について説明します。
たとえば、あるサイトの SharePoint リストから 2 つ目の SharePoint サイトにすべてのアイテムをコピーするフローを構築できます。 フロー プロセスは、SharePoint リストと SQL テーブル、または Flow でサポートされている 100 を超えるサービスのいずれかとの間でも機能します。
適用対象: Power Automate
元の KB 番号: 4467880
詳細
必要なすべての列を設定する必要があります。 2 つのデータ ソース内のすべての列の名前が同じである必要はありませんが、2 つのデータ ソース間で項目を一意に識別できる列が少なくとも 1 つ (選択されている) 必要があります。
次の例では、 Title 列が両方のソースで同じであることを前提としています。
トリガーをセットアップする
最初の手順では、ソース SharePoint リストにトリガーを設定します。 すべての項目の変更 (新しい項目だけでなく) をキャプチャするため、 SharePoint - 既存の項目が変更されたとき トリガーを選択する必要があります。
Note
トリガー名は既存の項目に対する変更のみを示しますが、トリガーはリストに追加された新しい項目にも反応します。
宛先内の項目を検索する
宛先リスト内の項目を検索して、その ID を取得して更新します。 Flow には Filter アクションがありますが、このアクションは SharePoint からすべてのリスト アイテムをダウンロードするため、このシナリオではこのアクションを使用しないでください。 プロセスが遅くなり、クォータが使い切られ、リストに 256 個を超える項目がある場合は機能しません。
代わりに、SharePoint の Get アイテム ステップで Filter Query フィールドを使用する必要があります。 Get アイテムアクションを追加し、 [詳細オプションの表示] を選択すべてのフィールドを表示します。 ソース リストの行のタイトルと一致する場合は、 Filter Query フィールドに次のように入力します (単一引用符が含まれていることを確認してください)。
Title eq '[動的コンテンツからタイトルを選択]'
必ずしも、2 つのデータ ソース間に厳密な 1 対 1 の列マッピングを設定する必要はありません。 たとえば、ソース リストに First Name および Last Name 列があり、宛先リストに Full name 列がある場合は、List Name フィールドに「FullName eq '[First name] [Last name]」と入力できます。
項目が存在するかどうかを確認する条件を追加する
宛先リストから項目を取得すると、次のいずれかの状況が該当します。
- アイテムはまだ宛先に存在しないため、作成する必要があります。
- アイテムは既に宛先に存在し、更新する必要があります。
条件を使用して、実際の状況を判断します。 これを行うには、次の手順を実行します。
[新しいステップ]、[条件の追加] の順に選択します。
Condition カードの左側のテキスト ボックスで、[動的コンテンツの追加選択。
Note
Get アイテムによって返されるすべての項目の一覧を含むコレクションの名前は value です。 Get アイテム (既存の項目が変更された場合はトリガーからではなく) から値を選択してください。
[Condition カードで、Relationship ボックスで 等しいを選択し、Value ボックスに「0」と入力します。
詳細モードで length 関数を追加します。 動的な値のコンテンツは項目のリストを返すので、これは重要です。 リストの長さ (値ではない) が 0 (ゼロ) かどうかを判断する必要があります。
詳細モードで、body('Get_items')?[' の周囲に「length()」と入力します。value']式。 条件は次のようになります。
アイテムを作成する
IF YES ブランチで、SharePoint Create item ステップを追加します。
Get アイテム手順で使用したサイトと一覧を選択します。 Create itemでは、トリガーからのフィールドのみを使用して各列を設定する必要があります。 Get 項目ステップのデータは、ソース リストではなく宛先リストから取得されるため、使用しないでください。 アイテムの取得 トリガーの上に表示されます。 一番下までスクロールして見つけることを確認します。
項目を更新する
IF NO ブランチで、SharePoint Update 項目ステップを追加します。
サイトと一覧を選択します。 次に、 Get 項目 ステップから返される ID を選択します。
ID を追加すると、Apply が Update 項目ステップの周囲に自動的に追加されます。 これは正しい動作です。 Get 項目ステップで使用したクエリが正確な場合、コンテナーはコピーする項目のみを更新します。 残りのフィールドを完了した後 ( Get 項目からの出力ではなく、トリガーからの出力を使用していることを確認 呼び出し)、条件ブロックは次のスクリーンショットのようになります。
フロー プロセスの制限事項
フロー プロセスを使用すると、最初の一覧で行われた変更を 2 番目の一覧に反映できます。
プロセスには、次の制限が適用されます。
- 項目が最初のリストから削除された場合、項目は 2 番目のリストから削除されません。 これは、 アイテムが削除された場合にトリガーがないためです。 この場合、削除が発生したときにフローに通知する方法はありません。 代わりに、SharePoint リスト (または SQL テーブル、またはその他のデータ ソース) からアイテムを削除する代わりに、アイテムが不要になったり関連したりすることを示す列を追加することをお勧めします。 その列は、2 つのリスト間で同期されます。
- 2 つのリスト間でアイテムの同期を維持するために使用しているフィールドに変更が加えられた場合、コピー先リストに新しい項目が作成されます。 たとえば、ユーザーの Name 列を使用して 2 つのリスト間をコピーし、そのユーザーの Name 列が変更された場合、フローはその変更を既存のアイテムへの更新ではなく新しいアイテムと見なします。 Name列が変わらないことを保証できる場合は、この制限の影響を受けることはありません。 ただし、 Name 列が変更された場合は、最初のリストにアイテムの ID を格納する列を宛先リストに追加する必要があります。 この場合、 Name を使用してアイテムを検索する代わりに、 IDを使用できます。 (ID は常に一意であることが保証されます)。
- このプロセスは双方向の同期ではありません。つまり、移行先リストで項目が更新された場合、変更はソース リストに反映されません。 フローで双方向同期を設定しないでください。これは、追加の変更なしで無限ループが作成されるためです。 たとえば、リスト A はリスト B を更新し、リスト B はリスト A を更新し、リスト A はリスト B を再度更新します。