Quantcast
Channel: tyoshikawa1106のブログ
Viewing all 1439 articles
Browse latest View live

SFDC:LEXでつかえるグループの活動情報表示

$
0
0

Lightning ExperienceではChatterグループのページにエンゲージメントタブが用意されています。こちらの機能をつかってグループの活動情報を表示できます。
f:id:tyoshikawa1106:20170219204428p:plain

リリースノート


f:id:tyoshikawa1106:20170219204507p:plain


投稿数や質問数、未回答のままの質問の件数まで確認することができます。
f:id:tyoshikawa1106:20170219204558p:plain


グループのページで確認できるので便利な機能だと思います。


SFDC:AppBuilderでChatterグループページのカスタマイズ

$
0
0

Spring'17からLightning ExperienceにChatterグループのカスタマイズ機能が追加されました。
f:id:tyoshikawa1106:20170219205934p:plain

リリースノート


f:id:tyoshikawa1106:20170219210025p:plain


他のページと同じようにLightning App Builderをつかってカスタマイズできます。Lightningコンポーネントを用意すれば自由に機能拡張を行えそうです。
f:id:tyoshikawa1106:20170219210309p:plain

SFDC:Lightning Design SystemのProgress Indicatorを試してみました

$
0
0

Lightning Design SystemのProgress Indicatorを試してみました。普段画像などを用意して実装するプログレスバーをCSSとSVGで表現することができます。
f:id:tyoshikawa1106:20170226220955p:plain


バージョン2.1では正しく動作しなかったので現時点で最新の2.2.1で試してみました。
f:id:tyoshikawa1106:20170226212341p:plain

実装時の注意点

Lightning Design SystemのサイトにあるサンプルコードをVisualforceページで動かすと一つ目のマーカーの左側にスペースができてしまいます。
f:id:tyoshikawa1106:20170226213437p:plain


これはCSSでマージンを変更することで解決します。
f:id:tyoshikawa1106:20170226213631p:plain

f:id:tyoshikawa1106:20170226213818p:plain:w300

ol li {
    margin-left: 0;
}

※実際には他のCSSに干渉しないようにクラスやID指定を組み合わせます。


Progress Indicatorで各マーカーの下にラベルを表示したいときがあると思います。その場合はslds-is-relativeをつかって対応可能です。
f:id:tyoshikawa1106:20170226215216p:plain

f:id:tyoshikawa1106:20170226215340p:plain



モバイルレイアウトでも対応してくれる便利なCSSコンポーネントでした。

サンプルコード

SFDC:Spring'17 - ApexテストのモックフレームワークStub APIを試してみました

$
0
0

Spring'17で正式リリースされたStub APIを試してみました。Apexテストで例外テストができる仕組みを用意できたりするみたいです。

f:id:tyoshikawa1106:20170228224932p:plain

Apex スタブ API を正式リリース


リリースノートだけではイマイチ使い方がわかりませんでしたが、Apex開発者ガイドでサンプルコードが紹介されていました。
f:id:tyoshikawa1106:20170228225143p:plain

Build a Mocking Framework with the Stub API

使い方概要

まずテスト対象のクラスとして下記処理を用意します。

public class DateFormatter {    
    // Method to test    
    public String getFormattedDate(DateHelper helper) {
        return 'Today\'s date is ' + helper.getTodaysDate();
    }
}


次のヘルパークラスに処理部分をもたせます。

public class DateHelper {   
    // Method to stub    
    public String getTodaysDate() {
        return Date.today().format();
    }
}


上記処理は以下のような書き方で呼び出すことができます。

DateFormatter df = new DateFormatter();
DateHelper dh = new DateHelper();
String dateStr = df.getFormattedDate(dh);


このように独立させた処理をスタブAPIをつかって効率よくテストできるみたいです。

試験のために、私たちは隔離したいです getFormattedDate()この方法は、フォーマットが正常に動作していることを確認します。の戻り値getTodaysDate()この方法は、通常、日によって異なります。ただし、この場合には、我々は、フォーマットに私達のテストを分離するために一定の、予測可能な値を返すようにしたいです。むしろこの方法が一定の値を返すクラスの「偽」のバージョンを書くよりも、私たちは、クラスのスタブバージョンを作成します。スタブオブジェクトは、実行時に動的に作成され、私たちはその方法の「スタブ」動作を指定することができます。

Apexクラスのスタブバージョンを使用するには:

  • 実装することで、スタブクラスの動作を定義します System.StubProvider インタフェース。
  • 使用してスタブオブジェクトをインスタンス化します System.Test.createStub() 方法。
  • テストクラス内からスタブオブジェクトの関連するメソッドを呼び出します。


StubProviderインターフェイスの実装します。implements System.StubProvider と宣言したテストクラスになります。

@isTest
public class MockProvider implements System.StubProvider {
    
    public Object handleMethodCall(Object stubbedObject, String stubbedMethodName, 
        Type returnType, List<Type> listOfParamTypes, List<String> listOfParamNames, 
        List<Object> listOfArgs) {
        
        // The following debug statements show an example of logging 
        // the invocation of a mocked method.
       
        // You can use the method name and return type to determine which method was called.
        System.debug('Name of stubbed method: ' + stubbedMethodName);
        System.debug('Return type of stubbed method: ' + returnType.getName());
        
        // You can also use the parameter names and types to determine which method 
        // was called.
        for (integer i =0; i < listOfParamNames.size(); i++) {
            System.debug('parameter name: ' + listOfParamNames.get(i));
            System.debug('  parameter type: ' + listOfParamTypes.get(i).getName());
        }
        
        // This shows the actual parameter values passed into the stubbed method at runtime.
        System.debug('number of parameters passed into the mocked call: ' + 
            listOfArgs.size());
        System.debug('parameter(s) sent into the mocked call: ' + listOfArgs);
        
        // This is a very simple mock provider that returns a hard-coded value 
        // based on the return type of the invoked.
        if (returnType.getName() == 'String')
            return '8/8/2016';
        else 
            return null;
    }
}


クラスのスタブバージョンをインスタンス化します。

public class MockUtil {
    private MockUtil(){}

    public static MockProvider getInstance() {
        return new MockProvider();
    }
    
     public static Object createMock(Type typeToMock) {
        // Invoke the stub API and pass it our mock provider to create a 
        // mock class of typeToMock.
        return Test.createStub(typeToMock, MockUtil.getInstance());
    }
}


これでテストクラスからスタブAPIを利用する準備ができました。次のようなテストの書き方ができます。

@isTest 
public class DateFormatterTest {   
    @isTest 
    public static void testGetFormattedDate() {
        // Create a mock version of the DateHelper class.
        DateHelper mockDH = (DateHelper)MockUtil.createMock(DateHelper.class);
        DateFormatter df = new DateFormatter();
        
        // Use the mocked object in the test.
        System.assertEquals('Today\'s date is 8/8/2016', df.getFormattedDate(mockDH));
    }
}


無事開発者ガイドのサンプルコードのテストを実行することができました。
f:id:tyoshikawa1106:20170228230941p:plain


開発者ガイドのサンプルでは任意のシステム日付をセットしてテスト実行できることを確認できます。DateHelperクラスの処理でDate.todayでシステム日付を取得しています。MockProviderクラスの30行目でテストデータ用に任意の値で疑似システム日付を準備していました。DateFormatterTestクラスの12行目でスタブAPIをつかって用意した疑似システム日付がただしく利用できていることをassert処理で確認しています。


StubProviderインターフェイスの実装は少しややこしそうですが、疑似システム日付を用意できるのはすごく便利そうです。また、疑似Exceptionなども実装することができればテストがやりやすくなると思います。

SFDC:Spring'17 - 新しい一括処理ジョブページ

$
0
0

Spring'17 へのアップデートで新しい一括処理ジョブページが利用できるようになりました。

f:id:tyoshikawa1106:20170228215218p:plain

Apex 一括処理ジョブの状況監視


設定のApexジョブのページに行くとリンクが追加されています。
f:id:tyoshikawa1106:20170228215406p:plain


こちらが新しいジョブページです。
f:id:tyoshikawa1106:20170228215505p:plain


特定の一括処理クラスで [詳細情報] をクリックすると、次の情報を含む一括処理クラスの親ジョブが表示されるそうです。

  • 状況
  • 実行日と完了日
  • 各一括処理の経過時間
  • 一括処理された数
  • 一括処理に失敗した数


実行時に表示された内容です。
f:id:tyoshikawa1106:20170228215710p:plain


詳細リンクをクリックしたときの内容はこんな感じでした。
f:id:tyoshikawa1106:20170228215757p:plain


新しいジョブページはClassicとExperienceの両方で利用可能とのことです。

SFDC:Salesforceの災害対策について

$
0
0

Salesforceは日本用のインスタンスでAP0が用意されています。災害発生などで長期間利用できない状態になった時にどのように対応されるかについてサクセスコミュニティで紹介されていました。

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

 

災害対策用の専用AP0インスタンスが別に用意されていてリアルタイムで同期を取っているそうです。

SFDC:Salesforceの災害対策について

$
0
0

Salesforceは日本用のインスタンスでAP0が用意されています。災害発生などで長期間利用できない状態になった時にどのように対応されるかについてサクセスコミュニティで紹介されていました。災害対策用の専用AP0インスタンスが別に用意されていてリアルタイムで同期を取っているそうです。

Success Community


こういった情報の詳細は下記にまとめられているとのことでした。

Security

保護

f:id:tyoshikawa1106:20170304142048p:plain

SFDC:LightningMessageのインストールを試してみました - Part 1

$
0
0

Lightning Experienceへの移行をする際にChatterメッセージが使えなくなるのが地味に障壁となっていました。Lightning ComponentでつくってあるChatterメッセージアプリがあれば解決するんだけどなと考えていたらそういうアプリを作ってくれている人が居たのを思い出しました。


README.mdにインストール方法も記載されています。
f:id:tyoshikawa1106:20170305184423p:plain

インストール手順

まずはgit cloneコマンドでソースコード一式をダウンロードします。
f:id:tyoshikawa1106:20170305184701p:plain


build-sample.propertiesをコピーしてbuild.propertiesを作成します。
f:id:tyoshikawa1106:20170305185135p:plain


DE組織あたりでパッケージを作成します。(たぶん。。)
f:id:tyoshikawa1106:20170305185206p:plain


lm.namespaceに作成したパッケージ名を入力。ユーザ名とパスワードにDE組織のログイン情報を入力します。
f:id:tyoshikawa1106:20170305185329p:plain


デプロイはantを利用します。Force.com移行ツールの出番です。


build.xmlは用意されています。後はコマンドを実行するだけです。
f:id:tyoshikawa1106:20170305185616p:plain

ant -Dpackage.xml=package.xml -f build.xml deploy


こんな感じ。
f:id:tyoshikawa1106:20170305185820p:plain


よくみるとエラーとなっていました。

Error: No COMPONENT named markup://LightningMessage:LightningMessageCmp found : [markup://c:LightningMessage]


やり方がよくなかったみたいです。ソースコードは取得できているので今回はgulp-jsforce-deployを使う方法で対応します。


git cloneしてソースコード一式取得した後にpkgフォルダにLightning Messageアプリのコードを格納します。
f:id:tyoshikawa1106:20170305191901p:plain


Set upに記載されているコマンドを実行して準備します。


デプロイコマンドはこんな感じ。

$ SF_USERNAME=username@example.com SF_PASSWORD=yourpassword gulp deploy


次のようなエラーがでたらnpm installでインストールすれば解決します。

Error: Cannot find module 'through2'


あとは次のエラーがでるかもしれません。

メインマークアップは空にできません。Lightning 定義バンドルを削除する場合は、代わりにバンドルを直接削除してください。


ソースコードで __namespace__と記述されている箇所があるのでc:とか除外とかすれば解決します。(antのときのエラーはこれが原因かな)
f:id:tyoshikawa1106:20170305192739p:plain



これでデプロイを実施できました。
f:id:tyoshikawa1106:20170305192847p:plain


試しにアプリケーションを開いてみると
f:id:tyoshikawa1106:20170305193721p:plain


どこか設定不足かもしれませんがエラーが。Lightning Componentの仕様は頻繁に変更されているのでそれが原因かもしれません。


antとかよくわからないまま試してみたのでどこか手順ミスがあったかもしれません。またエラーメッセージもちゃんと調べれば解決するかもしれないです。今回はそこまでやる予定はないのでここまで。Force.com移行ツールやgulp-jsforce-deployの使い方を久しぶりに思い出せて良かったです。

追記

antをつかったインストールの正しい手順を確認できたので追記しました。


SFDC:LightningMessageのインストールを試してみました - Part 2

$
0
0

Part 1の続きです。


前回失敗してみてnamespaceの部分は管理パッケージの名前プレフィックスを付けるべきだったんじゃないかと気づきました。(当時Lightning Componentを開発するには名前プレフィックスが必須でした...)
f:id:tyoshikawa1106:20170305195034p:plain


ということでgit clone→build.propertiesファイル作成→パッケージ用名前プレフィックスを指定と対応します。
f:id:tyoshikawa1106:20170305200844p:plain


準備ができたらデプロイコマンドを実行します。

$ ant -Dpackage.xml=package.xml -f build.xml deploy


今回はあっさり成功しました。
f:id:tyoshikawa1106:20170305201048p:plain


開発者コンソールからソースコードを確認できます。
f:id:tyoshikawa1106:20170305201140p:plain


私のドメインの有効化は必須です。未対応の場合はエラーとなります。
f:id:tyoshikawa1106:20170305201227p:plain


アプリにアクセスするとエラーメッセージが表示されました。
f:id:tyoshikawa1106:20170305201256p:plain


ですがインストール手順は正しくできていると思いますので、ソースコードを現在の仕様に合わせて修正するだけで使えるようになるんじゃないかと思います。やり方がわかればすごくシンプルなインストール手順でした。

SFDC:Community Cloud開発向け - Apex TriggerとConnect APIで試行錯誤した話

$
0
0

Community Cloudで顧客とChatterでやりとりする際に相手の投稿が通知されない問題に遭遇することがあると思います。例えば自分のユーザプロファイルに直接投稿してもらったり、メンションを指定してくれれば通知メールは届きますが、B2Cの顧客にそんなことをお願いするのは難しいと思います。


そこでApexトリガで対応するのはどうかと下記のトリガ処理をつくってみました。(サンプル処理なので本番向けではありません。)

trigger FeedItemTrigger on FeedItem (after insert) {

    private FeedItemTriggerHandler handler = new FeedItemTriggerHandler();

    if (Trigger.isAfter) {
        if (Trigger.isInsert) {
            // コミュニティユーザがサポートフィードに投稿したことを担当者に通知
            handler.notificationCustomerChatterPost(Trigger.new);
        }
    }
}
public with sharing class FeedItemTriggerHandler {

    /**
     * コンストラクタ
     */
    public FeedItemTriggerHandler() {
        
    }

    /**
     * コミュニティユーザがサポートフィードに投稿したことを担当者に通知
     */
    public void notificationCustomerChatterPost(List<FeedItem> feedItems) {
        // サポートフィードへの投稿を通知対象として取得
        List<FeedItem> targetFeedItems = new List<FeedItem>();
        for (FeedItem f : feedItems) {
            // オブジェクト判定
            if (String.isNotEmpty(f.ParentId) && f.ParentId.getSObjectType().getDescribe().getName() == 'Support__c') {
                targetFeedItems.add(f);
            }
        }
        // Chatterに投稿
        for (FeedItem f : targetFeedItems) {
            // new connect api
            ConnectApi.MentionSegmentInput mentionSegmentInput = new ConnectApi.MentionSegmentInput();    
            ConnectApi.FeedItemInput feedItemInput = new ConnectApi.FeedItemInput();
            ConnectApi.MessageBodyInput messageBodyInput = new ConnectApi.MessageBodyInput();
            ConnectApi.TextSegmentInput textSegmentInput = new ConnectApi.TextSegmentInput();
            ConnectApi.FeedElementCapabilitiesInput feedElementCapabilitiesInput = new ConnectApi.FeedElementCapabilitiesInput();
            // new List
            messageBodyInput.messageSegments = new List<ConnectApi.MessageSegmentInput>();
            // Post Message
            String post = '【システム通知】新しいメッセージが投稿されました。';
            // textSegment set
            textSegmentInput.text = post;
            messageBodyInput.messageSegments.add(textSegmentInput);
            
            // feedItem set
            feedItemInput.body = messageBodyInput;
            feedItemInput.feedElementType = ConnectApi.FeedElementType.FeedItem;

            // Use a group ID for the subject ID.
            feedItemInput.subjectId = '<TARGET_USER_ID>';

            // capabilities
            feedElementCapabilitiesInput.link = new ConnectApi.LinkCapabilityInput();
            feedElementCapabilitiesInput.link.url = 'https://<YOUR_DOMAIN>.salesforce.com/' + f.parentId;
            feedElementCapabilitiesInput.link.urlName = 'メッセージリンク';
            feedItemInput.capabilities = feedElementCapabilitiesInput;

            // Mention a group.
            mentionSegmentInput.id = 'TARGET_USER_ID';
            messageBodyInput.messageSegments.add(mentionSegmentInput);

            // Chatter Post
            ConnectApi.FeedElement feedElement = ConnectApi.ChatterFeeds.postFeedElement(Network.getNetworkId(), feedItemInput);
        }
    }
}

顧客がコミュニティから投稿すると・・・
f:id:tyoshikawa1106:20170305212000p:plain


Apexトリガの処理が実行され、所有者ユーザのプロファイルにメンション付きで通知投稿が行われます。それにより次のようなメール通知が届きます。
f:id:tyoshikawa1106:20170305212147p:plain


Salesforceにログインしてメール内のリンクをクリックすると対象の投稿ページに移動できます。
f:id:tyoshikawa1106:20170305212306p:plain


これで顧客の投稿時に通知メールを送信できるのではと考えました。

やってみてわかったこと

1. FeedItemトリガだけではコメント投稿時に処理が実行されない。

FeedItemオブジェクトはChatterの投稿用オブジェクトなのでコメント投稿時には実行されません。コメント投稿時には標準の通知機能が働くので大きな問題ではないですが、正しくやるにはコメントオブジェクトにもトリガを用意した方が安全かもしれません。

2. 社内用Chatterページにはコミュニティ側の投稿は表示されない

コミュニティ内で社内ユーザにメンション付きで投稿しても社内ユーザのプロファイルページには表示されませんでした。ここも大きな問題にはならないと思いますが地味に落とし穴です。
f:id:tyoshikawa1106:20170305212746p:plain

3. 社内のChatterグループはコミュニティ側ではアクセスできない。

例えばコミュニティユーザの連絡通知投稿をひとつにまとめるためにChatterグループを用意しても、コミュニティ側ではアクセスできません。コミュニティ側でChatterグループを作成すればアクセスは可能ですが、コミュニティに移動しないと見れませんし本来の用途としてはあまり意味のないものになってしまいました。
f:id:tyoshikawa1106:20170305213054j:plain

4. Community Login UserライセンスでもConnect APIは利用可能

そもそもライセンス的に実装可能なのか不安だったのですが、これは問題ありませんでした。APIの利用を許可の設定はプロファイルで指定できます。Community Login Userライセンスが問題なければ他のライセンスでもほぼ問題ないはずです。ただしConnect APIには利用時の制約があるので注意して下さい。

Salesforce Developers

5. 通知のための処理にApexトリガは向いていない..と思う

最終的に通知メールを送信するためにApexトリガを使うのは向いていないと思います。投稿時にトリガで通知用の別投稿を行うということがそもそも効率的ではないと思います。投稿機能自体を自作してしまい、投稿時にかならずメンションを付ける処理にした方が、投稿/コメント関係なく通知メールが届きますし、通知メールから直接返信も可能になります。


このトリガをつかった方法で一番の障壁は顧客のプロフィールページにApexトリガから投稿した内容が表示されてしまうことです。
f:id:tyoshikawa1106:20170305214802p:plain


これも致命的な問題では無いと思うのですがあまり綺麗ではないと思います。


こんな感じでいろいろ試行錯誤してみたのですが、ApexトリガでConnectAPIをつかって通知するのはイマイチな方法だと感じました。投稿機能が自作する方が綺麗なシステムになると思います。

Connect API (Chatter in Apex) のサンプル (Spring'16バージョン)

少し前のバージョン用ですがまだ利用できると思います。

Demo Video1

Demo Video2

Demo Video3

SFDC:作成済みのレポート一覧を表示するレポートの作り方

$
0
0

作成済みのレポートを抽出するレポートを作成。...できないと思っていましたができました。標準のレポートタイプでも作成できますが、カスタムレポートタイプをつくるとより多くの項目を利用することができます。
f:id:tyoshikawa1106:20170305222145p:plain


フォルダやレポートタイプの他にカスタムオブジェクトも表示できるみたいです。
f:id:tyoshikawa1106:20170305222300p:plain


カスタムオブジェクトを削除するときに削除対象オブジェクト用のレポートを一覧表示して確認するといったことができるかもしれません。

SFDC:Chatterをつかって社内にレポートのリンクを共有する方法

$
0
0

Chatterをつかって社内にレポートリンクを共有する方法についてです。Chatterでは特定の内容毎にグループを作成して情報共有や議論を行うことができます。そういったときにレポートを共有してどのような状況かを報告したりできると便利です。
f:id:tyoshikawa1106:20170308014048p:plain


レポートページのURLをコピーしてChatterに投稿するのもいいですがより簡単に投稿する仕組みが用意されています。フィード追跡を有効化する方法です。設定から有効化できますがレポートオブジェクトに対しても有効化できるようになっています。
f:id:tyoshikawa1106:20170308014550p:plain


レポートのフィード追跡を有効化するとレポートページにコラボレーションボタンが表示されます。これをクリックするとChatterの投稿フォームが表示されます。
f:id:tyoshikawa1106:20170308014953p:plain


あとは通常通り共有したい人またはグループにメンションをつけて投稿するだけです。
f:id:tyoshikawa1106:20170308015134p:plain:w300


こんな感じにレポートのChatterフィードでやりとりができます。
f:id:tyoshikawa1106:20170308015256p:plain


他のユーザはメンション時に指定したChatterグループのページで投稿を確認できます。投稿の一番上にレポート名のリンクが表示されるのでこれをクリックするだけでレポートページに移動できます。
f:id:tyoshikawa1106:20170308015507p:plain


最近追加された新機能というわけではないのでSalesforce Classicでも利用利用可能な機能です。
f:id:tyoshikawa1106:20170308015659p:plain:w300

f:id:tyoshikawa1106:20170308015642p:plain



定期的に利用するレポートなどはレポートフィードで情報交換すると過去に行われたやりとりが記録として残り一元管理されるので便利だと思います。

SFDC:Files ConnectでChatterとGoogleドライブの連携 - 2017年バージョン

$
0
0

File Connectの機能を利用すればChatterファイルとGoogleドライブの連携ができるようになります。


最近設定しようとしたところ、Googleドライブの設定画面が新しくなっていたりしたので2017年版ということで確認してみました。


まずは、設定のFiles Connectで有効化を行います。
f:id:tyoshikawa1106:20170319161238p:plain


続いて権限セットを作成します。これで個別に権限を付与できるようになります。
f:id:tyoshikawa1106:20170319161530p:plain


システム権限にFile Connectが用意されています。
f:id:tyoshikawa1106:20170319161628p:plain


権限セット作成後は対象ユーザに割り当てます。


次はGoogle側の設定です。下記URLのページに移動します。
https://console.developers.google.com/project

f:id:tyoshikawa1106:20170319161851p:plain


プロジェクト作成ボタンを押すとプロジェクト名入力画面が表示されます。画面に従いプロジェクトを作成するとAPIを選択できるページに移動できますので、Google Driveと検索します。Google Drive APIというのがあると思いますので、それを選択します。
f:id:tyoshikawa1106:20170319162135p:plain


選択後、画面上側に有効にするボタンがあるのでクリックしてください。
f:id:tyoshikawa1106:20170319162230p:plain

f:id:tyoshikawa1106:20170319162256p:plain



画面の右上に認証設定ボタンが用意されています。
f:id:tyoshikawa1106:20170319162332p:plain


入力はこんな感じでいいと思います。
f:id:tyoshikawa1106:20170319162443p:plain


認証設定でURLを聞かれますがこれは後で設定します。ひとまずは下記を入力すればいいみたいです。
f:id:tyoshikawa1106:20170319162644p:plain


画面に従い操作を続けるとクライアントIDが発行されます。
f:id:tyoshikawa1106:20170319162932p:plain


クライアントIDが発行されたらSalesforce側に戻り認証プロバイダの設定を行います。
f:id:tyoshikawa1106:20170319163515p:plain


ここの入力内容は下記ヘルプに詳しく記載があります。


設定が終わるとコールバック URLが生成されるのでGoogle API設定のページに戻って差し替えます。
f:id:tyoshikawa1106:20170319164424p:plain


Salesofrceの外部データソースの設定にアクセスします。
f:id:tyoshikawa1106:20170319164804p:plain


つぎのように入力します。
f:id:tyoshikawa1106:20170319164934p:plain


設定を進めるとGoogleの認証ページが表示されたりします。外部データソースの作成が終わったら検証して同期をクリックします。
f:id:tyoshikawa1106:20170319165054p:plain


チェックをつけて同期ボタンをクリックすると外部オブジェクトが作成されます。
f:id:tyoshikawa1106:20170319165133p:plain


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


続いて各ユーザが認証作業を行います。私の設定の外部システムの認証設定から行います。→これは管理者ではなく各ユーザが自分で行います。
f:id:tyoshikawa1106:20170319165644p:plain

f:id:tyoshikawa1106:20170319165611p:plain


ここまでできたら設定中に作成した外部オブジェクト用のカスタムタグをつくってビューなどからデータを参照してみてください。アクセス権がないと表示されると思います。
f:id:tyoshikawa1106:20170319171851p:plain


プロファイルから外部データソースの利用権限を付与できます。
f:id:tyoshikawa1106:20170319172053p:plain

※追記:プロファイルよりも権限セットで付与した方が管理が楽になりました。

外部オブジェクトは開発中になっていないか確認し、なっている場合はリリース済みに変更してください。
f:id:tyoshikawa1106:20170319171952p:plain


これで設定完了です。Chatterタブに移動してファイルページを開いて下さい。Googleドライブのファイルにアクセスできるようになっています。
f:id:tyoshikawa1106:20170319172248p:plain


最後に設定中にホームタブが非表示になってしまった場合は、下記リンク先の手順で修正できると思います。

SFDC:LEXでFiles Connectのファイルにアクセスする方法

$
0
0

Files Connectの機能を使えばChatterファイルからGoogleドライブのファイルにアクセスできるようになります。
f:id:tyoshikawa1106:20170319172248p:plain


Salesforce ClassicではChatterタブから見れるのですがLightning Exprienceでは表示されませんでした。
f:id:tyoshikawa1106:20170320115251p:plain


ファイル関連リストに移動してもダメそうです。
f:id:tyoshikawa1106:20170320115325p:plain


試しにファイルタブの方を確認してみました。表示していない場合はアプリケーションランチャーからアクセスできます。
f:id:tyoshikawa1106:20170320115509p:plain


試してみたところファイルタブの方で無事表示されていました。
f:id:tyoshikawa1106:20170320115549p:plain


Files Connect利用時には次のようにアプリケーションにファイルタブを出しておくと良さそうです。
f:id:tyoshikawa1106:20170320115830p:plain

f:id:tyoshikawa1106:20170320120116p:plain


Classic版でもファイルタブがあったほうが便利になると思います。
f:id:tyoshikawa1106:20170320120202p:plain

SFDC:Apexテストクラスで標準価格表IDを取得する方法

$
0
0

Apexテストクラスで標準価格表IDをSOQLをつかって取得するとき、システム項目ではないので@isTest(SeeAllData=true)を宣言しないと取得することができません。そのため次のようにメソッドレベルで宣言して取得したりします。
f:id:tyoshikawa1106:20170320123422p:plain


SOQLクエリはこんな感じです。
f:id:tyoshikawa1106:20170320123454p:plain



ですがこんなことしなくてももっとキレイに実装する方法がありました。
Test.getStandardPricebookId()を使う方法です。


次のように宣言すると標準価格表のIDを取得できます。

Id pricebook2Id = Test.getStandardPricebookId();


これをつかって直したのがこちら。
f:id:tyoshikawa1106:20170320124653p:plain


変更後にテストクラスを実行するとエラーなくテストできました。
f:id:tyoshikawa1106:20170320124722p:plain


このメソッドはSummer'14の頃に追加されていました。不要なSeeAllDate=trueの宣言もなくなりキレイに実装できて便利です。
f:id:tyoshikawa1106:20170320125031p:plain

http://successjp.salesforce.com/features/pdf/Summer14_ReleaseNotes.pdf

参考

Test.getStandardPricebookId()を使う方法はQiitaで知りました。


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

$
0
0

プロセスビルダーをつかえばワークフロールールと同じようにレコードの作成と更新時に処理を行うことができます。さらにワークフロールールではサポートしていなかった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が存在しないことでシステムエラーが発生します。(再現しなかったのでもしかすると設定中にうっかりミスがあっただけかもしれませんが...) プロセスビルダーのシステムエラーメッセージは原因を確認しずらいので注意が必要です。

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

$
0
0

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:Community CloudのトピックとChatterのトピック機能について

$
0
0

Chatterにあるトピックはハッシュタグの延長線的な感じで利用することができます。社内でどの話題が多いのかを管理するための機能になります。
f:id:tyoshikawa1106:20170323013315p:plain


そしてCommunity Cloudにもトピックという機能があります。こちらはすごくてトピックの情報をつかって新しいページを自動生成したりといった使い方ができるみたいです。


設定画面はこちら。
f:id:tyoshikawa1106:20170323013514p:plain


ここで気になる点があります。Community CloudのトピックとChatterのトピックは同じものなのかという点です。Community Cloudのトピックの利用用途を見るととても同じに見えなかったのですが確認してみました。


新規ボタンから次のように作成します。
f:id:tyoshikawa1106:20170323014007p:plain


作成後Chatterのトピックを確認してみました。同じものの場合は作成したトピックがChatter側にも表示されると思います。


その結果・・・表示されました。
f:id:tyoshikawa1106:20170323014128p:plain



Community CloudのトピックとChatterのトピックは基本的には同じものでした。ですがCommunity Cloud側の場合主要トピックやサブトピックなど便利な仕組みが用意されています。
f:id:tyoshikawa1106:20170323014321p:plain



最後にコミュニティ向け組織と社内向け組織ではトピックの管理は別物として管理されます。社内でトピックを沢山登録してもコミュニティ側では再度登録を行う必要がありました。
f:id:tyoshikawa1106:20170323014642p:plain

SFDC:Success Communityをモバイル端末から快適に利用する方法

$
0
0

Salesforce Success CommunityはSalesforce1モバイルアプリからの利用がサポートされていません。そのため基本的にはPCからの利用になると思います。
f:id:tyoshikawa1106:20170328224834p:plain


モバイルブラウザから利用できなくはないのですが、文字が小さくなりますし使いづらいと思います。


ですがこの問題を解決する方法があったみたいです。「/one/one.app」を使うやり方です。Salesforce1モードに切り替えてくれるURLですがSuccess Communityでも利用できます。


下記URLでアクセスできました。
https://success.salesforce.com/one/one.app


モバイル端末からアクセスすると次のようになります。

読み込み中

f:id:tyoshikawa1106:20170328230019p:plain:w150

Chatterフィードと通知アイコン

f:id:tyoshikawa1106:20170328230033p:plain:w150

ナビゲーションメニュー

f:id:tyoshikawa1106:20170328230044p:plain:w150

カスタマーサクセス日本のグループ

f:id:tyoshikawa1106:20170328230058p:plain:w150

通知内容の確認

f:id:tyoshikawa1106:20170328230115p:plain:w150


モバイル端末のSafariなどで先程のURLをブックマークしておけば快適に利用できると思います。操作性はSalesforce1モバイルアプリには負けますが通知機能やグループ移動など必要な操作はモバイル端末からでも問題なく利用できました。


最後にブックマークの他にホームに追加の機能も試してみました。
f:id:tyoshikawa1106:20170328225333j:plain:w150


これでホームにショートカットアイコンを表示できます。
f:id:tyoshikawa1106:20170328230322p:plain:w150


Safariのヘッダーとフッダー部分が消えスッキリました。
f:id:tyoshikawa1106:20170328230403p:plain:w150


・・・ですが自分のやった感じではアプリ利用後すぐにログアウト状態になってしまうので毎回ログインする必要ありそうでした。Safariのブックマークとして利用する方がログイン状態が暫くの間保持されるので便利そうでした。

SFDC:Lightning Exceperienceとコンパクトレイアウト

$
0
0

Salesforceのオブジェクトにはコンパクトレイアウトという設定が用意されています。Salesorce1モバイルアプリで一部項目を見やすい位置に表示するための設定です。
f:id:tyoshikawa1106:20170328231918p:plain


あまり使いみちの無い設定だと思っていましたが、Lightning Exceperienceの登場で用途が広がっていました。詳細ページの下記赤枠の部分にコンパクトレイアウトで設定した内容が表示されます。
f:id:tyoshikawa1106:20170328232116p:plain


ルックアップ項目でもコンパクトレイアウトの設定が適用されます。(上限は4件と思われます。)
f:id:tyoshikawa1106:20170328232216p:plain


コンパクトレイアウトですが標準オブジェクトはデフォルトである程度設定されています。
f:id:tyoshikawa1106:20170328232348p:plain


電話項目は1つにグルーピングされる仕組みです。
f:id:tyoshikawa1106:20170328232409p:plain


※カスタムオブジェクトの場合はName項目だけデフォルト表示されるようになっています。


コンパクトレイアウトはカスタマイズで任意の項目を表示するように設定できます。
f:id:tyoshikawa1106:20170328232625p:plain

f:id:tyoshikawa1106:20170328232716p:plain

f:id:tyoshikawa1106:20170328232740p:plain:w200


表示される項目数に上限はありますが比較的柔軟にカスタマイズできると思います。細かい部分ですがきちんと設定しておくとLightning Experienceが使いやすくなりそうです。

Viewing all 1439 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>