tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:データ登録時に複数メールを順番に送信する方法

Salesforceにデータを登録する際に同じ宛先に複数のメールを順番に送信する方法についてです。あまり無いケースだと思いますが、必ずメールAが受取人に届いたあとにメールBを送りたいといった要件が発生したときの対応方法です。複数送信ということでパッと思いつくのが下記の設定方法です。

f:id:tyoshikawa1106:20190120180754p:plain


ですがワークフロールールのアクションの実行順序は保証されていないので必ずしも同じ順番で送信されるわけではありません。

ワークフローの考慮事項


実行順序を担保したい場合は、プロセスビルダーで設定するのが良いと思います。
f:id:tyoshikawa1106:20190120181342p:plain


これで要件を満たす形で設定完了...と思ったのですが、思わぬ挙動がありました。メールクライアントによって表示順が異なる場合があります。下記のようにGmailではメールAが届いたあとにメールBが届いたのですが、Appleのメールクライアントでは稀に順番が逆転しました。

Gmail

f:id:tyoshikawa1106:20190120181458p:plain

Apple

f:id:tyoshikawa1106:20190120181641p:plain


下記の形でメールアラート処理の間に項目自動更新を挟む形でも解決できませんでした。

  1. メールA送信
  2. メールB送信フラグを更新
  3. メールB送信


順番を担保したい場合はメールB送信処理を遅らせる必要があるみたいです。


この問題を解決する方法ですが、プロセスビルダーのスケジュール済みアクションを使用することで解決できます。スケジュールの間隔は「日」または「時」のみ指定可能で「分」はありませんでした。ですが、「0時間前」という形で指定することで1時間以内に送信することができます。
f:id:tyoshikawa1106:20190120182339p:plain

f:id:tyoshikawa1106:20190120182450p:plain


2つ目のメールはだいたい1分〜3分遅れで送信されると思います。(状況によってはもっと時間がかかるかもしれません)
f:id:tyoshikawa1106:20190120182742p:plain


この手順でメールAのあとにメールBが送信されるという要件を確実に満たせると思います。

プロセスビルダーのスケジュール済アクションのメリット

プロセスビルダーのスケジュール済アクションで、レコードの更新を行う場合は実行条件を指定できます。
f:id:tyoshikawa1106:20190120183401p:plain


ワークフロールールの時間ベースのアクションの場合は、項目自動更新アクションをそのまま呼び出すので細かい設定ができないようです。
f:id:tyoshikawa1106:20190120183822p:plain

こうしたスケジュール済み処理で判定処理を組み込む必要がある場合はプロセスビルダーの方がやりやすいと思います。

参考

SFDC:個人取引先とデータの操作

SalesforceでB2C向けの顧客管理を行うときは個人取引先を使用します。

f:id:tyoshikawa1106:20181221194144p:plain


個人取引先のデータは取引先オブジェクトに格納されます。取引先責任者の標準項目はPerson〜というAPI名でアクセスできます。
f:id:tyoshikawa1106:20181221194354p:plain


Accountオブジェクトにクエリを投げると値を取得できます。
f:id:tyoshikawa1106:20181221194621p:plain

f:id:tyoshikawa1106:20181221194602p:plain


Updateも普通にできます。
f:id:tyoshikawa1106:20181221194731p:plain

f:id:tyoshikawa1106:20181221194804p:plain


個人取引先はPersonContactIdに取引先責任者のIDを保持しています。
f:id:tyoshikawa1106:20181221194959p:plain


個人取引先のContact側の情報はAccountと同じようにクエリで取得できます。
f:id:tyoshikawa1106:20181221195115p:plain

f:id:tyoshikawa1106:20181221195102p:plain


ContactレコードでUpdateも実行できます。
f:id:tyoshikawa1106:20181221195217p:plain

f:id:tyoshikawa1106:20181221195340p:plain


取引先責任者に外部IDがあった場合です。
f:id:tyoshikawa1106:20181221195601p:plain


カスタム項目は取引先オブジェクトで「__pc」という拡張子でアクセスできます。
f:id:tyoshikawa1106:20181221195642p:plain

f:id:tyoshikawa1106:20181221200228p:plain


外部ID項目が存在しているのでUPSERTで利用できるかと思いきや、エラーとなりました。
f:id:tyoshikawa1106:20181221200812p:plain

f:id:tyoshikawa1106:20181221200900p:plain


通常の取引先だったら外部IDでUPSERTできるので処理の書き方自体は大丈夫。
f:id:tyoshikawa1106:20181221200758p:plain


個人取引先のAccountオブジェクトに対してContactオブジェクトの外部IDをつかったUPSERTはできないようです。


Contactオブジェクトの場合はどうでしょう。
f:id:tyoshikawa1106:20181221201043p:plain


こちらは正常に実行できました。取引先責任者が更新されれば個人取引先のデータにも自動で反映されます。
f:id:tyoshikawa1106:20181221201153p:plain


取引先責任者の外部ID項目をつかってUPSERT処理を行う場合は、Contactオブジェクトに対して処理を行えばいいみたいです。


個人取引先はパッと複雑ですがB2Cのデータを管理するときにはかなり柔軟な対応が可能となる機能です。ストレージの消費量の懸念点はありますが、システム構築のしやすさ向上の効果は大きいのでおすすめの機能です。

SFDC:Salesforce World Tour Tokyo 2018に参加しました

2018年12月05日(水)に開催されたSalesforce World Tour Tokyo 2018に参加しました。場所は東京ビッグサイトです。


会場に入ると受付前にセキュリティチェックのゲートがありました。早めの時間に行ったためかスムーズに通ることができました。


セキュリティチェックを済ませたあとは受付に行って受講票を見せてパスケースを受け取ります。そのときにパンフレットなども頂きました。


会場内はこんな感じでした。モーニングセッションで早めに来たので空いている時間帯です。


最初に聴きに行ったセッションはこちらです。

第4次産業革命におけるシステム管理者の重要性と管理者向け最新機能


管理者向けのセッションです。アストロくんやクラウディ北川さんのパフォーマンスも見ることができました。


内容的にはこんな感じ。

  • 第四次産業革命の話。企業は顧客と繋がることを求められてる。
  • ゲストでHEAVEN Japanの方登壇
  • Lightning の使い方の話。ログイン後に予定を確認するホーム画面の使い方。ユーティリティバーの活用例としていつでもメモできる。
  • リストビューの検索機能の話
  • 活動の記録とクイックテキスト
  • Lightning フロービルダーとか新機能の話
  • EXCELからカスタムオブジェクトを作成できる→API名は動的にセットされる
  • Einstein予測ビルダーの話。→経験や勘に頼るしかなかった情報をAIが用意できる。


新機能はパイロット版や今後提供予定のものが含まれていました。


モーニングセッションはこんな感じ。海外のSalesforce社の人も日本のイベントを見に来ていていました。


次に予定していた基調講演まで少し時間に余裕があったのでちらっと会場を歩いてみました。ドリンクが提供されていたりもしました。飲み物を特に用意していなかったので会場で貰えて助かりました。

基調講演:A Celebration of Trailblazers

基調講演の会場はこんな感じ。


Salesforceのマスコットと記念撮影をしてもらうこともできました。


基調講演の開始はドラムパフォーマンス 鼓和-core-さんのパフォーマンスから始まりました。光と音のパフォーマンスがすごかったです。

ドラムパフォーマンス「鼓和-CORE-」Official Site


パフォーマンスのあとはセールスフォースジャパンの小出CEOが登壇されました。

  • 第四次産業革命の話
  • セブンアンドアイホールディングによる活用の話と企業と顧客の繋がりの変化について
    • これからは顧客ひとりひとりにパーソナライズされたサービス提供の時代になる..的な話
  • ベンチャーキャピタル Trailblazer Fundの話


スペシャルゲストでネオスの方が登壇されました。


セールスフォース創業者の一人でCTOのパーカーハリスも来日して登壇されていました。

  • Customer360の話
  • MuleSoft の話
  • Einstein Voiceの話


EinsteinVoiceはSalesforce を音声で操作できる製品です。開発チームの方も来日されてHey SiriからSalesforceアプリにアクセスするデモを見せてくれました。音声がスムーズに認識されて操作されるのはすごかったです。(まだ英語のみの対応の可能性もありますが..)


その後はセールスフォースジャパンの秋津さんからWILLERの事例の話とMuleSoftをつかったシステム連携とコンタクトセンター向けに構築したServiceCloudのコンソールアプリのデモがありました。


MuleSoftによりSalesforceと外部の予約システムを連携して問い合わせ対応できる仕組みを構築した流れはすごかったです。


事例の話をしてくれたWILLERさんは高速バスなどのサービスを提供している企業です。

高速バス・夜行バスを簡単に予約|WILLER TRAVEL【公式】


最後にセールスフォースジャパンの田崎さんがDreamforceでも話のあったユニリーバの活用事例を紹介してくれました。


基調講演のあとはいろんなブースが出ている部屋へ。


お昼はサンドイッチが用意されていました。


ランチを済ませたあとは、スタンプラリーでいろんなブースを回ってみました。最初に行ったのはこちら。


アドエビスはWEBサイトのCV率を確認するマーケティング用の製品なのですが、Salesforceと連携できるんだと気になったので行ってみました。月額3万円で利用できるAppExchangeが用意されているみたいです。話を聞いたところWeb-to-リードのフォームを前提としていましたが、おそらく自作のWebフォームにも適用できるんじゃないかなと思います。(そうじゃないとだいぶ用途が狭まるので..)


次はSales Cloudのブースです。行ったタイミングがちょっとだけ悪かったみたいで詳しい人が離れてますとのことでしたが、ちょっとお話聞かせてもらうことができました。


その次はアクセンチュアさんのブースに行きました。SWTT2018で唯一のDiamondスポンサー。大きなブースでいくつかの種類の話を聞けるようになっていました。AIとサーベイの話を聞かせてもらいましたが、AIで顧客の回答を分析してどのような感情を持っているかを判断できるアプリのデモを見せてもらいました。


ブースには書籍も。


その次はGrapeCityのブース。こちらもスポンサーブース。


EXCEL形式で入力できるアプリのデモを見せてもらいました。



ここでService Cloud Keynoteの時間が来たので別の部屋へ移動。少し遅れてしまったのですが、運良くまだ前の席が空いていました。

Service Cloud Product Keynote

  • Service Cloud コンソールの話
  • AOKIホールディングスの方の事例話
  • 顧客対応のルーティンワークを自動化の話
  • AIチャットのデモ
  • コンソールからチャット対応
  • Apple business chatもサポートする話
  • Field Service Cloudの話


Service Cloud Keynoteのセッションはこんな感じでした。


当初の予定ではこの次はSales Cloud Keynoteのセッション予定だったのですが、TwitterでHerokuのセッションが始まる情報を見つけ、そちらを聴きに行ってみました。

Herokuセッション


今までHerokuアプリはインターネットに接続して利用する前提でしたがイントラネットなどのクローズドな環境でも動かせるようになった話を聞きました。


Herokuのプラットフォームでアドオンサービスとして提供されているKafkaが、SalesforceのPlatform Event側の仕組みでも利用されるようになるそうです。リアルタイムでの通知とかで使えるとのことでAPI覚える必要がなくなる的な話がありました。


あとはDockerのお話。


ここまでのまとめ。


最後にHerokuの活用事例ということでリーフラス株式会社の方が登壇されました。

リーフラス株式会社


Herokuのセッションのあとはスタンプラリー完成のため会場まわりに時間を使うことにしました。


時間はかかりましたが無事にコンプリートしました。教えてもらって気づいたのですがSalesforceという文字が出来上がる予定だったみたいです。(おみくじにいくのが遅かったためシールがなくなってしまったみたいです...)


全部集めて2回分引けたので何か当たるかなと抽選クジ引いてきたのですが二回ともハズレ...ブース周りは楽しめたので良かったです。


残りの時間も会場ぶらぶらして過ごしました。


Salesforce World Tour Tokyo 2018はこんな感じでした。今年も参加できて良かったです。

SFDC:リードの取引開始と個人取引先について

リードの取引開始ボタンをクリックすることで、リードに登録された情報を元に取引先、取引先責任者、商談を作成することができます。B to C向けの個人取引先の場合はどうなるのかなと検索したところ、ヘルプに記載がありました。

f:id:tyoshikawa1106:20181207033735p:plain

リードの取引開始に関する考慮事項


会社名を入力していると法人取引先、会社名が未入力の場合は個人取引先と自動で切り替えてくれるみたいです。そもそも会社名は必須じゃないのかと確認したところ、ページレイアウト設定で必須を解除することが可能でした。

f:id:tyoshikawa1106:20181207033901p:plain


実際に試してみた画面がこちらです。

法人取引先

f:id:tyoshikawa1106:20181207033928p:plain

個人取引先

f:id:tyoshikawa1106:20181207033952p:plain


取引開始ボタンクリック後に特に意識することなく切り替わるので個人取引先のときには不便になるといった心配は不要でした。実際に運用で利用する場合はレコードタイプを「法人リード」「個人リード」と用意してそれぞれにページレイアウトを用意するのが良いみたいです。(法人リードの場合は会社項目に必須を残しておく)

SFDC:個人取引先の取引先名を数式で取得

個人取引先を利用する際に少しハマった話。商談に紐付く取引先名を数式で取得しようしたら値が空の場合がありました。個人取引先の場合は「Account.Name」では取得できないみたいです。


こうやって取得できます。

IF(Account.IsPersonAccount,
Account.LastName + ' ' + Account.FirstName,
Account.Name
)

f:id:tyoshikawa1106:20181122072555p:plain

SFDC:商品スケジュールのデータの持ち方

商品スケジュールのデータの持ち形についてです。Apexでは次のような感じでINSERT処理を実行できます。

f:id:tyoshikawa1106:20181109084716p:plain

※実際にはループ処理の中でINSERT処理しちゃだめです。


上記処理の結果、画面にはこのように表示されます。収益の値が5000のデータを3件登録したので15000という値になっています。画面を見る感じでは同じ日付のデータは一件にマージされている感じでした。
f:id:tyoshikawa1106:20181109084806p:plain


ところがSOQLクエリでデータを確認してみると・・・裏側ではデータは3つにわかれたままとなっています。
f:id:tyoshikawa1106:20181109084946p:plain


このデータを画面で編集すると
f:id:tyoshikawa1106:20181109085050p:plain


裏側のデータも一件にマージされます。
f:id:tyoshikawa1106:20181109085115p:plain


同じ日付で複数の商品スケジュールが作成されるのはApexから登録したときのみの挙動となっているようです。開発の際にはこのあたりの注意も必要になります。

SFDC:商談の商品と共にコピーする機能と商品スケジュールについて

現在、Lightning Experienceでは利用できないため、なくなる機能の可能性がありますが、Salesforce Classicでは商談コピー時に商品も一緒にコピーのメニューが用意されています。

f:id:tyoshikawa1106:20181109082314p:plain


商品も一緒にコピーした場合は、商品スケジュールも一緒に作成されます。
f:id:tyoshikawa1106:20181109082545p:plain


このときのApexトリガの挙動について確認しました。
f:id:tyoshikawa1106:20181109082619p:plain

商品スケジュールが存在しない場合

商品スケジュールが存在しない状態で商談と商品のコピーを行った場合、商談商品トリガはINSERT処理のみ実行されます。
f:id:tyoshikawa1106:20181109082734p:plain

商品スケジュールが存在する場合

商品スケジュールが存在する状態で商談と商品のコピーを行った場合は、商談商品トリガはINSERT処理とUPDATE処理が実行されました。
f:id:tyoshikawa1106:20181109082919p:plain


コピーにより商品が作成され、INSERT処理が実行されたあとに、商品に紐付く商品スケジュールもコピーされる処理が実行されます。商品スケジュールが紐ついたタイミングで商品のUPDATE処理が実行されるという流れのようです。


商談商品トリガで商品スケジュールに関する処理を作成する際にはコピー時の挙動についても注意が必要でした。