tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Salesforce Success Communityのログインページについて

Salesforce Success Communityのログインページといえばこちらのページが用意されています。
f:id:tyoshikawa1106:20170212202915p:plain

Salesforce Success Community


ここからログインすると英語版のSuccess Communityページに移動します。Collaborationを選択しても自分のフィードが表示されるだけなので、日本向けSuccess Communityグループに移動するにはグループを選択しなくてはなりません。
f:id:tyoshikawa1106:20170212203222p:plain


そういうものだと思って利用していたのですが、調べてみたところ、ログイン後にすぐ日本向けSuccess Communityのカスタマーグループへ移動したい人向けに次のページが用意されていました。
f:id:tyoshikawa1106:20170212203450p:plain

Success - カスタマーサクセス 日本


こちらただの紹介ページではなくログインすると日本のグループに移動するようになっています。
f:id:tyoshikawa1106:20170212203640p:plain


ログイン後に英語のサクセスコミュニティが表示されるのは嫌だという方はこちらのページをブックマークしておくとログインしてすぐ日本のグループに移動できて便利そうです。

※ログインはJoin the Conversationボタンから行って下さい。

SFDC:LockerService有効化に伴うHeadマークアップのセキュリティ向上とtitleタグについて

LockerServiceが有効になっている場合にページの head マークアップで使用できるタグ、属性、値が制限されるようになります。
f:id:tyoshikawa1106:20170212202017p:plain

ページのHeadマークアップのセキュリティの向上


LockerService が有効になると、無効なタグ、属性、値を使用している head は無効になるのですが、その中でよく使われていそうなタグとしてtitleタグがあります。"許可される属性はありません。"と記載がありますのでtitleタグは利用できなくなると思います。


LockerServiceですがSummer'17で有効化されるようになっているのでそれまでに対応しておいた方がいいみたいです。

SFDC:Chatterのフォロー上限数について

Chatterのフォロー機能ですが最大500件までと上限が決まっています。この上限を超えるとフォローの際に「すでに最大数のレコードを登録しています。別のレコードの登録を解除してからもう一度お試しください。」とエラーメッセージが表示されるみたいです。この上限はSalesforce の制限クイックリファレンスガイドで確認できました。
f:id:tyoshikawa1106:20170205175131p:plain

Salesforce の制限クイックリファレンスガイド


自分がフォローしているレコード数ですがプロファイルページで確認できます。
f:id:tyoshikawa1106:20170205175647p:plain


すべて表示のリンクをクリックするとフォロー一覧が表示されますが、その際にオブジェクト毎にグループ分けして表示できます。
f:id:tyoshikawa1106:20170205175840p:plain:w300


この機能をつかってフォローを解除していくことが可能です。ちなみに380件程あったフォローを1つずつ解除していって30件ほどになるように対応してみたのですがだいたい20分ぐらいで対応できました。


レコードのフォローですが、私の設定にある「作成したレコードを自動的にフォローする」にチェックがついていると自動でフォローされる仕組みとなっています。便利なオプションですが上限が決まっているので状況に合わせて利用するのが良さそうです。
f:id:tyoshikawa1106:20170205180027p:plain


フォローの一括解除機能は標準では用意されていなさそうですが、Smart Follow Listという便利そうな製品があるみたいです。
f:id:tyoshikawa1106:20170205180351p:plain

フォロー件数の上限に達した! | Salesforceサービス | NCD


実際に試してはいないのですがAppExchangeで公開されていました。
f:id:tyoshikawa1106:20170205180519p:plain

フォロー一括解除ツール Smart Follow List


フォロー上限の制約ですがIdeasで緩和の要望が上がっていました。
f:id:tyoshikawa1106:20170205180730p:plain

Raise the Chatter follower limit-Chatterのフォロー上限の緩和


コメントに記載がありましたがもうひとつのページでも要望が上がっていてそちらが本体みたいです。
f:id:tyoshikawa1106:20170205180838p:plain

Increase number of Chatter Objects one can Follow - Ideas - Salesforce Success Community


緩和して欲しい人はこちらの投票に参加すると良さそうです。ただ500件以上フォローできたとしても全件が活発に更新された場合、ちょっと追いきれないような気もします。


Chatterのフォロー上限数についてはこんな感じのルールとなっていました。

SFDC:Chatterメッセージのアクセス権限管理と削除の方法

Chatterメッセージのアクセス権限管理と削除の方法についてです。
f:id:tyoshikawa1106:20170201210746p:plain


他のユーザのメッセージは通常アクセスできませんが、「Chatter メッセージの管理」権限を追加すると確認できるようになります。「Chatter メッセージの管理」権限はシステム管理者プロファイルでも付与されていません。基本的には権限セットをつかって付与することになります。
f:id:tyoshikawa1106:20170201211001p:plain


このあたりについてはヘルプページにまとめられています。

ユーザの Chatter メッセージの定義に関するガイドライン


メッセージのアクセス権限付与は上記のとおりです。続いて削除についてです。メッセージはSOAP APIでのみ削除することができます。そのためデータローダをつかって削除できるみたいです。英語ですが下記ページにまとめられています。

f:id:tyoshikawa1106:20170201210615p:plain

How do I delete my chatter private messages? - Answers - Salesforce Success Community


最後にChatterメッセージですがSpring'17でサポートが終了されるみたいです。オブジェクトが無くなったりはしないみたいなのでしばらくはそのまま利用できると思いますが次の連絡手段を用意しておいた方がよさそうです。

Chatter Messenger: Spring '17 で廃止

SFDC:Visualforce × 郵便番号検索を試してみました

Visualforce × 郵便番号検索を試してみました。
f:id:tyoshikawa1106:20170129234843p:plain


デモ動画


この郵便番号ですが、「プロが教えるレスポンシブWebデザイン 現場のメソッド レイアウト・UIのマルチデバイス対応手法」という本で紹介されていたサンプルの1つをVisualforce用にカスタマイズしたものです。


jQueryとYubinBangoというライブラリを利用して作られています。


短時間で検索でき、対象によっては建物名と階数まで取得できました。郵便番号検索はいろいろな場面で役立つ機能だと思います。

サンプルコード

追記

住所項目が複数あるときのバージョンです。

<apex:page showHeader="true" sidebar="true">
    <apex:slds rendered="true" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script src="https://ajaxzip3.github.io/ajaxzip3.js" charset="UTF-8"></script>
    <style>
        .postal-code-input {
            width: 200px !important;
        }
    </style>
    <div class="slds">
        <div class="slds-m-bottom--large">
            <div >
                <section class="slds-box slds-m-around--small">
                    <div>
                        <form id="vf-form">
                            <div>
                                <label>Postal code</label>
                                <div>
                                    <input type="text" class="slds-input postal-code-input focus zip" name="zip" placeholder="1007012" />
                                </div>
                                <label>State</label>
                                <div>
                                    <input type="text" class="slds-input focus state" name="state" />
                                </div>
                                <label>City</label>
                                <div>
                                    <input type="text" class="slds-input focus city" name="city" />
                                </div>
                                <label>Street</label>
                                <div>
                                    <input type="text" class="slds-input focus street" name="street" />
                                </div>
                            </div>
                        </form>
                    </div>
                </section>
            </div>
        </div>
    </div>
    <script>
        $(function () {
            //ajaxzip3の設定
            $('body').on('keyup','#vf-form .zip',function() {
                AjaxZip3.zip2addr('zip','','state','city','street');
            });   
        });
    </script>
</apex:page>

SFDC:Spring'17の選択リスト型項目とAPI参照名

Spring'17から選択リスト項目にAPI名という仕組みが追加されました。
f:id:tyoshikawa1106:20170129190502p:plain


一意のAPI名を設定することでリスト値の表示を変更してもApex側に影響がでないようにするための仕組みだと思います。次のようにリスト項目にAPI名をセットしてINSERTすれば登録処理を実行できます。
f:id:tyoshikawa1106:20170129190641p:plain


ボタンをクリックしてINSERTを実行すると・・・
f:id:tyoshikawa1106:20170129191219p:plain


選択リスト項目にAPI名に紐付くラベルが登録されます。
f:id:tyoshikawa1106:20170129191317p:plain


もしAPI名ではなくラベルをセットしてINSERTすると・・・
f:id:tyoshikawa1106:20170129191437p:plain


下記のエラーとなります。
f:id:tyoshikawa1106:20170129191529p:plain

Insert failed. First exception on row 0; first error: INVALID_OR_NULL_FOR_RESTRICTED_PICKLIST, ~ : 制限つき選択リスト項目の値が不適切


このエラーの回避方法として「値セットで定義された値に選択リストを制限します。」のチェックをはずすとラベル値の指定でも登録できました。
f:id:tyoshikawa1106:20170129191712p:plain

f:id:tyoshikawa1106:20170129191748p:plain


選択リストのAPI名ですがユーザが自由に変更できないように設定することも可能みたいです。
f:id:tyoshikawa1106:20170129191837p:plain


Spring'17は2017年2月にリリースされます。現在のWinter'17では利用できない機能です。Spring'17になっているSandbox側で対応してWinter'17にリリースしてしまうとエラーになってしまうと思います。またバージョンアップ時に既存機能に影響が出やすい場所だと思いますので注意してチェックしておいた方が良さそうです。もしこの機能周りでトラブルに遭遇したら「値セットで定義された値に選択リストを制限します。」のチェックを外して応急処置できると思います。

追記

API参照名ですがデフォルトで日本語がセットされると思います。これは一時的にセットされるもので本格的に利用する場合は英数字で指定して利用する仕様となっています。導入時には必ず英数字に指定してから利用を開始しましょう。
f:id:tyoshikawa1106:20170129201034p:plain

サンプルコード

検証用のサンプルコードです。APIバージョンは39.0で利用できます。

<apex:page controller="SampleVFController" showHeader="true" sidebar="false">
    <apex:slds rendered="true" />
    <div class="slds">
        <div class="slds-m-around--small">
            <apex:form id="form">
                <apex:commandButton value="よい" styleClass="slds-button slds-button--brand" action="{!doSaveType1}" reRender="form" />
                &nbsp;
                <apex:commandButton value="ふつう" styleClass="slds-button slds-button--brand" action="{!doSaveType2}" reRender="form" />
                &nbsp;
                <apex:commandButton value="わるい" styleClass="slds-button slds-button--brand" action="{!doSaveType3}" reRender="form" />
            </apex:form>
        </div>
    </div>
</apex:page>
public with sharing class SampleVFController {

    public Sample__c sample {get; set;}

    /**
     * コンストラクタ
     */
    public SampleVFController() {
        this.sample = new Sample__c();
    }

    /**
     * 保存処理①
     */
    public PageReference doSaveType1() {
        this.sample.SampleList__c = 'よい';
        insert sample;
        return new PageReference('/' + this.sample.Id);
    }

    /**
     * 保存処理②
     */
    public PageReference doSaveType2() {
        this.sample.SampleList__c = 'Normal';
        insert sample;
        return new PageReference('/' + this.sample.Id);
    }

    /**
     * 保存処理③
     */
    public PageReference doSaveType3() {
        this.sample.SampleList__c = 'Bad';
        insert sample;
        return new PageReference('/' + this.sample.Id);
    }
}