Flow を使用して 2 つのデータ ソース間で項目をコピーする方法

この記事では、Microsoft Flow を使用して 2 つのデータ ソース間でアイテムを効率的にコピーする方法について説明します。

たとえば、1 つのサイト内の SharePoint リストから 2 つ目の SharePoint サイトにすべての項目をコピーするフローを構築できます。 フロー プロセスは、SharePoint リストと SQL テーブル、または Flow でサポートされている 100 を超えるサービスの間でも機能します。

適用先:Power Automate
元の KB 番号: 4467880

詳細

必要なすべての列を設定する必要があります。 2 つのデータ ソース内のすべての列の名前が同じである必要はありませんが、2 つのデータ ソース間で項目を一意に識別できる列 (任意) が少なくとも 1 つ必要です。

次の例では、 Title 列が両方のソースで同じであると仮定します。

トリガーを設定する

最初の手順は、ソース SharePoint リストにトリガーを設定することです。 すべての項目の変更 (新しい項目だけでなく) をキャプチャするため、 SharePoint - 既存のアイテムが変更されたときにトリガーを選択する 必要があります。

Sharepoint で [既存のアイテムが変更されたとき] トリガーを選択するスクリーンショット。

注:

トリガー名には既存の項目への変更のみが含まれますが、トリガーはリストに追加された新しい項目にも反応します。

宛先内の項目を検索する

宛先リスト内の項目を検索して、その ID を取得して更新します。 Flow には フィルター アクションがありますが、このアクションは SharePoint からすべてのリスト アイテムをダウンロードするため、このシナリオでは使用しないでください。 プロセスが遅くなり、クォータが使い切られ、リストに 256 個を超える項目がある場合は機能しません。

代わりに、SharePoint の [アイテムの取得] ステップの [フィルター クエリ] フィールドを使用する必要があります。 [アイテムの取得] アクションを追加し、[詳細オプションの表示] を選択してすべてのフィールドを表示します。 ソース リストの行のタイトルと一致する場合は、[ フィルター クエリ ] フィールドに次のように入力します (必ず単一引用符を含めます)。

Title eq '[動的コンテンツからタイトルを選択]'

[アイテムの取得] ステップの [フィルター クエリ] フィールドにタイトルを入力するスクリーンショット。

必ずしも、2 つのデータ ソース間に厳密な 1:1 列のマッピングを行う必要はありません。 たとえば、ソース リストに [名] 列と [] 列があり、変換先リストに [完全名] 列がある場合は、[リスト名] フィールドに FullName eq '[First name] [Last name]" と入力できます。

項目が存在するかどうかをチェックする条件を追加する

宛先リストから項目を取得すると、次のいずれかの状況が当てはまります。

  • アイテムはまだ宛先に存在しないため、作成する必要があります。
  • アイテムは宛先に既に存在し、更新する必要があります。

条件を使用して、実際の状況を判断します。 これを行うには、次の手順を実行します。

  1. [ 新しいステップ] を選択し、[ 条件の追加] を選択します。

  2. [条件] カードの左側のテキスト ボックスで、[動的コンテンツの追加] を選択します。

    注:

    Get items によって返されるすべての項目の一覧を含むコレクションの名前は value です。 [アイテムの取得] (既存の 項目 が変更された場合はトリガーからではなく) から値を選択していることを確認します。

    スクリーンショットは、条件を追加するときに値コレクションが [項目の取得] に一覧表示されていることを示しています。

  3. [条件] カードで、[リレーションシップ] ボックスで [等しい] を選択し、[] ボックスに「0」と入力します。

  4. 詳細モードで length 関数を追加します。 動的値コンテンツは項目の一覧を返すので、これは重要です。 リストの長さ (値ではなく) が 0 (ゼロ) に等しいかどうかを判断する必要があります。

  5. 詳細モードでは、body('Get_items')?[' の周囲に length() と入力します。value'] 式。 条件は次のように表示されます。

    [条件] ボックスのスクリーンショットは、リストの長さが 0 と等しいことを示しています。

アイテムを作成する

IF YES ブランチで、SharePoint アイテムの作成ステップを追加します

[ アイテムの取得 ] 手順で使用したサイトと一覧を選択します。 [ 項目の作成] では、トリガーからのフィールドのみを使用して各列を設定する必要があります。 [ アイテムの取得 ] の手順のデータは、ソース リストではなく宛先リストから取得されるため、使用しないでください。 アイテムを取得 すると、トリガーの上に表示されます。 一番下までスクロールして見つけることを確認します。

アイテムを更新する

IF NO ブランチで、SharePoint Update アイテム ステップを追加します。

サイトと一覧を選択します。 次に、[ アイテムの取得 ] 手順から返される ID を選択します。

[アイテムの取得] 手順から返される ID を選択するスクリーンショット。

ID を追加すると、[アイテムの更新] ステップの周囲に [各コンテナーに適用] が自動的に追加されます。 この動作は仕様です。 [アイテムの取得] ステップで使用したクエリが正確な場合、コンテナーはコピーするアイテムのみを更新します。 残りのフィールドを完了した後 (アイテムの 取得 呼び出しではなく、トリガーからの出力を使用してください)、条件ブロックは次のスクリーンショットのようになります。

条件ブロックの例を示すスクリーンショット。

フロー プロセスの制限事項

フロー プロセスを使用すると、最初の一覧で行われた変更を 2 番目の一覧に反映できます。

このプロセスには、次の制限事項が適用されます。

  • 項目が最初のリストから削除された場合、項目は 2 番目のリストから削除されません。 これは、 項目が削除されたときのトリガーがないためです。 この場合、削除が発生したときにフローに通知する方法はありません。 代わりに、SharePoint リスト (または SQL テーブル、またはその他のデータ ソース) からアイテムを削除する代わりに、アイテムが不要になったり関連したりすることを示す列を追加することをお勧めします。 その列は、2 つのリスト間で同期されます。
  • 2 つのリスト間で項目の同期を維持するために使用しているフィールドに変更が加えられた場合、宛先リストに新しい項目が作成されます。 たとえば、ユーザーの 名前 列を使用して 2 つのリスト間をコピーし、そのユーザーの [名前] 列が変更された場合、フローでは、その変更は既存のアイテムの更新ではなく、新しいアイテムと見なされます。 [名前] 列が決して変更されないようにできる場合、この制限の影響を受けることはありません。 ただし、[ 名前 ] 列が変更された場合は、最初の一覧の項目の ID を格納する列を宛先リストに追加する必要があります。 この場合、 Name を 使用して項目を検索する代わりに、 ID を使用できます。 (ID は常に一意であることが保証されます)。
  • このプロセスは双方向同期ではありません。つまり、移行先リストで項目が更新された場合、変更はソース リストに反映されません。 フローで双方向同期を設定しないでください。これは、追加の変更を加えずに無限ループを作成するためです。 たとえば、リスト A はリスト B を更新し、リスト B はリスト A を更新し、リスト A はリスト B を再度更新します。