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

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

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

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

詳細情報

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

次の例では、 タイトル 列が両方のソースで同じであることを前提としています。

トリガーを設定する

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

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

注:

トリガー名には既存の項目に対する変更のみが記載されていますが、トリガーはリストに追加された新しい項目にも対応します。

宛先内のアイテムを検索する

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

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

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

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

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

アイテムが存在するかどうかを確認する条件を追加する

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

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

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

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

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

    注:

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

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

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

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

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

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

アイテムを作成する

IF YES ブランチで、SharePoint アイテムの作成手順を追加します。

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

アイテムを更新する

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

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

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

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

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

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

フロー プロセスでは、最初のリストで行われた変更を 2 番目のリストに反映できます。

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

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