tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Force.com Sitesで構築された予約ページで仮予約の仕組みを運用してみてわかったこと

Force.com SitesはForce.comプラットフォーム上でネイティブに動作するパブリックWebサイトやアプリケーションを作成できる仕組みです。f:id:tyoshikawa1106:20170604201406p:plain

JP:Sites - developer.force.com


Salesforceのデータベースに登録された情報を利用できるWebサイトを構築できるので、開発者以外のスタッフでもメンテナンスできるサイトを構築できます。ホームページや製品紹介のサイト、ログインページを用意してCommunity Cloudと連携させるといった使い方がよくされていると思います。


少し前にこのForce.com Sitesで構築された予約ページを引き継ぎました。その予約ページの機能の中に仮予約の仕組みが用意されていたのですが、実際に運用を回してみていろいろわかったことがあるので紹介します。

予約ページの利用の流れ

  1. 予約ページにアクセス
  2. 日時を選択
  3. 予約に必要な情報を入力 (名前や連絡先など)
  4. 次へボタンで確認ページへ移動
  5. 入力した内容に誤りがないかを確認
  6. 仮予約ボタンをクリック
    (予約データが作成される。ステータス→仮予約)
  7. 仮予約完了画面に移動。本予約までの流れを確認
  8. 顧客が仮予約完了通知メールを受信
  9. 通知メールに記載されたURLをクリック
    (24時間クリックしないとキャンセル扱い)
  10. 本予約完了ページへ移動
  11. 予約確定 (ステータス→予約確定・その他必要な処理が実行される)


ざっくりこんな感じです。仮予約の仕組みがあることで誤ったメールアドレスを入力したり存在しない連絡先を入力した場合に、予約確定の作業を進められないメリットがあります。また24時間すぎると本予約のリンクが無効になり放置された予約作業を無効にすることができます。

実際に運用してみて

仮予約完了通知メールから本予約を行う流れですが下記のパターンが発生しました。

  • 通知メールに記載された本予約のリンククリックを行わない
    (メールや必要な操作に気づかない)
  • PCメールブロックなどにより通知メールが届かない


本来、社内スタッフは予約確定した情報のみ気にすればいいのですが、上記のパターンにより利用者は予約したつもりでもシステム上は予約されていない状況が発生しました。


その結果、自動化されているはずの予約手続きを社内スタッフが状況を確認して手動で対応しなくてはならない問題が発生しました。また本予約完了ページで実行されるはずの処理が実行されないので、その部分の対応も必要になりスタッフへの負担が増加することになりました。

現在

先日予約ページの再開発を行いこの仮予約の仕組みを除外しました。これにより利用者は今までよりも1つ手順が少ない状態で予約手続きを進めることができます。また必要事項を入力して予約ボタンを押せばその場で予約完了ページが表示されるため、メールが届かない場合でも予約が確定したことを確認できるようになりました。


システム上も必ず予約確定のステータスで予約情報が登録されるため、不要な手作業が発生することは無くなりました。開発者側としても予約のオペレーションがシンプルになったことでコードの量が少なくなりメンテナンス性が向上するメリットがありました。

まとめ

仮予約の仕組みを実際に運用してみてスタッフへの負荷が掛かるオペレーションになることが確認できました。また仮予約という複雑な仕組みがあることでメンテナンスしずらいシステムが出来上がることが確認できました。


もし予約ページの開発を依頼されて、仮予約の仕組みが欲しいという話になったときは上記のようなリスクを伝えてできるだけシンプルなオペレーションになるように話を進めると利用者に負担の掛からないシステムを開発できると思います。

SFDC:無効ユーザをレコードの所有者に設定するときの制限について

Salesforceでは所有者の項目をつかって誰が担当しているレコードかを管理できます。通常の運用時には気にする必要がありませんが、過去のデータなどで既に無効になったユーザを所有者として設定したいことがあると思います。ですが無効になったユーザは所有者として指定することができません。そのためこういった操作を行うには一時的に有効化にして設定していく必要があります。
f:id:tyoshikawa1106:20170604171744p:plain


検証してみたところApex処理から所有者更新処理を行ってもエラーとなります。
f:id:tyoshikawa1106:20170604172429p:plain
f:id:tyoshikawa1106:20170604173006p:plain:w300


開発者コンソールのクエリエディターでも不可です。
f:id:tyoshikawa1106:20170604172140p:plain
f:id:tyoshikawa1106:20170604172245p:plain


Apexトリガ経由でもエラーとなりました。
f:id:tyoshikawa1106:20170604173150p:plain


ですが無効ユーザを所有者にセットできる特殊なパターンがあります。Apexトリガのafter updateで参照先レコードの所有者を更新する場合です。今回取引先と取引先責任者で確認しました。

更新前の取引先

f:id:tyoshikawa1106:20170604174532p:plain

更新前の取引先責任者

f:id:tyoshikawa1106:20170604174612p:plain


検証用に下記のトリガを用意しました。
f:id:tyoshikawa1106:20170604174710p:plain
※雑につくった書き方です。通常の開発ではマネしないでください。。


これで取引先責任者を更新してApexトリガを動かすと無効ユーザで更新できます。
f:id:tyoshikawa1106:20170604174929p:plain



ということで上記のようなパターンなら無効ユーザでも所有者としてセットすることが可能です。

補足

今回の件ですが、始めに上記パターンで所有者をセットできたことに気づきました。それでApex経由なら無効ユーザでも大丈夫と勘違いしたのですが、それができるのは一部のパターンだけで実際にはApex経由でも所有者としてセットできないみたいです。なので過去データをキレイにする場合は一時的にユーザを有効化して更新してから無効に戻す必要があります。

おまけ

この検証中にもう一つ気づいた仕様があります。無効になったユーザのレコードを引き継ぐため所有者を有効なユーザに変更したときの場合です。取引の所有者を切り替えると取引先責任者の所有者も自動で切り替わりました。無効ユーザの扱いまわりはこういった仕組みが用意されているみたです。

SFDC:ハイパーリンク数式項目の JavaScript の確認の対処方法について

ハイパーリンク数式項目での JavaScript 使用の段階的な廃止されるそうです。

f:id:tyoshikawa1106:20170523005717p:plain

変更の背景

Salesforce は信頼を最大の価値としており、中でも製品のセキュリティは信頼の鍵となる部分です。Salesforce では、ハイパーリンク数式項目における JavaScript の利用によって悪意のあるコードの実装が可能であることを発見し、セキュリティの潜在的脆弱性に繋がると判断したため、今回の変更を決定しました。

Salesforce は、段階的なアプローチによって、ハイパーリンク数式項目での JavaScript の実行をブロックします。なお、対象となる項目は、先頭に「javascript:」の文字列があるカスタムハイパーリンク数式項目と定義されています。

Spring '17 リリースの時点で、システム管理者は、JavaScript を含むハイパーリンク数式項目を作成できなくなっています。JavaScript を削除する場合を除き、JavaScript を含む既存の項目の編集・保存が行えなくなりました。

Summer '17 リリースでは、重要な更新コンソール (CRUC) 設定が導入され、システム管理者はこの設定を有効にすることによってハイパーリンク数式項目での JavaScript の実行ブロックを選択できます。

Winter '18 リリース** では、段階的なアプローチの最終フェーズとして、ハイパーリンク数式項目で JavaScript を実行できなくなります。

現時点では 2017 年 10 月を予定していますが、変更される可能性もあります。

管理者側で対応が必要な作業

重要な更新を有効にする前に、Salesforce 組織の HYPERLINK 関数での JavaScript の使用状況を確認し、代替ソリューションへの移行をご検討ください。代替ソリューションの詳細は、記事「ハイパーリンク数式項目での JavaScript の無効化」を参照してください。


既存の機能でできたことができなくなるので対応が必要ですね。。って思ったりしたのですが、そもそも数式項目のハイパーリンク項目でJavaScriptを書いたりすることは無かった気がします。(やるとすればカスタムボタンかカスタムリンクで対応した方が早そう)


とはいえ実は使っていましたというケースもあるので確認が必要と思いますが、確認方法についてSuccess Communityで情報が共有されていました。
f:id:tyoshikawa1106:20170523010245p:plain

https://success.salesforce.com/0D53A000037FFjS


こんな感じとのことです。
f:id:tyoshikawa1106:20170523010439p:plain

f:id:tyoshikawa1106:20170523010539p:plain


開発者コンソールから処理を実行してSystem.debugに引っかからなければ問題ないみたいです。この検証は本番組織ではなく最新の状態を反映したSandbox環境で実行するのが推奨されているようです。

追記

詳細はヘルプページができていました。

SFDC:Lightning Design SystemのDataTableとrowspan表示

Lightning Design SystemでテーブルCSSを適用したい場合はDataTableのCSSを利用します。また「slds-table--col-bordered」縦線の表示も可能です。ですがrowspan表示を行うと次のように正しく表示してくれません。

f:id:tyoshikawa1106:20170509084749p:plain


この問題は「style="border-collapse: collapse;"」を宣言することで解決します。
f:id:tyoshikawa1106:20170509084932p:plain

f:id:tyoshikawa1106:20170509084955p:plain


ちなみにrowspanを宣言した場合、マウスを当てたときは次のように表示されます。
f:id:tyoshikawa1106:20170509085021p:plain


これが気になる人は「slds-no-row-hover」を宣言することでマウスオーバー時のハイライトを無効にできます。
f:id:tyoshikawa1106:20170509085316p:plain


rowspanとslds-table--col-borderedを組み合わせたときに縦線が正しく表示されず困ったときは「style="border-collapse: collapse;"」で解決できました。

サンプルコード

<apex:page showHeader="true" sidebar="false">
    <apex:slds />
    <div class="slds">
        <table class="slds-table slds-table--bordered slds-table--col-bordered slds-no-row-hover" style="border-collapse: collapse;">
            <tr>
                <th rowspan="3"></th>
                <th>
                    <apex:outputText value="{!$ObjectType.Account.Fields.Name.Label}" />
                </th>
                <th>
                    <apex:outputText value="{!$ObjectType.Account.Fields.AccountNumber.Label}" />
                </th>
                <th>
                    <apex:outputText value="{!$ObjectType.Account.Fields.Website.Label}" />
                </th>
            </tr>
            <tr>
                <td>XXX</td>
                <td>XXX</td>
                <td>XXX</td>
            </tr>
            <tr>
                <td>XXX</td>
                <td>XXX</td>
                <td>XXX</td>
            </tr>
        </table>
    </div>
</apex:page>

SFDC:Classic向けVisualforce開発でLightning Design Systemを適用する方法

Lightning Design SystemはLEX向けの画面開発で活躍すると思いますが、Classic向けのページを開発する際にも利用したくなるケースがあると思います。ですがサイトからダウンロードしたCSSを適用すると次のように標準CSSに干渉してしまいます。

f:id:tyoshikawa1106:20170419232506p:plain

<apex:page showHeader="true" sidebar="false" id="page">
    <!-- Lightning Design System -->
    <apex:stylesheet value="{!URLFOR($Resource.SLDS221, 'assets/styles/salesforce-lightning-design-system.css')}" />
    <!-- App -->
    <div xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="vf-page">
        <div class="slds-page-header">
            <div class="slds-grid">
                <div class="slds-col slds-has-flexi-truncate">
                    <div class="slds-media slds-no-space slds-grow">
                        <div class="slds-media__figure">
                            <svg class="slds-icon slds-icon-standard-user" aria-hidden="true">
                                <use xlink:href="{!URLFOR($Resource.SLDS221, '/assets/icons/standard-sprite/svg/symbols.svg#user')}"></use>
                            </svg>
                        </div>
                        <div class="slds-media__body">
                            <p class="slds-text-title--caps slds-line-height--reset">Record Type</p>
                            <h1 class="slds-page-header__title slds-m-right--small slds-align-middle slds-truncate" title="this should match the Record Title">Record Title</h1>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</apex:page>


この問題は、apex:sldsタグを利用することで解決できそうです。
f:id:tyoshikawa1106:20170419231652p:plain


これで標準CSSに影響を与えずにCSSを適用できました。
f:id:tyoshikawa1106:20170419231727p:plain


apex:sldsタグを使った場合、lightning-design-system-vf.min.jsと「-vf」のついたVF向けCSSが適用されるためです。
f:id:tyoshikawa1106:20170419231930p:plain


Lightning Design Systemのサイトからダウンロードすると-vfのJSファイルは含まれていません。そのため過去のバージョンの古いCSSファイルから引っ張ってくる必要があると思っていました。apex:sldsタグでは比較的最新バージョンの-vf版CSSが適用されるので古いバージョンを使いまわす必要もないようです。

サンプルコード

<apex:page showHeader="true" sidebar="false" id="page">
    <!-- Lightning Design System -->
    <apex:slds />
    <!-- App -->
    <div xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="vf-page">
        <div class="slds-page-header">
            <div class="slds-grid">
                <div class="slds-col slds-has-flexi-truncate">
                    <div class="slds-media slds-no-space slds-grow">
                        <div class="slds-media__figure">
                            <svg class="slds-icon slds-icon-standard-user" aria-hidden="true">
                                <use xlink:href="{!URLFOR($Asset.SLDS, '/assets/icons/standard-sprite/svg/symbols.svg#user')}"></use>
                            </svg>
                        </div>
                        <div class="slds-media__body">
                            <p class="slds-text-title--caps slds-line-height--reset">Record Type</p>
                            <h1 class="slds-page-header__title slds-m-right--small slds-align-middle slds-truncate" title="this should match the Record Title">Record Title</h1>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</apex:page>

SFDC:Files Connectの認証情報設定で注意すべきこと

Files ConnectをつかえばChatterファイルからGoogle Drive APIをつかってファイルを参照できるようになります。


この機能を利用するときに注意するべき点があります。OAuth同意画面のユーザーに表示するサービス名を設定する部分です。
f:id:tyoshikawa1106:20170323010235p:plain


ここに入力した値がSalesforceからGoogleドライブに接続する際の認証画面にタイトルとして表示されます。この値ですが何を入力しても問題ないわけではありません。Googleドライブにアクセスするので「Google Drive」にしようと設定したことがあります。


その結果、Googleから利用規約に違反しているので3日以内に修正対応してください。改善されない場合は対象プロジェクトを停止します。と通知メールを受け取ることになりました。


Googleの製品と誤認させる名称は許可されないようにチェックする仕組みがあるみたいです。(改めて考えてみれば当然の仕組みですが...)


こうした状況になってしまった場合ですが、「異議を申し立て」的なボタンからサポートに連絡することができます。(この辺りの手順と詳細については通知メールに記載があります。)


ボタンの名称が少し怖い感じがしますが利用してもぜんぜん怖いことにはなりませんでした。Google API Developer Consoleのページから利用できるのですが、ページは日本語で記載されているので内容をよく見て判断することができます。


基本的にはどのように修正したかをサポートの方に報告するための機能となっていましたが、修正方法がわからない場合も質問することができるようです。困ったときは放置せずにきちんと問い合わせを行うと丁寧に対応してもらえると思います。


今回は通知メールに記載されたとおり、同意画面の表示内容を修正して「異議を申し立て」ボタン経由でサポートに連絡したところすぐに解決しました。異議という単語でなんとなく悪いことをしている気分になりますがそんなことはないのできちんと対応した方が良さそうです。


利用規約違反の通知を見て慌てて設定を削除して対応しようとすると逆にサポートへの連絡ができなくなってしまうと思います。そうすると利用規約違反の記録が残り続けることになる可能性も考えられます。(確認はしたことありませんが) 設定削除による対応は何も解決しないのでやらない方がいいと思います。


今回はGoogleでしたが他のサービスでも同じようなチェックがあると思いますので、製品名を認証タイトルに指定するのは避けたほうが良さそうです。Files Connectの認証情報設定を行うときはこうしたことにも注意が必要となります。

SFDC:プロセスビルダーのChatter投稿機能でメンション先を動的に設定する方法

プロセスビルダーをつかえばワークフロールールと同じようにレコードの作成と更新時に処理を行うことができます。さらにワークフロールールではサポートしていなかったChatter投稿も行うことが可能です。Chatter投稿では特定のユーザにメンションを付けることも可能となっています。
f:id:tyoshikawa1106:20170323001913p:plain

f:id:tyoshikawa1106:20170323001928p:plain:w300


ですが実際にメンションを行う場合、動的に切り替えたいというケースが多々あると思います。そんなときは次のような書き方がサポートされています。

@[{![Contact].OwnerId}]

f:id:tyoshikawa1106:20170323002110p:plain:w300


こんな感じです。
f:id:tyoshikawa1106:20170323002441p:plain

f:id:tyoshikawa1106:20170323002455p:plain

利用時に注意すること

Name項目ではなくユーザIDを指定することでメンションとして認識される仕組みとなっています。数式のID文字列が認識されるかはちょっと確認してみませんが、おそらくサポートされるのやユーザの参照項目ぐらいだと思います。


所有者などユーザ項目の値にはコミュニティユーザを指定するケースもあると思います。
f:id:tyoshikawa1106:20170323003203p:plain


これで社内組織からレコード更新時に特定のコミュニティユーザにメンション通知できそうですが、実際に投稿された内容を見るとアクセス権限が付与されていないことがわかります。
f:id:tyoshikawa1106:20170323003450p:plain


Chatter投稿先をプロセスビルダーで指定していないためです。
f:id:tyoshikawa1106:20170323003533p:plain


もしかするとどこかで指定できるかもしれませんが、おそらくサポートされていないと思います。


社内ユーザがApexバッチなどで一括処理を行いその結果をコミュニティユーザにChatter経由で通知したい。と思ってもおそらくこの方法では対応できないと思います。(検証はしていませんが社内ユーザがコミュニティ組織に移動して処理を行えばもしかするとうまくいくかもしれません。)


またDEV環境で再現できなかったのですが、ユーザの参照項目をつかって動的にメンション指定する際にそのユーザがレコードのアクセス権限自体をもっていない場合、プロセスビルダーで認識されないと思われます。その結果、メンション指定されているのにユーザIDが存在しないことでシステムエラーが発生します。(再現しなかったのでもしかすると設定中にうっかりミスがあっただけかもしれませんが...) プロセスビルダーのシステムエラーメッセージは原因を確認しずらいので注意が必要です。