tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Spring'20の新機能 - Apexの新規および変更された項目を試してみました

"この記事は Salesforce 開発者向けブログキャンペーンへのエントリー記事です。"
Spring'20の新機能 - Apexの新規および変更された項目を試してみました。

f:id:tyoshikawa1106:20200309074701p:plain

リリースノート


Auth 名前空間とReports 名前空間のやつはよくわからないのでスキップ。

Schema 名前空間

新しく追加されたのは下記の機能です。
f:id:tyoshikawa1106:20200309074927p:plain

項目の sObject 結果の記述を取得し、子リレーションを読み込むか、またはパラメータ値に基づかないかを決定する
Schema.SObjectType クラスの新しい getDescribe(options) メソッドを使用します。


詳細はApex開発者ガイドに記載がありました。
f:id:tyoshikawa1106:20200309075200p:plain

パラメータ値は、組織スキーマの重要な更新の改善されたキャッシュを有効化すると共に、記述操作の要素の読み込み方法を決定します。

SObjectDescribeOptions.FULL を使用して、用途メソッドの呼び出し前に、子リレーションを含む記述のすべての要素を一括で読み込みます。この記述は、必ず完全に一貫した結果になります。これは、記述オブジェクトが別の名前空間、API バージョン、その他の Apex コンテキストに渡されて、記述属性の生成時に異なる結果になる可能性がある場合でも同様です。

子リレーションの遅延読み込みを行うには、SObjectDescribeOptions.DEFERRED を使用します。これは、メソッドの最初の呼び出し時に一部の子リレーションが読み込まれないことを意味します。

SObjectDescribeOptions.DEFAULT を使用して、API バージョンに応じて、デフォルトが一括読み込みと遅延読み込みのいずれかになるようにします。


処理の書き方はこんな感じ。

// FULL
Schema.DescribeSObjectResult result1 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.FULL);
System.debug(result1);
// DEFERRED
Schema.DescribeSObjectResult result2 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.DEFERRED);
System.debug(result2);
// DEFAULT
Schema.DescribeSObjectResult result3 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.DEFAULT );
System.debug(result3);

実行した結果はこんな感じ。情報量が多すぎてよくわからず。
f:id:tyoshikawa1106:20200309080340p:plain


戻り値のDescribeSObjectResult クラスでできることを確認してみました。
f:id:tyoshikawa1106:20200309080445p:plain

Salesforce Developers


例えばfieldsの場合はgetMapと組み合わせて使うと記載があるのでこんな感じ。

// FULL
Schema.DescribeSObjectResult result1 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.FULL);
System.debug(result1.fields.getMap());
// DEFERRED
Schema.DescribeSObjectResult result2 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.DEFERRED);
System.debug(result2.fields.getMap());
// DEFAULT
Schema.DescribeSObjectResult result3 = Schema.Opportunity.SObjectType.getDescribe(SObjectDescribeOptions.DEFAULT );
System.debug(result3.fields.getMap());

f:id:tyoshikawa1106:20200309080705p:plain


fieldsで使い方のイメージがついたところで子リレーションが関係していそうな処理を探してみると..ありました。
f:id:tyoshikawa1106:20200309080851p:plain


取引先オブジェクトを対象に実行してみると

// FULL
Schema.DescribeSObjectResult result1 = Schema.Account.SObjectType.getDescribe(SObjectDescribeOptions.FULL);
System.debug(result1.getChildRelationships());
// DEFERRED
Schema.DescribeSObjectResult result2 = Schema.Account.SObjectType.getDescribe(SObjectDescribeOptions.DEFERRED);
System.debug(result2.getChildRelationships());
// DEFAULT
Schema.DescribeSObjectResult result3 = Schema.Account.SObjectType.getDescribe(SObjectDescribeOptions.DEFAULT );
System.debug(result3.getChildRelationships());


オプションは指定できていますが、実行結果の違いはよくわからず。
f:id:tyoshikawa1106:20200309081130p:plain


使い道はわかりませんでしたが、getDescribeで新しく追加されたオプションの指定方法はこんな感じで宣言できるみたいです。

System 名前空間

System名前空間で追加されたのは下記の機能です。
f:id:tyoshikawa1106:20200309081328p:plain

ページ URL リダイレクトを制御するリダイレクトコードの指定
PageReference クラスの新しい setRedirectCode(redirectCode) メソッドを使用して、301、302、303、307、308 の redirectCode を指定します。新しい getRedirectCode() メソッドは、PageReference redirectCode を返します。

List コレクション型の文字列表現の取得
System.List クラスの新しい toString() メソッドを使用します。

Map コレクション型の文字列表現の取得
System.Map クラスの新しい toString() メソッドを使用します。

Set 型の文字列表現の取得
System.Set クラスの新しい toString() メソッドを使用します。

ページ URL リダイレクトを制御するリダイレクトコードの指定

setRedirectCode(redirectCode) メソッドが追加されたそうです。これでリダイレクトコードというのを取得できるようになったみたいです。


処理の書き方はこんな感じ。

PageReference pageRef = new PageReference('http://www.google.com');
pageRef.setRedirectCode(301);
System.debug(pageRef.getRedirectCode());

f:id:tyoshikawa1106:20200309081751p:plain

詳細はこちら。

https://developer.salesforce.com/docs/atlas.ja-jp.224.0.apexcode.meta/apexcode/apex_system_pagereference.htm?search_text=List#stq=List&stp=1

新しい toString() メソッド

ListとMapとSetで使えるようになった新機能です。使い方のイメージが付きやすかったので開発者ガイドはノーチェックですが、こんな感じ。

// List Class
List<String> sample1 = new List<String>{'サンプル1', 'サンプル2', 'サンプル3'};
String result1 = sample1.toString();
System.debug(result1);

// Map Class
Map<String, String> sample2 = new Map<String, String>();
sample2.put('key1', 'value1');
sample2.put('key2', 'value2');
sample2.put('key3', 'value3');
String result2 = sample2.toString();
System.debug(result2);

// Set Class
Set<String> sample3 = new Set<String>{'サンプル4', 'サンプル5', 'サンプル6'};
String result3 = sample3.toString();
System.debug(result3);

f:id:tyoshikawa1106:20200309082446p:plain


Mapとかどうなるのかなと思いましたが、KeyとValueと両方がそのままString型になりました。リスト型やセット型はString型以外の場合にどう変換されるかはまたの機会に確認しようかなと思います。


Spring'20の新機能 - Apexの新規および変更された項目はだいたいこんな感じでした。知らなくても特に困らないですが、知っておくと役立つ機会があるかもしれない感じの機能という印象でした。

SFDC:フォローアップToDoボタンの機能を試してみました

フォローアップToDoボタンの機能を試してみました。
f:id:tyoshikawa1106:20200308121344p:plain


SalesforceのToDo機能は自分のやることリストを管理する上で便利な機能です。
f:id:tyoshikawa1106:20200308121443p:plain


ToDoによっては作業実施後に次のタスクが発生する場合があります。発生時に既存のToDoの期間を延ばしてコメント欄に作業を追加していくと、タスクが終わらなくて延期されている場合と混ざってしまい、実施した作業の集計がしずらくなってしまいます。


ToDoタブなどから新規作成しても良いのですが、フォローアップToDoボタンをクリックするとページ遷移をせずに次のToDoの登録が可能です。
f:id:tyoshikawa1106:20200308122141p:plain


こんな感じの入力欄となります。
f:id:tyoshikawa1106:20200308122201p:plain


登録結果はこちら。
f:id:tyoshikawa1106:20200308122233p:plain


新規ToDo作成時にページ遷移の手間を無くして作成するための機能となります。元のToDoとのリレーションは特になさそうでした。またこのボタン自体はグローバルアクションの設定で定義済み項目を指定するなどのカスタマイズもできないようです。

その他の参考情報

ヘルプ - 活動の記録 ボタン

SFDC:サイトゲストユーザの更新権限除外の話 - その後

聞いた話でWinter'20のリリースから。セキュリティアラートページでも通知されていたというサイトゲストユーザの更新権限除外の話のその後です。
f:id:tyoshikawa1106:20200308113022p:plain

Help | Training | Salesforce


経緯とか概要はこちら。


サイトゲストユーザの役割ですが、Force.comサイトやCommunity Cloudで構築された外部向けのWebサイトを未ログイン状態で利用する際に裏側の仕組みとして用意されているユーザとなります。


このサイトゲストユーザは今まで更新権限を付与することが可能でしたが、今回その権限の付与が不可になることになったみたいです。タイミングとしては当初3月1日の予定でしたがVisualforceメールテンプレートの機能に予期せぬ影響が見つかったため、3月末までに延期されることとなっています。また、サポートに申請することでSummer'20のリリース日まで延期することが可能です。(申請しなくてもSummer'20リリースまでは手動でオフに戻すこともできるとのこと。)


サイトゲストユーザの更新権限の用途ですが、Webフォームに用意する処理で下記のようなケースがあるかなと思っています。

既存データの更新

・新規顧客の問い合わせの場合は取引先と取引先責任者をSalesforceに登録処理(INSERT)を行い、既存顧客の問い合わせは更新処理(UPDATE)を行う。(メールアドレスなどで判別)。重複データの作成を防止したりデータを適切な形で自動で最新化する。

所有者の自動割り当て

Webフォーム受付時に新規顧客の場合は担当営業を特定の条件で自動割り当てして所有者として登録する。処理後にユーザオブジェクトのカスタム項目に保持した項目更新して連続でアサインされることを防止する。

↑例えばのサンプルですがざっくりこんな用途で更新権限が必要になると思います。


今回の変更により、共有ルールの設定は引き続き可能ですが、更新権限の付与はできなくなるため、UPDATE処理は実行できなくなります。


この仕様変更ですが、影響を受ける組織が多いのではと勝手に思っていて、直前になって無くなるのでは...とすら考えました。とはいえそれで本当に有効化された場合、有効化直後からWebフォームがクラッシュする状況になるという最悪な事態となるため、サポートに問い合わせをしました。


簡潔にまとめると下記のような質問。(実際はいろいろ聞いた。)

  • 今後サイトゲストユーザでのUPDATE処理は完全にできなくなりますか。
  • 影響を受ける組織は多数あると思うのですが、それは認識された上での変更で直前で廃止されたりはしませんか。


更新権限付与の代わりの方法が無いので場合によってですが既存の機能は破棄する必要がでてきます。それによって業務フローの変更が必要になる場合も発生します。影響範囲が大きい箇所で既存機能を破棄するなどの改修後にやっぱり中止となったら困るということもあり本当に無くなるんですかという確認をしました。


結論としては、サイトゲストユーザの更新処理は完全にできなくなる認識で問題ないことと、影響を受ける組織があるのは認識した上でセキュリティ向上のため必要な変更で、現時点で中止になる可能性は無いとのことでした。


サポートの方からの正式な回答を頂き、Summer'20から適用されることを確認することができました。元々既存の機能への影響の有無などは考慮済みの決定だったとも思います。ということでサイトゲストによる更新処理を行っている場合は、更新処理を使わない形に改修しておくと良いと思います。(もしかすると、そもそもサイトゲストユーザでUPDATE処理してるところって無いかもしれませんが)

SFDC:Sandboxのマスキング機能 - Salesforce Data Maskについて

Sandboxのマスキング機能 - Salesforce Data Maskについてです。Dreamforce2019で公開された新機能だったのですが、Spring'20で利用可能になりました。

f:id:tyoshikawa1106:20200308111555p:plain

リリースノート


Dreamforce2019時点では利用方法などの詳細な情報は特になったと思いますが先日TwitterでSpring'20から利用可能になる通知を見かけました。


リリースノートを見たところ、パッケージをインストールすれば使えそうな雰囲気だったのですが、Twitterで教えてもらった情報で、こちらの機能はアドオン形式で提供される製品とのことです。
f:id:tyoshikawa1106:20200308111910p:plain


ちなみにパッケージのインストールについてはこちらのヘルプで紹介されています。インストール後に権限セットで利用権限を付与するタイプのおうです。
Help | Training | Salesforce

SFDC:Lightningページのモバイル設定を試してみました

Lightningページのモバイル設定を試してみました。
f:id:tyoshikawa1106:20200308105021p:plain


Lightningページはデバイスごとに設定を切り替えることができます。共通のページを利用する場合でもある程度最適化されますが、切り替えたほうが便利です。


例えばPC版でタブによる管理をしていた場合です。
f:id:tyoshikawa1106:20200308105223p:plain


モバイルアプリでアクセスするとデフォルトではタブのみが表示された状態となります。(コンパクトレイアウトで数項目は表示されますが)
f:id:tyoshikawa1106:20200308105306p:plain:w200


詳細ページにアクセスするにはタブメニューから対象のタブを選択して初めてアクセス可能になります。
f:id:tyoshikawa1106:20200308105410p:plain:w200


この問題はモバイル専用のページを用意することで解決できます。
f:id:tyoshikawa1106:20200308105518p:plain


まずは新規Lightningページの作成を行います。既存のページをコピーすると作業が楽になるかもしれません。はじめにテンプレートを選択します。スマートフォン用に用意する場合は1つの範囲を選択すると良いと思います。
f:id:tyoshikawa1106:20200308105716p:plain


あとは表示したい情報を配置していくためです。モバイルの場合はアコーディオンメニューをつかって配置すると便利ではないかなと思っています。
f:id:tyoshikawa1106:20200308110147p:plain


基本は詳細の情報を見ることが多いと思いますが、関連リストやChatterを表示したいときに他の情報を非表示にすることができます。タブと違いページ遷移ではないので待ち時間が発生している感覚にはなりづらい気がしました。


ページの作成ができたらモバイルの利用として割り当てを行います。
f:id:tyoshikawa1106:20200308110410p:plain


これでPC版とモバイル版の2つのLightningページの設定ができました。
f:id:tyoshikawa1106:20200308110453p:plain


この設定後にモバイルアプリからアクセスするとこのように表示されます。
f:id:tyoshikawa1106:20200308110741p:plain:w200


アコーディオンメニューで気持ち残念だったのは最低一つはオープンにしておく必要があります。そのため、他のメニューの情報を表示したいときに今見ているメニューを閉じてスクロールするといった使い方はできないみたいです。(開いたままスクロールする必要がある。)

SFDC:アプリケーション設定のページ切り替え機能を試してみました

アプリケーションマネージャのアプリケーション設定ページでタブの並び順などの設定変更が可能ですが、ページ切り替え機能があったことを知ったので試してみました。

f:id:tyoshikawa1106:20200308103812p:plain


最新参照したページ?が選択候補として表示されていますが、基本的には新規ページをクリックして対象ページを探します。
f:id:tyoshikawa1106:20200308104017p:plain


対象ページを選択して開くをクリックすると選択したページの設定画面に移動できます。
f:id:tyoshikawa1106:20200308104210p:plain


この機能は組織に割当している既存のLightningページの設定ページではなくアプリケーションごとに割り当てを行うLightningページを用意するための機能のようです。

f:id:tyoshikawa1106:20200308104410p:plain

SFDC:アプリケーションのタブの並び順変更が反映されないときの対処について試してみました

アプリケーションのタブの並び順変更が反映されないときの対処について試してみました。タブの並び順はアプリケーション設定のナビゲーション項目で指定できます。

f:id:tyoshikawa1106:20200308101718p:plain


基本的には設定変更後に特に何もしなくても反映されますが、反映されないときもあります。再ログインやキャッシュクリアでも解決しないパターンです。


解決しない場合は画面右上の方にある鉛筆アイコンをクリックします。
f:id:tyoshikawa1106:20200308101825p:plain


ポップアップが表示されるのでナビゲーションをデフォルトにリセットをクリックします。
f:id:tyoshikawa1106:20200308101940p:plain


並び順がリセットされるので保存をクリックして設定を反映させます。これで正しい並び順で表示されます。
f:id:tyoshikawa1106:20200308102017p:plain


ユーザが個別に変更するのを許可したくない場合はアプリケーションオプションから設定できると思います。
f:id:tyoshikawa1106:20200308102431p:plain