フロー: 3 つの方法でコレクションの重複を排除する方法

MapやList変数を使わないでどうやって実現できるのかが不思議で仕方がないお題ですね。Apexなら何にも悩まずに記述できるけどなぁっていつも思う。しかしApexで書くことは忌み嫌われます。Apexは悪と考えられているようです。不思議で仕方がない。

[Flow: How To De-duplicate Collection In 3 Ways](https://salesforce-flowsome.com/flow-how-to-de-duplicate-collection-in-3-ways/)


Flow での重複除去コレクションは、非常に興味深いトピックです。これを達成するにはさまざまな方法があり、すべてはあなたの創造性次第です!今日は、コレクション内の重複したアイテムを削除するのに役立つ 3 つの方法を紹介します。

# 1 –代入で特別なコレクション演算子を使用する

Accidental Coder でこの方法を見つけましたが、素晴らしいと思います!現在、Assignment には「Remove Common」オペレータがないため、重複をすぐに削除することはできません。ただし、「Remove Uncommon」演算子を使用すると、最初に重複したレコードを見つけて、最終的なコレクションから削除できます。

このメソッドには 4 つのコレクションが必要です。

+ Collection A: [item1 ,item2]
+ Collection B: [item1, item3]
+ Duplicated collection that holds duplicates: [ ]
+ Consolidated collection that holds all records after de-dupe: [ ]

![image.png](https://salesforce-flowsome.com/flow-how-to-de-duplicate-collection-in-3-ways/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cca61064-a2e6-5caa-3b6f-e819c238f813.png)

## ステップ 1 – 重複を特定する


まず、「Equals」演算子を使用して、Col A の値を Duplicated にコピーします。
=> Duplicated = Col A = [item1, item2]

次に、Duplicated と Col B の間で「Remove Uncommon」を使用します。これにより、Duplicated から、Col B に表示されないアイテムが削除されます。
=> Duplicated = [item1, item2] – [item2] = [item1]

(注: 共通でない列を削除するために列 A を使用しませんでした。これは、列 A のすべてのユニークなアイテムが消えるためです。)

## Step 2 – Remove Duplicates


これで、[すべて削除] を使用して列 A から重複を削除できます。重複を 1 回だけ表示する必要があるため、これを行う必要があるのはコレクションの 1 つだけであり、両方ではありません。
=> Col A = [item 1, item2] – [item1] = [item2]

## ステップ 3 - コレクション変数を統合する


最後に、重複除外後にコレクションを統合できます。
=> Consolidated: Col A: [item2] + Col B: [item1, item3] = [item1, item2, item3]


(注: 新しい統合コレクションを作成する代わりに、列 B を列 A に直接追加することもできます)

## この方法に関する考慮事項

同じ操作をさまざまな方法で記述できるため、私の手順に厳密に従う必要はありません。ただし、この方法は、レコード コレクションには非常に注意が必要です。まず、レコードのフィールド値が同じである必要があります。次に、同じフィールドをコレクションに含める必要があります。 （例：コレクションAにレコードのID、名前、メールを保存し、コレクションBにID、名前のみを保存した場合、同一のレコードとはみなされません）。

特定のフィールドだけを比較したい場合はどうすればよいでしょうか?または、ID のあるレコードとないレコードを比較するとどうなるでしょうか。この場合、カスタム Apex アクションを使用することをお勧めします。

# 2 – カスタム Apex アクションを使用する

コレクション用のこのパッケージなど、UnofficialSF.com には多くの優れたカスタム Apex アクションがあります。

特定のフィールドだけを比較したい場合はどうすればよいでしょうか?または、ID のあるレコードとないレコードを比較するとどうなるでしょうか。この場合、ループを使用して各レコードの不要な項目をクリーンアップするか、カスタム Apex アクションを使用できます。使用することをお勧めします

パッケージをインストールしたら、Action 要素で「Dedupe」を探します。ここでドキュメントを見つけることができます。 fieldToDedupeOn は、照合して重複を識別するフィールドです。そのフィールドの API 名を入力する必要があります。 inputRecordCollection は統合されたコレクションである必要があるため、最初にターゲット コレクションを一緒に追加する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/08cab09e-5694-15ab-515c-ae8e9281d974.png)


## この方法に関する考慮事項

これはいいカスタムアクションで、標準要素になる日を楽しみにしています。ただし、現在、一致できるフィールドは 1 つだけです。また、重複をカウントして数量フィールドを更新したい場合はどうすればよいでしょうか?もしそうなら、あなたは昔ながらの方法を考えることができます – ループを使用してください!


# 3 – ループ変数とプレースホルダー変数を使用する


かなり複雑な方法なので、ユースケースを使って説明しましょう。

**ユースケース**
Lulu Mobile は、標準の Opportunity および Opportunity Product オブジェクトを使用します。オポチュニティ プロダクトを生成する複数のソースがあり、場合によっては重複することがあります。重複が発生するたびに、1 つの行だけを保持し、数量を更新したいと考えています。

**コンセプト**

このメソッドには、ループ、コレクションの並べ替え、およびプレースホルダー変数が必要です。一致させたいフィールドに基づいてコレクションを並べ替えると、同じ値を持つアイテムが一緒に配置されます。この場合、現在のアイテムと前のアイテムを比較するだけで済みます。同じ場合は、数量を加算します。そうでない場合は、次の項目に進みます。ループは「現在のアイテム」変数のみを提供するため、「前のアイテム」を保持するプレースホルダー変数を作成する必要があります。次に、それらを使用して比較を行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2912afc5-96f2-05cb-578c-9523e6c19e83.png)

**フローの全体像**


部分的なフローチャート – 独自のソリューションに組み込むことができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8b91b19d-ef7c-69a9-d399-d27d711d2469.png)


**各設定**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/81a1ca71-6689-98ea-1749-2c93be2eeafb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c8e3a6f2-59a4-5efa-4456-57bd4da2535a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e755e4fd-16c1-cbd5-bcd6-aba74e614da3.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/548de2fe-c39d-3b5a-3234-cf293c1e4d1d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/97c183d1-550b-2318-a5ef-4e0598713d8b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dfb1b716-fbda-7920-41af-1961957ccd12.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3b0b33bb-c9ba-b135-4beb-c9a3f6f2eb79.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/98ad831f-b481-6271-c811-84e004c49c02.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2f5ee9f4-9f44-4069-2dd2-639e4dd63bf3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5bdd9ed5-0184-0d40-61e9-02c18dea3410.png)






# 関連する質問

+ [フロービルダーについて](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Jduc0SAB)