Salesforceのフローで積上集計~初心者向け~

#大切なのはイメージをもつこと
ハロー、エブリワン。
試験管生まれ、研究所育ちの遺伝子操作系Adminのきたづめです。
今日もDNAが疼く。

この素晴らしい記事は [Japan Dreamin' Advent Calendar 2020](https://adventar.org/calendars/5427) の7日目の記事となります。

今回はSalesforceで今流行りのローコード開発機能『フロー』での
参照関係項目　積上集計の方法について説明する記事となっております。


**◎網羅する範囲**
- フロー

**◎フローについて詳しく知りたい人は公式情報をチェック:heartbeat:**
[Salesforce公式ヘルプ（フロー）](https://help.salesforce.com/articleView?id=flow.htm&type=5)
[Trailhead（Flow Builder を使用したフローの作成）](https://trailhead.salesforce.com/ja/content/learn/trails/build-flows-with-flow-builder)



気がつけばSalesforce歴6年のきたづめです。Salesforceって営業にデータを入力してもらえないと単なる金食い虫。多くのアドミンさんが苦戦するあるある課題の1つは「いかにして現場にデータを入力してもらうか」のようです。

私が尊敬するとある方はSalesforceの画面フローを使ったローコード開発で
『データ入力インターフェイスの工夫』を実現し、セールスフォースの定着化と登録作業の効率化に成功されたようです。
https://note.com/kamivanise/n/nde181dd27a7
⇒ローコード開発や画面フローの作成についてはこちら


さて、今回はSalesforceの『フロー』の自動計算について触れていきたいと思います。
お題として、Salesforceを活用している人なら誰しも一度は考える**参照関係項目の積上集計**について説明していきたいと思います。

みなさんにはフローでどんなことができるのかそのイメージを掴んで頂いて色んな活用方法を思いつくきっかけになればと思います。

#自動化するにはどんな設定が必要？
コンピュータは人間と違って、やってほしいことを**『察して』**やってくれたりしません。
ひとつひとつの工程を丁寧に説明する必要があります。

お題として上げている**参照関係項目の積上集計**を実現するにはコンピュータにどのような説明をすればいいでしょうか。

まず、フロー（コンピュータ）にやってもらいたいことを整理します。
今回やってもらうこと
**『取引先に紐づく取引先責任者の数をカウントして、取引先の「従業員数」項目を自動で更新する』**こと

具体的に2つ。
![名称未設定sd.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/5cc6ee73-9df6-a64b-6923-b56de3bd95b5.jpeg)
※最初に説明します！

![名称未設定sd.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/8a1e1787-3ccf-25eb-926e-1bbe8962acb1.jpeg)
※こちらは後ほど説明します！

##フロー完成イメージ
フローの完成イメージはこんな感じ。

![名称未設定.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/3bcd675b-4bf0-1fbf-93c8-8e81e7b714ae.jpeg)
これからこんな感じのフローを作っていきます。

##設定手順
フローを設定する手順は下記の通りになります。

:one:**フローを動かすきっかけ（トリガー）の設定**
:two:**フローが動く条件の設定**
:three:**取引先責任者の検索**
　　作成した取引先責任者と同じ取引先IDの取引先責任者を検索
:four:**変数の設定**
　　取引先責任者の数を一時的に保管する場所（変数）の設定
:five:**検索した結果を変数に保存**
:six:**取引先の項目を更新**
　

この流れでフローを作っていきます。


#取引先責任者作成時の積上フロー作成
最初に取引先責任者データ（レコード）を作成したときのフローを作成します。

##①初期設定
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/836fb82a-372e-4612-0cc7-e04ed084ba0e.png)
設定 > プロセスの自動化　>　フロー　から「新規フロー」を作成。
***

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/a580c2c9-b635-d0d8-e598-33441ec7bdb6.png)
フローの種類を選びます。
『レコードトリガーフロー』を選択。
***

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/fae18f2f-911d-6528-18dd-4f3c85435506.png)
フロービルダーのレイアウトを選択します。どちらでも構いません。
今回は自動レイアウトを使用して説明します。
※レイアウトは途中で変更可能です。

##②きっかけ（トリガー）と動く条件の設定
まずは、このフローが起動するタイミングを設定します。
　**<font color="green">今回は、データ（レコード）が作成され、保存された後にフローを起動させます。</font>**

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/36e97733-fa43-9a1f-c47c-beb9f0fb4fd9.png)
画面中央の赤枠をクリック。
***

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/e75a67e0-120f-6d56-c398-eec79f05bd1d.png)
下記内容にチェックをいれて完了にします。

|　|　|
|:-----------|:------------|
| フローをトリガする条件 | :ballot_box_with_check:　レコードが作成された|
| フローを実行| :ballot_box_with_check:　レコードが保存された後|
***

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/67bc6f18-4ca0-2bf8-4e3b-df3124d0a491.png)
次に、このフローが起動するきっかけ（トリガー）を設定します。

　**<font color="green">今回は取引先責任者を作成した時に「取引先」項目が入力されている時にフローが起動するように設定します。</font>**
***

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/2be36513-37eb-1635-349f-e5d396174ea6.png)
オブジェクトは「取引先責任者（Contact）」を選択。


![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/3eafd615-d7c5-d63d-4a6c-9723b953453e.png)
条件の要件は「すべての条件に一致（AND）」を選択。

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/b3967384-5fe2-6937-e358-ca774125e379.png)
項目は「AccountId（取引先ID）」を選択。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/f503eea2-fd1c-ff9c-d923-e41de97347f9.png)
演算子は「次の文字列に一致しない」を選択。

![10-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/c1c08675-f3cf-5924-fa2a-130341ed48b1.png)
値は「{!$GlobalConstant.EmptyString}」を選択。

最終的にこのようになります。

|項目|演算子|値|
|:-----------|:------------|:------------|
| AccountId| 次の文字列と一致しない | 空文字列（null以外）　{!$GlobalConstant.EmptyString}|


##③一旦フローを保存
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/bacc60f0-0917-596f-be5b-f076ef6906d4.png)
ここで一旦作成したフローを保存します。
画面右上「保存」をクリック。

***

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/a668d77d-4642-e6bd-643e-344c4f5975a6.png)
下記項目を入力して保存。

|　|　|
|:-----------|:------------|
| フローの表示ラベル | 取引先責任者を作成したら|
| フローの API 参照名| CreateContact|
| 説明| 関連する取引先に紐づく取引先責任者の数をカウントして、取引先の「従業員数」項目を更新する|
※項目はすべて自由な名前でも構いません。
***

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/52cdcedb-3469-b4bd-628e-c1f5e4bc845f.png)
警告文が出てきますが気にしなくてOK!


##④取引先責任者を検索
続いて、取引先責任者を検索する設定をします。
　**<font color="green">ここでは作成した取引先責任者の「取引先」項目と同じ「取引先」項目が設定されている取引先責任者を検索します。</font>**

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/501a6d83-c12c-a57c-ccb4-66ed524faa08.png)
画面中央の「＋」をクリック。
***

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/2718eebf-ee49-f4e4-67c3-105c7c002435.png)
「レコードを取得」を選択。
***

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/6c4ef14b-10cb-987c-7b47-1ed2e1ccff71.png)
まずはこの処理の名前を設定します。

|　|　|
|:-----------|:------------|
| 表示ラベル | 同じ取引先IDの取引先責任者をGETする！|
| API 参照名| get_Contacts|
| 説明| 作成した取引先責任者の取引先IDと同じ取引先IDの取引先責任者を検索する|
※項目はすべて自由な名前でも構いません。
***
【このオブジェクトのレコードを取得】のオブジェクトに「取引先責任者」を選択し、
【取引先責任者レコードを絞り込み】の条件の要件を「すべての条件に一致（AND）」を選択。
続いて、項目・演算子・値を設定していきます。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/8611cebb-7141-97bf-0219-295a1d76a0dd.png)
値は「AccountId（取引先 ID）」を選択。

![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/3ded61b8-4856-1912-2f58-0b8bd49f4c9d.png)
演算子は「次の文字列と一致する」を選択。

![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/cf2ba077-a9be-4988-d1b0-e73c10ff9d0a.png)
値は「$Record」 > 「AccountId（取引先 ID）」を選択。

最終的にこのようになります。

|項目|演算子|値|
|:-----------|:------------|:------------|
| AccountId| 次の文字列と一致する | \$Record > 取引先ID（$Record.AccountId）|
***

![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/8700ac54-19a5-d607-a1d5-a90ae3d8f428.png)
下記内容にチェックをいれて完了にします。

|　|　|
|:-----------|:------------|
| 並び替え順| 並び替えなし|
| 保存するレコード | :ballot_box_with_check:　すべてのレコード|
| レコードデータの保存方法| :ballot_box_with_check:　項目を選択して後は Salesforce に任せる|


##⑤取引先責任者の数を一時的に保管する場所（変数）の用意
続いて、このフロー内で情報を一時的に保管する場所（変数）を作成します。
　**<font color="green">ここでは新規リソースから「変数」を作成します。</font>**
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/c7b5a64a-1dde-bc2e-a07d-3a254aa0d06a.png)
画面左の「新規リソース」をクリック。
***

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/78e9eade-05e0-68e8-4e6e-6b88eb82e8c2.png)
下記内容を入力。

|　|　|
|:-----------|:------------|
| リソース種別 | 変数|
| API 参照名| var_NumOfContacts|
| 説明| 取引先責任者の数をカウントするための変数|
| データ型| 数値|
| 小数点| 0|
| 複数の値を許可（コレクション）| （チェックなし）|
| デフォルト値| （なし）|
| フロー外部での可用性| |
| 入力で使用可能| （チェックなし）|
| 出力で使用可能| （チェックなし）|


##⑥取引先責任者の数を一時保存
続いて、割当の設定をします。
　**<font color="green">ここでは先程作成した変数に「取引先責任者を検索」した結果を保存します。</font>**

![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/a7e2ae41-46a1-2249-f752-fdfee383c926.png)
画面中央の「＋」をクリック。
***

![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/a347da23-ca68-ce2b-e70e-5da9b026d7a0.png)
「割り当て」を選択。
***

下記項目を入力して、変数値を設定します。

|　|　|
|:-----------|:------------|
| 表示ラベル | 取引先責任者の数を取得|
| API 参照名| assign_NumOfContacts|
| 説明| 取引先責任者の数を変数「var_NumOfContacts」に一時保存する|

![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/5c066fc1-c5e0-05a7-4657-17ce8ea556c0.png)
変数には先程作成した変数名「{!var_NumOfContacts}」を選択。

![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/d56acdca-a02f-8a1b-e54b-151f0a97c8ef.png)
演算子は「次の数と一致する」を選択。

![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/4d4ac6b7-1d3f-90ad-b3e5-8ac9e969f8b9.png)
値は「get_Contacts 取引先責任者（contact）」を選択。
最終的にこのようになります。

|項目|演算子|値|
|:-----------|:------------|:------------|
|var_NumOfContacts| 次の数と一致する |get_Contacts 取引先責任者（contact） |


##⑦取引先データ（レコード）を更新
最後に、取引先データ（レコード）を更新します。
　**<font color="green">ここではレコードの更新で関連する取引先の「従業員数」項目に先程一時的した取引先責任者の数を入れます。</font>**

![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/bceb6ddf-645c-1f30-cf73-9ea5a92a70c4.png)
画面中央の「＋」をクリックし、「レコードの更新」を選択。
***

![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/3a8d1357-1303-46e1-51df-ee4b87a2e273.png)
下記内容を入力。

|　|　|
|:-----------|:------------|
| 表示ラベル | 取引先を更新|
| API 参照名| UpdateAccount|
| 説明| GETした取引先責任者の数を取引先の「従業員数」項目を更新する|
| 更新するレコードを検索してその値を設定する方法|:ballot_box_with_check:　レコードを識別する条件を指定し、項目を個別に設定|
|このオブジェクト種別のレコードを更新||
|オブジェクト|取引先|
|取引先レコードを絞り込み||
|更新するレコードの条件の要件|すべでの条件に一致（AND）|

|項目|演算子|値|
|:-----------|:------------|:------------|
|Id| 次の文字列と一致 |\$Record > 取引先ID（$Record.AccountId） |
***

![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/4db3c926-ef76-aea1-dde1-f4bfcbda125c.png)
取引先レコードの項目値を設定し完了。

|項目|値|
|:-----------|:------------|
|NumberOfEmployees（従業員数）| var_NumOfContacts|


##⑧保存と有効化
設定した内容を保存して、有効化します。
※保存だけではフローは動きません。必ず有効化する必要があります。
![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/cec66e41-c9e7-e8e3-8042-c351067e6084.png)
画面右上の「保存」⇒「有効化」。

お疲れさまでした！
早速動作を試してみましょう！

***
#動かしてみよう
![33_動かす１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/8f441bdc-8c1b-7b8a-ac8d-45744d15a271.png)
取引先レコードの「従業員数」項目に注目！
***

![34_動かす２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/27ff7f91-d9b7-ee4b-b592-9b056cc7741c.png)
新規取引先責任者を追加してみます。
***

![35_動かす３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/f7d71e3d-96bb-6a91-6a1c-1bc876acc2db.png)
新規取引先責任者を追加したら、取引先の「従業員数」項目が更新されました！
***

![36_動かす４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/b0728d34-4b68-27a6-3352-258b1036d6a6.png)
この取引先に紐付いている取引先責任者の数と一致していることを確認しましょう！
***

![37_動かす５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/2e8aa71e-fa07-239b-6dbe-e9e65850043f.png)
**<font color="red">おっと!</font>**
誤って関係のない取引先責任者を追加してしまいました。。。
***

![38_動かす６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/298d4cc2-354d-477e-882b-61399516df2d.png)
先程作成したフローが動いて「従業員数」が増えてしまいました。
取引先責任者を削除して「従業員数」をもとに戻したいのですが、
今回作成したフローは取引先責任者の作成時しか起動しません。。。。

さて、どうしましょう。


#取引先責任者削除時の積上フロー作成
取引先責任者を削除した時のフローを作成します。
　**<font color="green">先程作成したフローと内容はほぼ同じなのでフローをコピーして調整していきます。</font>**

##①初期設定
![38_削除　初期１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/390d35dc-a90b-8b9d-b25e-0580d137f180.png)
設定 > プロセスの自動化　>　フロー　から先程作成したフロー「取引先責任者を作成したら」を選択。
***

![39_削除　初期２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/64ba01c3-bfed-f5a7-d35e-d68449f761a7.png)
画面右上の「別名で保存」をクリック。
***

![40_削除　初期３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/40be4086-7c8d-354d-b744-f22733517b8c.png)
下記項目を入力して保存。

|　|　|
|:-----------|:------------|
| フローの表示ラベル | 取引先責任者を削除したら|
| フローの API 参照名| DeleteContact|
| 説明| 関連先する取引先に紐づく取引先責任者の数をカウントして、取引先の「従業員数」を更新する|

##②きっかけ（トリガー）の調整
![45a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/005dee11-dd12-e964-b90f-eab798e3d05a.png)
レコードトリガー（開始）を選択し、画面中央の赤枠をクリック。
***

![45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/42ddb53a-d0ed-d1e3-4564-a3510bc5f60e.png)

下記内容にチェックをいれて完了にします。

|　|　|
|:-----------|:------------|
| フローをトリガする条件 | :ballot_box_with_check:　レコードが削除された|
***


##③取引先責任者の数の取得の調整
![41_削除調整.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/d6a98d77-0d3a-ca97-7f79-582bba09631d.png)
レコードの取得「同じ取引先IDの取引先責任者をGETする！」を編集します。
レコードの取得「同じ取引先IDの取引先責任者をGETする！」を選択し、「要素を編集」をクリック。
***

![42_削除 調整２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/d7ce9082-03a1-8746-04f3-95754769717e.png)
取引先責任者レコードを絞り込みに「＋ 条件を追加」します。

|項目|演算子|値|
|:-----------|:------------|:------------|
|Id| 次の文字列と一致しない |\$Record > 取引先責任者ID（$Record.Id） |

**※補足**
きっかけ（トリガー）が削除の場合は、
削除する前にフローが起動するので削除対象となるデータ（レコード）を省いて数を集計する必要があります。




修正が終わったら保存と有効化をします。


#削除してみよう
さっそく、取引先責任者を削除してみましょう。
![43_削除動かす１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/914f634f-c7cf-ba5b-9c03-47660e65927b.png)
誤って登録した取引先責任者を削除します。
***

![44_削除動かす２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532994/39412b24-0489-6b0e-0e08-37f7313a90a0.png)
無事、取引先の「従業員数」項目も変更されました。


#終わりに
さて、みなさん。
フローがどんな感じに使えるのか少しイメージは持てたでしょうか？

今回の例では、
・取引先責任者の『取引先』項目を変更した場合
・『ゴミ箱から復元』した場合
は時間の都合上、割愛させていただきました。
『取引先責任者の『取引先』項目を変更した場合』に関しては、ローコードで対応できますので
別の機会に紹介させていただければと思います。


Saleforceに限らず、何かツールを使っていく上で大切なことは、
***『その機能で何ができるか』***
***『その機能をどう活用するか』***
この2つです。

今回は、***『その機能で何ができるか』***にフォーカスして説明しました。

Salesforceのローコード開発、フロー機能は日々進化していて、
一昔前だったらもうちょっと手間がかかっていた自動計算もこんな感じに大分シンプルに作れるようになりました。

こうなると***『その機能をどう活用するか』***
みなさん色々と面白い使い方、実用的な使い方を思いつくわけでございます。

ぜひ、教えてほしいです！
こういった活用事例なんかはぜひSalesforceのコミュニティとかで共有していただければ思います。
もちろん私もどんどん共有していきます！


ということで最後になりましたが、
Salesforceも仕事も人生もみんなで楽しんでいきましょう！！！

アディオス　アミーゴ:santa_tone3: