tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Pardot - Engagement Historyの落とし穴と対策方法

Pardotの便利機能、Engagement Historyの落とし穴と対策方法についてです。Engagement HistoryとはPardot上で取得できるWebアクティティビティの情報をSalesforce側で時系列に表示できる機能となります。
f:id:tyoshikawa1106:20190425184645p:plain

Explore Salesforce Engage Features Unit | Salesforce Trailhead


Engagement Historyで表示できるアクティビティ情報の中に商談の作成情報が含まれています。だいたいこんな感じ。

イメージ (最新情報が上に来る)
商談ロスト 4/26 00:00
    |
商談関連付け 4/25 15:00
    |
商談作成 4/25 15:00

通常は上記のような感じでひと目で履歴が見れてわかりやすいのですが、なぜか下記のように表示されるのがありました。

商談関連付け 4/25 15:00
    |
商談作成 4/25 15:00
    |
商談ロスト 4/25 00:00


実際の画面を見るとよりわかりやすいのですが、商談作成日時よりも過去の日付で商談ロストの記録が表示されます。時系列で確認できるのがメリットのEngagement Historyの機能でこの挙動は困りました。。


Salesforceのサポートに確認したところ下記の仕様が原因でした。

  • Pardotのアクティティビティは基本日時型の情報を保持している
  • 日付型場合は0:00として扱われる。
  • 商談作成や関連付けは日時型の項目から時間を取得するが、ロストの場合は商談の完了予定日から取得する。
  • 商談の完了予定日は日付型の項目なので時間部分は0:00で扱われる。

 ↓

結果として作成日当日にロストフェーズに更新した場合、作成日時よりもロスト日時の記録が過去の記録として扱われるケースが発生する。

更にEngagement Historyの日時のTime Zoneが日本時間にならないというIssueが存在しているみたいです。
※リンク忘れたのでまた今度。

Issueの方は将来的に解決する可能性がありますが、完了予定日が日時になる可能性は低いため商談ロストが作成よりも過去の記録として表示される問題は解決しない可能性が高そうでした。

対策方法について

サポートの方に教えてもらった部分で、商談作成日とロスト日が一緒になることはレアケースとの話を聞き、下記の対策で対処することにしました。

商談ロスト時に商談作成日とロスト日が一致する場合、完了予定日を翌日日付に更新する。 → by Apexトリガ


まだ結果は未確認ですがおそらくこれで対応できると思います。(完了予定日更新してもアクティビティは更新されなかった。。)

関連記事

今回のとは別内容でしたが、ヘルプに考慮事項がまとめられています。

Engagement History の考慮事項

SFDC:一般ユーザへのすべてのデータの編集権限付与を試してみました

一般ユーザへのすべてのデータの編集権限付与を試してみました。基本的に一般ユーザには設定画面を表示する必要はないと思っているので、すべてのデータの編集権限や設定・定義を参照する権限などは付与しない方がいいと思っているのですが、仮に権限を付与した場合、どこまでアクセスできるようになるか把握してない箇所もあったのでDeveloer組織で確認してみました。
f:id:tyoshikawa1106:20190421115156p:plain


今回の検証用に可能な限り権限を除外したプロファイルを用意して一般ユーザに割り当てます。
f:id:tyoshikawa1106:20190421115402p:plain


この状態で一般ユーザのSalesforceページを確認すると歯車アイコンが表示されず設定ページ自体に移動できないことが確認できます。
f:id:tyoshikawa1106:20190421120216p:plain


続いて一般ユーザにすべての変更権限を付与します。一部ユーザのみに付与するという場面を想定してプロファイルではなく権限セットで追加します。すべて変更権限を付与する場合は設定・定義を参照する権限を含むいくつかの権限付与も必要になります。(チェック時に自動追加されます。)
f:id:tyoshikawa1106:20190421120449p:plain


この権限セットを一般ユーザに割り当てると歯車アイコンが表示されるようになります。
f:id:tyoshikawa1106:20190421120615p:plain


歯車アイコンが表示されることでまず開発者コンソールにアクセスできるようになります。ですが、こちらはAPI権限が付与されていなければエラーメッセージが表示されるだけで先には進めませんでした。
f:id:tyoshikawa1106:20190421120939p:plain


続いて設定ページ側です。まず開発メニューが参照ができるか確認してみました。
f:id:tyoshikawa1106:20190421121422p:plain


DevHubメニューへのアクセスは可能で有効化も実行できました。(今回の話とは関係ないけどDevHub有効化したら無効に戻せなかった。。)
f:id:tyoshikawa1106:20190421121537p:plain


VisualforceやApexクラスのコード部分への参照は可能でした。ただし編集はできないようになっています。
f:id:tyoshikawa1106:20190421122357p:plain


オブジェクトマネージャについてです。こちらカスタムオブジェクトの新規作成はアクセス権限が付与されていませんでした。新規オブジェクトが作成されるといったことは気にしなくて良さそうです。
f:id:tyoshikawa1106:20190421121702p:plain


標準オブジェクトへの項目の追加はもちろん、ページレイアウトのカスタマイズも権限は無い状態でした。
f:id:tyoshikawa1106:20190421121843p:plain


Apexトリガはオブジェクトマネージャのページからもアクセスできます。コードは参照のみの状態となっていました。
f:id:tyoshikawa1106:20190421122025p:plain


検索レイアウトは参照できましたが、設定の変更はできないみたいです。
f:id:tyoshikawa1106:20190421122130p:plain


Apexクラスの編集はできませんがApexテストの実行権限は付与されるみたいです。
f:id:tyoshikawa1106:20190421122554p:plain


重要な更新は内容の確認はできますが有効化はできませんでした。(たぶん)
f:id:tyoshikawa1106:20190421122702p:plain


リモートサイトの追加はできるようです。(Salesforce.com からこの Web アドレスにアクセスできるようできます。)
f:id:tyoshikawa1106:20190421122742p:plain


ユーザのページでは他ユーザ情報の参照と代理ログインが可能になっていました。念の為ヘルプを確認したところ「すべてのデータの編集」権限で代理ログインが可能になるので正しい挙動です。
f:id:tyoshikawa1106:20190421123151p:plain

他のユーザとしてログイン


代理ログインまでたどり着ければシステム管理者ユーザとしてログインしてプロファイルやApexコード、その他の設定も変更可能になります。
f:id:tyoshikawa1106:20190421123416p:plain


ということで一部の情報を見せるという目的で一般ユーザに「すべてのデータの編集権限」を付与するのはやめておいたほうが良さそうです。設定・定義を参照する権限も目的がなければ付与しなくて良いと思います。

SFDC:Lightning Experienceとaタグのtarget指定について

Lightnig Experienceを前提としたVisualforceページで下記のようなリンクボタンを用意しました。
f:id:tyoshikawa1106:20190421113207p:plain


上記処理は外部サイトへの遷移を目的としたリンク機能です。aタグにボタンのスタイルを適用させて構築しています。
f:id:tyoshikawa1106:20190421113335p:plain


aタグに対してtarget指定はしていませんが、Lightning Exceperience状態でクリックすると別タブで表示されるようになっています。Classicでは現在のタブで遷移したのでLightning Experienceでのみの挙動のようです。


また、一つ予期せぬ挙動がありました。URLの値に&がある状態でtarget指定すると・・・
f:id:tyoshikawa1106:20190421114012p:plain


URLの末尾に&が自動付与されるみたいです。
f:id:tyoshikawa1106:20190421114259p:plain


target指定がなければ自動付与されなかったので外部サイトへのリンクの場合はtarget指定は除外しておくのが良さそうでした。

SFDC:ApexによるForce.comサイトのドメイン部分取得を試してみました

ApexでForce.comサイトのドメイン部分取得を試してみました。Force.comサイトはSalesforceの仕組みで外部公開できるWebサイトを構築できる仕組みです。
f:id:tyoshikawa1106:20190421104735p:plain


URLはこんな感じになります。※developer-editionはDE組織の場合に自動で表示される部分。

https://<任意の値>-developer-edition.ap5.force.com/


Force.comサイトのURLも本番組織とSandbox組織で別々のURLが設定されます。Sandbox組織にも個別にURLが付与されるのは便利ですが、検証用にSandbox組織のサイトURLをブックマークしておいたあとに組織のリフレッシュを行った場合、URLが新しくなるためブックマークをやり直す必要が出てきます。


このブックマークのやり直しが少し面倒な作業となってしまうので自動的にリンクを用意できる仕組みを考えてみました。今回参考にしたのはこちらのページです。
f:id:tyoshikawa1106:20190421105521p:plain

Get Site URL from apex - Salesforce Stack Exchange


下記の処理で取得できるのと紹介がありました。

String name = 'mysite';

Site site = [
    SELECT GuestUserId
    FROM Site
    WHERE Name = :name
];

String path = '/sites/servlet.SiteDebugMode';
PageReference pr = new PageReference(path);
pr.getParameters().put('guid', site.GuestUserId);
pr.getParameters().put('sitedebugmode', 'x');
String url = pr.getContent().toString().substringAfter('URL=').substringBefore(path);

System.debug(url); //eg "http://dev-bigass.cs81.force.com/mysite"


コピペして開発者コンソールで試してみると・・・
f:id:tyoshikawa1106:20190421110056p:plain


無事にドメイン部分を取得できました。
f:id:tyoshikawa1106:20190421110212p:plain


動作することは確認できたので、今回やりたいことに合わせてApexクラスを用意します。
f:id:tyoshikawa1106:20190421110543p:plain


基本的にはコンストラクタメソッドでURLを取得しているだけです。クエリ取得処理やURL取得処理は別メソッドに分けて呼び出すようにするとメンテがしやすくなります。(ちゃんとした機能として実装するときはHelperクラス、Daoクラスというように別クラスに分けたりします。)
f:id:tyoshikawa1106:20190421110842p:plain:w300


Apexクラス実装時に注意が必要なのはPageReference型変数に対してgetContent処理を行うとき、getContent処理はテストクラス内では実行することができたいため、『Test.isRunningTest()』処理でテストクラスでの処理を分岐させています。
f:id:tyoshikawa1106:20190421111033p:plain


Apexクラスの用意ができたらVisualforceページ側でリンクを用意するだけです。siteUrl変数にForce.comサイトのドメイン部分が格納されているのであとはページ名やURLパラメータを文字列で付与するだけ。
f:id:tyoshikawa1106:20190421112658p:plain


こんな感じでつくったページがこちら。ラベルとボタンが表示されているだけの簡易な機能ですが、検証等でアクセスするForce.comサイトページのリンク集として活用できます。
f:id:tyoshikawa1106:20190421111533p:plain


ボタンにマウスを当てればリンクが設定されていることを確認できます。
f:id:tyoshikawa1106:20190421111833p:plain


こうしたページを用意しておけばSandboxリフレッシュ後に一ページずつURLを確認していく手間が省けるので作業が効率化されます。ApexでForce.comサイトのドメイン部分取得の仕組みこんな感じで活用するのが良いと思います。

SFDC:Lightning Experienceの結合レポートを試してみました

Spring'19よりLightning Experienceでも結合レポートが利用できるようになりました。
f:id:tyoshikawa1106:20190418211110p:plain

Lightning Experience での結合レポートの有効化


どこから作成できるのかな...と探してみたところ画面左上のレポートというテキストがメニューになっていました。
f:id:tyoshikawa1106:20190418211016p:plain


雰囲気は違いますがClassicのときと同じように設定できます。
f:id:tyoshikawa1106:20190418211653p:plain


またグルーピングしていればレポートグラフも表示できました。
f:id:tyoshikawa1106:20190418211948p:plain


結合レポート利用時の注意点ですが、Salesforceモバイルアプリではサポートされていないようです。
f:id:tyoshikawa1106:20190418212507p:plain

レポートおよびダッシュボード: Salesforce アプリケーションで使用できない機能とその新機能


またダッシュボードで使用するときに使用不可となる条件があるようです。(最初、ダッシュボード自体サポートされていないのかと思っていたのですが、ちょっと違いました。)
f:id:tyoshikawa1106:20190418212649p:plain

合レポート制限、制限および割り当て


個人的にあまり使う機会がないイメージがありますが、結合レポートで実現できることと制約について覚えておくとどこかで役立つかもしれません。

SFDC:レコード登録時に自動フォローする機能について確認してみました

設定で有効化することで自分が作成したレコードの自動フォローが可能になります。管理者向けの設定ではなく私の設定ページ側での有効化です。

f:id:tyoshikawa1106:20190418205452p:plain


有効化すると取引先などのレコードを登録すると自動でフォロー状態となります。
f:id:tyoshikawa1106:20190418205831p:plain


この機能について改めて確認していたところ落とし穴がありました。ToDoの作成のときには自動フォロー機能が実行されないみたいです。
f:id:tyoshikawa1106:20190418205925p:plain


原因はヘルプに記載されていたこちらの仕様でした。

子レコードを作成すると、デフォルトで親レコードの所有者がその子レコードの所有者になります。ただし、[自動フォロー] が設定されていても、子レコードは自動的にフォローされることはありません。親レコードの所有者であっても、子レコードを明示的にフォローする必要があります。

その他にもいくつかの注意点がありました。
f:id:tyoshikawa1106:20190418210114p:plain


詳細が記載されたヘルプはこちらです。

自分が作成したレコードの自動フォロー


また自動フォローの話とは別件ですが、ユーザがフォロー可能な件数は500件までとなっています。すべてのレコードをフォローする前提で設計するとどこかで制限にひっかかると思いますので事前に対策を検討しておくほうが良さそうです。

SFDC:キャンペーンインフルエンスの有効化を試してみました

キャンペーンインフルエンスの有効化を試してみました。キャンペーンインフルエンスは1 つの商談に影響を及ぼす複数のキャンペーンに関する測定とレポート作成を行うことができる機能とのことです。

f:id:tyoshikawa1106:20190410194500p:plain


有効化すると再計算処理が実施されます。
f:id:tyoshikawa1106:20190410194536p:plain


ヘルプにも情報がありますが、キャンペーンインフルエンス 1.0 にのみ適用と要確認的な書き方がされていました。
f:id:tyoshikawa1106:20190410194736p:plain

キャンペーンインフルエンスの設定


キャンペーンインフルエンスの設定で用意されているのは「モデルの設定」と「自動関連付け設定」です。

モデルの設定

f:id:tyoshikawa1106:20190410195005p:plain

自動関連付け設定

f:id:tyoshikawa1106:20190410195045p:plain


モデルの設定で入力するのはこんな感じ。
f:id:tyoshikawa1106:20190410195212p:plain


モデルの用途は対象のレコード絞り込みをする感じっぽいです。

[レコードの設定] で、収益属性に関係なくキャンペーンインフルエンスレコードを作成するには、[すべてのレコード] を選択します。収益属性が 0% よりも上回っている場合にのみレコードを作成するには、[>0% 属性のレコード] を選択します。

カスタムキャンペーンインフルエンスモデルの作成


モデルをロックとはキャンペーンインフルエンスの追加や編集をできなくするためのものみたいです。

ユーザがキャンペーンインフルエンスモデルのキャンペーンインフルエンスレコードを追加または編集できないようにするには、モデルをロックします。ロックされたモデルは、API 経由でのみアクセスできます。


キャンペーンインフルエンスの情報は商談詳細ページに追加できる関連リストから確認できますが、関連リストにアクセスするには権限セットの設定が必要になります。

商談のキャンペーンインフルエンス関連リストが利用できない


権限セットでCRMユーザにキャンペーンインフルエンスの権限がついていました。
f:id:tyoshikawa1106:20190410200750p:plain


新規でつくる権限セットでも追加できます。
f:id:tyoshikawa1106:20190410200859p:plain


権限セット追加で確かにレイアウトに表示できるようになりました。
f:id:tyoshikawa1106:20190410201105p:plain


表示した関連リストから新規ボタンの利用ができなさそうでしたが、主キャンペーンの項目でキャンペーンレコードと紐つけたら自動で一件データが登録されました。取引先責任者との紐付けができなかったのですが、おそらくキャンペーンインフルエンスの自動割当設定で紐つけるのだと思います。
f:id:tyoshikawa1106:20190410201521p:plain


キャンペーンインフルエンスのデータはキャンペーン詳細ページでは「影響を受ける商談」関連リストで確認できるようです。
f:id:tyoshikawa1106:20190410201705p:plain


キャンペーンインフルエンスの有効化と確認が必要な設定メニューはこんな感じでした。商談とキャンペーンの自動紐付けは分析に役立ちそうなので、キャンペーンをつかったマーケティング施策を行う場合はこの機能の使い方をチェックするのが良さそうです。

関連

検索したら5年ぐらい前に勉強してた。(ヘルプの機能概要読んでただけ。。)


リリースノートの記事も検索でヒットしました。

カスタマイズ可能なキャンペーンインフルエンスの設定