tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:組織で個人取引先を有効化しているかの判別方法

個人取引先はB2Cの顧客情報を管理するための仕組みです。Salesforceのサポートに問い合わせを行い有効化してもらうことで利用可能になります。この機能を有効化後に法人取引先か個人取引先か判別したい場合はIsPersonAccount項目で判別できます。
f:id:tyoshikawa1106:20190816075643p:plain


これで法人取引先のみ取得対象にする、個人取引先のみ取得対象とするといった判定処理を実行できます。ただし、IsPersonAccount項目は個人取引先機能を有効化した組織でのみ利用可能な項目です。有効化していない場合は宣言しても存在しない項目としてエラーとなります。
f:id:tyoshikawa1106:20190816075829p:plain


この問題の解決方ですが組織での個人取引先有効化の判別方法を調べて公開してくれている方がいらっしゃいました。
f:id:tyoshikawa1106:20190816080021p:plain

https://wedgecommerce.com/check-person-account-enabled-apex/


Schema処理で項目の存在チェックを行って判別する方法です。
f:id:tyoshikawa1106:20190816080043p:plain

public class CheckPersonAccount {
    public boolean getIsPerson(){
        return Schema.sObjectType.Account.fields.getMap().containsKey( 'isPersonAccount' );
    }
}


実行例です。
f:id:tyoshikawa1106:20190816080335p:plain

Boolean result = Schema.sObjectType.Account.fields.getMap().containsKey('isPersonAccount');
System.debug('個人取引先項目の有無 = ' + result);
個人取引先有効の組織

f:id:tyoshikawa1106:20190816080406p:plain

個人取引先無効の組織

f:id:tyoshikawa1106:20190816080511p:plain


通常のカスタマイズの場合はここまで考慮する必要は無いのですが、AppExchangeなど不特定多数での組織での運用を行うアプリケーションの場合は、きちんと判別を行い有効の有無によって制御を行う必要がでてくると思います。

SFDC:ユーザ編集権限とinsufficient access rights on cross-reference idエラー

ユーザ編集権限とinsufficient access rights on cross-reference idエラーについてです。Apexで処理の自動化の仕組みを構築する場合は下記のエラーが発生することがあると思います。

INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, insufficient access rights on cross-reference id: []


このエラー自体はアクセス権限が不足していることによるエラーです。
f:id:tyoshikawa1106:20190816045715p:plain


非公開オブジェクトや更新権限を付与していないオブジェクトへのデータ更新で発生します。取引先などの標準オブジェクトやカスタムオブジェクトの場合は共有設定の権限見直しですぐに解決できますが、ユーザオブジェクトなど一部のオブジェクトの場合は共有設定では公開/参照のみの権限までしか付与できないため考慮が必要になります。


ユーザオブジェクトに更新権限を付与する必要が発生する場面のイメージとしては、データ更新時に所有者などのユーザのカスタム項目をApexトリガなどでUpdate処理を行うような場合に発生します。ログインユーザ自身のデータ更新なら問題ありませんが、他ユーザのデータ更新を行うには更新権限が必要です。
f:id:tyoshikawa1106:20190816050121p:plain


この問題の対応方法としては共有ルールで更新権限を付与する方法があります。
f:id:tyoshikawa1106:20190816050755p:plain


更新権限を付与することでApex経由でのユーザのカスタム項目更新を実行できるようになります。Apexから処理を実行する場合は項目レベルセキュリティの編集権限の付与は無しの状態でも実行できます。


ただしこの方法を選択する際の注意点があります。

  • 標準項目の項目レベルセキュリティ設定は変更不可
  • ユーザのプロファイルページから編集操作への考慮が必要


まずユーザオブジェクトは少し特殊で標準項目に対しての項目レベルセキュリティを変更することができません。そのため編集ページにアクセスできれば管理者以外でも任意の内容に変更できるという認識が必要です。
f:id:tyoshikawa1106:20190816073220p:plain


続いてプロファイルページからの編集操作への考慮についてです。ユーザのプロファイルページにはChatterやレコードの所有者リンクからアクセスできます。共有ルール等で更新権限を付与することで、他のユーザの情報に対してもデータの更新が可能な状態となります。
f:id:tyoshikawa1106:20190816070405p:plain


これの対応方法としてはユーザのプロファイルページレイアウトで参照のみ項目にすることで編集ページにアクセスしても参照のみ権限に変更できます。
f:id:tyoshikawa1106:20190816070458p:plain


氏名とメールアドレスは必須項目となるため参照のみ権限への変更はできないのですが、レイアウトから非表示にすることが可能です。数式項目を用意することで編集可能な標準項目は非表示にしつつ参照のみ項目を表示することも可能です。
f:id:tyoshikawa1106:20190816073957p:plain


この対応で編集ページへのアクセスが行われても任意の値に変更できないようになります。(自己紹介項目などログインしたユーザ側で任意の情報に変更する項目がある場合は専用の入力フォームを用意するか利用を中止するかなどの対応が必要になります。)
f:id:tyoshikawa1106:20190816071112p:plain


上記対応でモバイル側からも変更できないように制御されます。
f:id:tyoshikawa1106:20190816071258p:plain:w200


ユーザの編集ページはもう1箇所あります。ユーザの詳細ページです。こちらに関してはプロファイルで設定・定義を参照するの権限を無効にすることでアクセス不可になります。(基本的に設定・定義を参照するの権限は管理者用の権限です。)

f:id:tyoshikawa1106:20190816071544p:plain


権限除外により歯車アイコンが非表示になり、管理者用のユーザの詳細ページへのアクセスが不可になります。
f:id:tyoshikawa1106:20190816071604p:plain


ユーザオブジェクトにカスタム項目を用意してApex経由で一般ユーザが更新するというケースはあまり無い気もしますが、もし必要になる場合は上記のように権限周りについての考慮が必要になります。

MacBookと外部ディスプレイを繋げてマルチディスプレイ環境の構築をやってみました

自宅のPC環境でMacBookと外部ディスプレイを2台接続してマルチディスプレイ環境の構築をやってみました。

f:id:tyoshikawa1106:20190814200337j:plain


購入したディスプレイはPhilipsの23.6インチのディスプレイです。なんとなくPhilipsの商品で探していたときにAmazonでセールをしていたので買ってみました。HDMIケーブルなど通常利用する際に必要なものがセットで付いてきたので良かったです。

f:id:tyoshikawa1106:20190812201634j:plain

Philips 23.6型ワイド液晶ディスプレイ (PLSパネル/フルHD/HDMI1.4/DVI-D/D-Sub15/5年間フル保証) 246E7QDSB/11


追加で買ったのがAppleストアでも販売しているBelkin 4K Mini DisplayPort to HDMI Adapter。2台目のディスプレイとつなぐためのHDMIケーブルをMacBookに接続する際に変換アダプタとして必要になりました。

f:id:tyoshikawa1106:20190815062538p:plain

Belkin 4K Mini DisplayPort to HDMI Adapter - Apple(日本)


MacBookとディスプレイを2台接続するときですが1台目は普通にHDMIケーブルを接続するだけで利用できます。

f:id:tyoshikawa1106:20190815061924j:plain


今使っているMacBookが2013年版のMacBook ProだったのですがHDMIの接続端子は1箇所しか無いため、2台目の接続はそのままではできませんでした。この問題で悩んでいたのですが、Belkin 4K Mini DisplayPort to HDMI AdapterでHDMIケーブルをMini DisplayPort端子に変換することでMacBookと接続することで解決できました。

f:id:tyoshikawa1106:20190815061903j:plain


ディスプレイ2台 / HDMIケーブル / Mini DisplayPortを用意することでマルチディスプレイ環境構築ができました。まだあまり使ってませんがブラウザとVSCodeを開いて作業するときに、MacBook内でウィンドウの切り替えをせずに作業できるようになって快適になったと思います。(もう一台はまた別の情報を表示しておく予定)


ディスプレイ購入の際に4Kじゃないと画質が気になるかもと悩んだのですが、4Kでなくても画質は気にならなかったです。またディスプレイのサイズも23.6インチで丁度良かったです。お店で見たときには少し小さく見えたりしましたが部屋に置いてみたら十分なサイズでした。

おまけ - 環境構築中に失敗した話

自分でマルチディスプレイの環境を用意するのは初めてだったのですが、とりあえずHDMIケーブルを2つ接続する必要があるので別途必要になるんだろうなと検索したところ、分配器の商品が表示されました。
f:id:tyoshikawa1106:20190815064009p:plain


絵的にイメージしてた形状だったのでこれで接続できるんだなと買ってみて試したところ、同じ内容が2つのモニタで表示されました。分配器は会議など複数人で見るようなときに同じ内容をディスプレイに表示する用途だったみたいです。(PCのミラーリング設定みたいになんとなく設定で切り替えできるイメージでした。)


お店に行った時に知ったのですが類似の製品で切替器というものあってそちらは一つのモニタに複数のPCを接続して必要に応じて表示を切替できる仕組みでした。(こちらは商品説明で買う前に気づきました。)


この失敗の後にHDMIケーブルをMini Display Portに変換できる製品があることとAppleストアでも取り扱っていることを教えてもらって無事に問題が解決しました。

SFDC:Salesforce Surveysによるアンケート機能の実装を検討してみました

Salesforce Surveysによるアンケート機能の実装を検討してみました。検討の結果要件を満たせないという結論になったのですが、Salesforce Surveysで何ができて何ができないのかざっくり確認できたのでまとめておきます。

f:id:tyoshikawa1106:20190812095704p:plain

Salesforce Surveysとは

Salesforce標準機能のひとつでシンプルなエディタでアンケートの仕組みを実装できる機能です。
f:id:tyoshikawa1106:20190812092400p:plain


自分の環境で試したいという方は初期設定方法はこちら。たぶんまだ動く。

今回の検討要件

  • 顧客(取引先責任者)にアンケートメールを送付
  • アンケートには入力フォームリンクがある
  • 顧客はリンク経由で入力フォームアクセスして質問に回答
  • PCまたはモバイル端末のどちらでもアクセス
  • 顧客はコミュニティユーザでは無い
  • 回答結果は取引先責任者に紐付く
  • 回答結果は回答者ごと、質問ごとに集計可能

ざっくり上記のような感じ。一般的なサービス運営でよくある仕組みです。

今回確認できたこと

Salesforce Surveys機能の対象者の制限

Salesforce社としての仕様は下記のとおりです。ヘルプの記載とサポートに相談してもこのように回答頂けると思います。

Salesforce Surveysの対象者はCommunity Cloudユーザです。それ以外の取引先責任者へもアンケートの送付は可能ですが、その場合は回答者の識別ができません。(匿名アンケートになる。)


アンケートの招待のページで匿名のON/OFFの設定がありますが、URLが共通のことからもコミュニティユーザでない場合は回答者の識別ができないというのが正しいと思います。
f:id:tyoshikawa1106:20190812095328p:plain

回答者識別の裏技

Salesforce社の回答は上記のとおりですが、裏技的な方法で紐付けが可能です。下記のカスタマイズができます。

  • アンケート機能のオブジェクトは取引先責任者の参照項目を追加ができる
  • アンケート機能のオブジェクトに対してプロセスビルダーの設定が可能


サポート外の方法ですが、裏側でガチャガチャ設定することで強引に取引先責任者との紐付けが可能でした。

レポート集計とアンケートオブジェクトの構成

上記の通り強引な方法で取引先責任者と紐付けることができました。続いてレポートの集計処理です。まずアンケートの情報は下記のオブジェクトで管理されています。

  • > アンケート
    • > アンケートの招待
      • > アンケートの回答

アンケートで枠を管理し、招待で取引先責任者にアンケートを送付。招待に対して回答が紐付くという形です。通常の用途では一つの招待に複数の取引先責任者が紐付く仕様ですが、上記の強引に取引先責任者を紐付ける方法の場合は、一つの招待に対して一つの取引先責任者という形で管理することになります。Salesforceのデータ上はアンケート回答者の特定はできませんが、招待と回答が1対1になることで事実上特定ができたという考え方です。


データ上は用意できますが、問題はレポートによる集計です。アンケートのレポートはカスタムレポートタイプを用意することで作成可能になります。
f:id:tyoshikawa1106:20190812101436p:plain


ここで問題が発生しました。この方法で集計する場合のデータ型の問題です。アンケートの回答でスコアなど数値での回答は平均値などの集計が必要になりますが、この方法での集計の場合、数値という認識はされないため、平均値などの算出ができませんでした。結果としてその顧客が選択した値の認識が実現できるだけでレポートへの集計は実現できないという問題があります。

f:id:tyoshikawa1106:20190812101927p:plain:w300


補足としてSalesforce Surveys本来の使い方としては分析機能で回答を確認するという使い方が用意されています。
f:id:tyoshikawa1106:20190812102110p:plain

強引に回答者識別の方法についての感想

プロセスビルダーなどで独自カスタマイズを組み合わせることで一見コミュニティユーザ以外の取引先責任者向けに回答者を識別できるアンケートの仕組みを実現できそうでしたが、結果としてSalesforce Surveysでの分析機能が活用できず、またレポートなどの回答結果の集計が不可であるという結果でした。


もちろん数式項目を組み合わせることで、強引に回答結果を数値変換する方法など実現自体は可能かもしれません。ですが、Salesforce Surveysを利用するメリットとしては複雑なカスタマイズを必要としないアンケートの作成が一番の理由と思いますので、アンケート作成のたびにプロセスビルダーの設定や数式項目作成が必要になるとすればSalesforce Surveysを使用するメリットは無いと思われます。

その他の確認できたこと

回答結果のカスタマイズ

回答形式で評価の場合は選択肢の下のテキストをカスタマイズできます。
f:id:tyoshikawa1106:20190812103355p:plain

f:id:tyoshikawa1106:20190812103110p:plain


ですがNPSなどの一部の形式ではテキストのカスタマイズができない仕様となっています。
f:id:tyoshikawa1106:20190812103317p:plain

アンケートのデザイン

アンケートのデザイン部分のカスタマイズですが、HTMLなどによるレイアウト変更はできないようです。変更可能な部分として背景画像の変更ができます。アンケートにロゴの表示やヘッダー、フッターの設定を行いたい場合はそうした背景画像を用意することになります。ちなみにこの背景画像はSandbox作成時に引き継がれない情報となります。
f:id:tyoshikawa1106:20190812103458p:plain:w200

必須や分岐制御

必須チェックや分岐制御は可能となっています。
f:id:tyoshikawa1106:20190812103815p:plain

f:id:tyoshikawa1106:20190812103857p:plain

モバイル表示について

レイアウトのカスタマイズに縛りはありますが、モバイルレイアウトが可能になるというメリットがあります。
f:id:tyoshikawa1106:20190812111342p:plain:w200

f:id:tyoshikawa1106:20190812111419p:plain:w200

Salesforce Surveysの代替案

上記のとおり、コミュニティユーザ以外にアンケートを送付するという要件の場合、Salesforce Surveysを使用するのはあまり適切ではありません。そこで代わりの方法ですが3つの選択肢があります。

Salesforce以外のサービスを利用する

アンケートの仕組みを用意するサービスはいくつかあります。こちらを利用することでカスタマイズ性の高いアンケートの仕組みを用意することが可能です。ただし、Salesforceとのデータ連携をどうするかが課題になります。たとえば特定の商談フェーズまで進んでいる取引先責任者に対してメール送付といったことを実現するのが難しくなります。

AppExchangeで対応

こちらもいくつか用意されています。Salesforce社もGetFeedbackというサービスを利用しているみたいです。(サポート利用後のアンケートがそうでした。)

GetFeedback: Surveys for Salesforce - GetFeedback - AppExchange


尚、GetFeedbackは海外のサービスのため日本語でのサポートが受けられない可能性があります。日本のパートナー企業がアンケートの仕組みをAppExchnageで提供しているのでそちらも確認してみると良いかもしれません。

Force.com Sitesで開発

自分達の組織に合わせて使いやすいアンケート機能を構築するのであればForce.com Sitesの仕組みで構築するのが良いと思います。独自開発が必要になりますが柔軟なカスタマイズが可能になります。

Salesforce Surveysの費用

最後にSalesforce Surveysの費用感です。Salesforce Surveysはアドオン機能で追加ライセンスの購入が必要になります。作成するアンケートが1つの場合は追加ライセンス無しで運用できますが、2つ以上の作成からライセンスが必要になります。数ヶ月前に導入検討で相談したときに費用の有無は不明ですって状態だったのであまり導入してるところは多くなさそうですが、とりあえず導入検討するときにはSalesforce社に問い合わせすると要件の確認等対応してくれると思います。

SFDC:VSCodeとSalesforce Extensionsの新機能 (July 2019)

VSCodeとSalesforce Extensionsの新機能 (July 2019)です。

f:id:tyoshikawa1106:20190811140011p:plain

Salesforce IDEs: July 2019 Updates | Developer Force Blog


VSCodeによるSalesforce開発環境についてはこちら。

任意の組織に対して開発する

ちょっと前まではDevHub組織で用意したスクラッチ組織が開発対象でしたが、MavensMateと同じようにSandbox組織やDE組織での開発に利用できるようになったとのことです。

保存時にデプロイ

"salesforcedx-vscode-core.push-or-deploy-on-save.enabled": trueと宣言すると保存時にSalesforce側に反映されます。falseだと反映されないので、アレっとならないようにtrueにした方が良いと思います。組織に接続したときにはfalseになっているので、環境構築のたびにチェックすると良さそうです。
f:id:tyoshikawa1106:20190811141603p:plain

組織管理

画面左下のあるVSCode Orgのメニューから接続組織を追加したり、変更したりできるとのことです。
f:id:tyoshikawa1106:20190811140859p:plain

組織ブラウザ

イマイチわかっていない機能ですが、以下のような説明がありました。
f:id:tyoshikawa1106:20190811142530p:plain

まだβ版機能とのことです。設定方法としてはVS Code側の設定で有効化する必要があります。
f:id:tyoshikawa1106:20190811142631p:plain:w300

f:id:tyoshikawa1106:20190811142657p:plain


有効化するとsettings.jsonファイルに設定情報が追加されました。
f:id:tyoshikawa1106:20190811142717p:plain

組織に対する差分

7月31日の記事時点から来週または二週間後ぐらいにリリースされるみたいです。便利そう。

Lightning Webコンポーネント

Lightning Webコンポーネントの開発もサポートされるようになったそうです。
f:id:tyoshikawa1106:20190811143023p:plain:w300

HTMLコード補完

Lightning Webコンポーネント開発時にHTMLコード補完されるようになったそうです。

Javascriptコード補完

Lightning Webコンポーネント開発でJavascriptファイルのコード補完がされるようになったそうです。

ESLint統合

Lightning Webコンポーネント開発でESLintの仕組みが利用可能になったそうです。

その他

なんかいろいろできるようになっています。

  • Lightning Explorer
  • Apexリファクタリング
  • コードのフォーマット
  • Deploy / Retrieveでの競合検出
  • SOQL言語機能
  • パフォーマンスの更新
  • LWCローカル開発
  • MavensMateについて
  • Force.com IDE


特に便利そうだったのはApexリファクタリングで右クリックメニューのRename Symbol機能で変数名を一括置換できます。
f:id:tyoshikawa1106:20190811143552p:plain

f:id:tyoshikawa1106:20190811143432p:plain


今までのテキストエディタの置換機能と違うところは、文字列ではなく変数名を識別してくれるので誤った置換が行われないというメリットがありました。

例) accountという変数名を置換したときにaccountListという変数名やAccountというオブジェクト側への影響はありませんでした。
f:id:tyoshikawa1106:20190811143912p:plain


他のファイル(ページ側)への変換は行われないのでそのファイル内のみでの作業を行うためのサポート機能になります。


VSCodeとSalesforce Extensionsを使った開発は最近始めてまだ慣れない部分もありますが、Terminalからコマンド実行したりプロジェクトファイルの雛形作成してくれたりと便利機能が多いのではやめに切り替えたほうが良さそうです。
※MavensMateは終了しました。またForce.com IDEは2019年10月12日頃に終了するそうです。

co-meeting もくもく会#19に参加しました

8月10日に開催されたco-meetingもくもく会に参加しました。

f:id:tyoshikawa1106:20190810100745j:plain

f:id:tyoshikawa1106:20190810100825j:plain

f:id:tyoshikawa1106:20190810101326j:plain

もくもく会スケジュール

だいたいこんな感じのスケジュールとなってます。

  • 10:00-12:00:もくもくと作業
  • 12:00-13:00:お昼ご飯
  • 13:00-18:30:もくもくと作業
  • 18:30-20:30:打ち上げ

やったこと

SalesforceのVisualforceページのサンプルコード作成をして過ごしました。家で作業するよりも集中して進められたと思います。作業の詳細は下記の記事にまとめています。


サンプルコードつくった後はGithubへのコードプッシュもやってみました。今まで開発環境はMavensMateでしたが最近VSCodeに切り替えたのと拡張機能のSalesforce Extensionsの利用開始でやり方が変わった部分があったのでちょっと試してみました。


その他、空いた時間と気分転換でササッと書ける内容をブログ投稿したりしました。


打ち上げの時間にもくもく会でやったことの話などなどいろいろ話ができて楽しかったです。
f:id:tyoshikawa1106:20190810210257j:plain

関連記事

SFDC:Visuaforce開発の種類について

Visualforce開発の種類についてです。Visualforceはapexタグという独自タグを使わないと行けないイメージが定着していますが、いろんな方法で開発が可能になっていますので紹介します。(下記の名前部分は説明用に勝手につけたやつ)

Visualforce Classic

apexタグをつかった開発方法です。pageBlockやpageBlockTableでClassicデザインのページ開発が可能になっています。

コードイメージ

f:id:tyoshikawa1106:20190810162314p:plain

画面イメージ①

f:id:tyoshikawa1106:20190810162030p:plain

画面イメージ②

f:id:tyoshikawa1106:20190810162048p:plain

Visualforce Clasic (Lightningスタイル版)

apexタグをつかった開発方法ですが、『lightningStylesheets="true"』を宣言することでLighitning Experienceに近い見た目に変更できます。

コードイメージ

f:id:tyoshikawa1106:20190810162555p:plain

画面イメージ①

f:id:tyoshikawa1106:20190810162432p:plain

画面イメージ②

f:id:tyoshikawa1106:20190810162502p:plain

Visualforce Lightning (Javascript Remoting)

apexタグを使わない開発方法。HTMLタグとJavascriptを中心に進められます。CSSはLightning Design Systemを利用することでLightning Experienceと同じ見た目に揃えることができます。

コードイメージ

f:id:tyoshikawa1106:20190810163110p:plain

画面イメージ①

f:id:tyoshikawa1106:20190810162754p:plain

画面イメージ②

f:id:tyoshikawa1106:20190810162951p:plain

apexタグ or Javascript Remoting

apexタグを使わない方法の場合はフロント側のほとんどの機能をJavascriptで実装する必要があります。実装難易度は上がりますが、apexタグ使用時の制限の影響を受けずに開発が可能です。

例: ビューステートエラー

apexタグの場合は画面に表示する情報量が多いとビューステートエラーが発生します。例えば取引先検索ページの場合、8000件の検索結果を表示すると発生しました。
f:id:tyoshikawa1106:20190810163617p:plain:w300

f:id:tyoshikawa1106:20190810163650p:plain


Javascript Remotingの場合は上記ビューステートエラーが発生した件数でも問題なく表示できます。
f:id:tyoshikawa1106:20190810163829p:plain

DEMO

サンプルコード

github.com