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