Salesforce Winter '24 で気になったリリース(Dev中心)
こんにちは。木村です。
10月11日に恒例のリリースノート輪読会を開催しました。弊社エンジニアが気になったリリースを取り上げながら雑談する会です。開催からだいぶ時間が空いてしまいましたが、この記事ではそこで取り上げたリリースを紹介します。
Dev系リリースの8割くらいは網羅している気がします。コメントをつけて、コードやスクショを貼っているので、Dev系リリースをざっと把握するならリリースノートより使えるのではないかと思います。
それでは、行ってみましょう!
Salesforce 全体
全般的な機能強化
ちょっとだけまたアイコンの色が変わったりしたそうだ。
Einstein Search
プロファイルの検索可能なオブジェクトの設定の簡易化 (ベータ)
プロファイルごとに検索対象とするオブジェクト/項目を設定する画面が非常にわかりやすくなった。
開発
Lightning コンポーネント
DynamicComponent Lightning Web コンポーネントの動的なインポートとインスタンス化
ポータルアプリとか作れそう。他社のexposedなコンポーネントを自社アプリ内に埋め込めるようになる。
コンポーネントレベルの API バージョン管理による LWC の最新機能の取得
利用可能なバージョンより新しいバージョンを指定すると、最新の既知バージョンになる。たとえば、最新の LWC API バージョンが 58.0、59.0、60.0 の場合に、61.0 を指定すると、フレームワークで 60.0 が使用される。つまり、100.0とか指定したら当面最新バージョンで動いてくれるということか。
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>58.0</apiVersion>
</LightningComponentBundle>
LWCでLightningコンソールのタブの制御が可能になる。
あまりコンソール対応アプリを作らないので、未対応だったことを知らなかった。
要望が多いエンハンスだったらしい。
Lightning Locker での RefreshView API の使用
確かLWS有効時のRefreshView APIはSummer ‘23でリリースされていたはず。それがLocker環境でも動くようになった。
RefreshView APIはコンポーネントの更新イベントの発火と更新イベントの受信が行えます。
詳細: https://developer.salesforce.com/docs/platform/lwc/guide/data-refreshview.html
しかし、LWSとLockerで書き方が違うらしい。。。
コンソール対応のリリース含めAuraとのギャップがだいぶなくなってきている。
基本コンポーネント lightning-input の内部 DOM 構造の変更
lightning-inputのDOM構造が変わるので、DOM構造に依存するようなテストを書いている場合は考慮が必要になる。
カスタムコンポーネントインストルメンテーション API (ベータ) を使用したコンポーネントイベントの監視
Salesforce ShieldまたはSalesforce Event Monitoringを購入しているユーザに限る機能だが、イベントモニタリングに直接ログを記録するLWCのモジュールが追加された。
LWRサイトではlightning/platformShowToastEventは使えなかったらしく、代わりとして別のトースト通知モジュールが提供された。
platformShowToastEventを使えるようにはできなかったのだろうか。。。
CSSスコープトークンはLWCをレンダリングしたときに勝手に付与される属性のこと。コンポーネントのCSSをコンポーネント内のみに効くようにするための仕組み。
このフォーマットがcmpName_cmpNameからlwc-abc123に変わるというリリース。
なので、this.template.querSelectorでこのCSSスコープトークンを使っているような場合は修正が必要。
Apex
ユーザーモードデータベース操作の権限セットを使用したカスタムアクセス権の指定 (開発者プレビュー)
以下のように指定した権限セットでDMLを実行できるらしい。
Database.insert(
new Account(name='foo'),
AccessLevel.User_mode.withPermissionSetId(permissionSetId)
);
パッケージに同梱したカスタム権限セットのテストには使えそう。他の用途はあまり思いつかない。
チェーニングされたキュー可能ジョブの最大深度の設定 (正式リリース)
Queueableの最大深度を設定できる機能がGA。
AsyncOptions asyncOptions = new AsyncOptions();
asyncOptions.MaximumQueueableStackDepth = depth;
System.enqueueJob(new FibonacciDepthQueueable(null, null), asyncOptions);
同じキュー可能ジョブが重複起動するのを防ぐ仕組みが登場。
AsyncOptions options = new AsyncOptions();
options.DuplicateSignature = new System.QueueableDuplicateSignature.Builder()
.addId(UserInfo.getUserId())
.addString('MyQueueable')
.build();
try {
System.enqueueJob(new MyQueueable(), options);
} catch (DuplicateMessageException ex) {
//Exception is thrown if there is already an enqueued job with the same signature
Assert.areEqual('Attempt to enqueue job with duplicate queueable signature',
ex.getMessage());
}
DataWeave in Apex を使用したさまざまな形式へのデータ変換の有効化 (正式リリース)
MuleSoftのデータ変換言語DataWeaveをApexから利用する機能がついにGA。
以下はCSVをContractに変換する例。
// CSV data for Contacts\n
String inputCsv = 'first_name,last_name,email\nCodey,"The Bear",codey@salesforce.com';
DataWeave.Script dwscript = new DataWeaveScriptResource.csvToContacts();
DataWeave.Result dwresult = dwscript.execute(new Map<String, Object>{'records' => inputCsv});
List<Contact> results = (List<Contact>)dwresult.getValue();
Assert.areEqual(1, results.size());
Contact codeyContact = results[0];
Assert.areEqual('Codey', codeyContact.FirstName);
Assert.areEqual('The Bear', codeyContact.LastName);
%dw 2.0
input records application/csv
output application/apex
---
records map(record) -> {
FirstName: record.first_name,
LastName: record.last_name,
Email: record.email
} as Object {class: "Contact"}
https://github.com/developerforce/DataWeaveInApex にサンプルがいろいろある。
Apex Reserved Keywordsとかおもしろい。JSONのキーにApex予約語があると、deserializeでインスタンスに変換できないので事前に予約語を変換しておくようだ。
Comparator インターフェースと Collator クラスを使用した並び替え
新しいListのソート用インターフェース。
既存のComparableはListに入れるクラスに実装する必要があったが、ComparatorはJavaやJavaScriptのようにListにCoparatorの実装クラスを渡すとソートできるようになった。使いやすい。
List<Employee> empList = new List<Employee>();
(中略)
NameCompare nameCompare = new NameCompare();
empList.sort(nameCompare);
Iterable による For ループ内での反復処理の簡略化
今までこう書くしかなかったところが
Iterator<Integer> iter = someClass.iterator();
while(iter.hasNext()) {
Integer value = iter.next();
// Do something with value
}
こう書けるようになったらしい。
for(Integer value: someClass.iterator()) {
// Do something with value
}
Iterator使っていれば確かにうれしいと思うが、Iteratorをほとんど使う機会がないのでピンとこない。
これはうれしい。これのことかな?前はなかった気がする。
getSalesforceBaseUrl() Method Is Being Deprecated
けっこう使っているgetSalesforceBaseUrl()が非推奨になる。getOrgDomainUrl()に置き換えればよさそう。
API
JWT ベースのアクセストークンを使用した REST API コールの認証
今まではアクセストークンは意味のない文字列だったが、JWTベースのアクセストークンを発行可能になった。
試していないが、アクセストークンからユーザIDやログインURLが取れそう。
詳細: Salesforce ヘルプ: JWT ベースのアクセストークン
開発環境
Sandboxを作成したときに、作成したユーザに加えて、特定の公開グループに所属するユーザのメールアドレスにも.invalidがつかないようにできるようになった。便利。
AppExchange パートナー
Scan Your Solution with Ease Using Salesforce Code Analyzer Visual Studio Code Extension (Beta)
Code Analyzerを実行するVSCodeエクステンションがベータリリース。
だから、Apex PMDのVSCodeエクステンションがアップデートされなくても放置しているのかもしれない。
Improve AppExchange Listing Discoverability with New Business Needs Categories and Subcategories
AppExchangeのリスト作成時の入力内容がまた変更があったそうです。Business Needsが拡張・修正されたらしい。
プラットフォームイベント
Apex トリガーの並列登録を使用したプラットフォームイベントの大規模な処理 (パイロット)
プラットフォームイベントのApexトリガーでの処理を並列処理することで処理を高速化できるそうです。パーティションキー(下記引用のように項目を指定)とパーティション数を指定して、イベントがパーティションに分かれて並列処理されるようになるそうだが、どのように分割されるのかはよくわからない。
UTAM
Playground を使用した HTML からの UTAM ページオブジェクトの生成
以前にUTAMページオブジェクトは作れたもんじゃないだろと社内で言ってたら、HTMLからの生成ツールができた。UTAMに妙に力を入れてそうで、どきどきする。
開発者向けの新規および変更された項目
lightning-record-picker (ベータ) < 新規追加または変更された Lightning Web コンポーネント
待望のレコードのインクリメンタルサーチコンポーネント。内部的にはGraphQL wireアダプターを使っているらしい。
無理矢理record-edit-formで実現するしかなかったので本当にありがたい。早くGAになって欲しい。
<lightning-record-picker label="Accounts"
placeholder="Search Accounts..."
object-api-name="Account"
filter={filter}>
</lightning-record-picker>
filterにはデフォルトの絞り込み条件を指定できる。
ドキュメント: https://developer.salesforce.com/docs/component-library/bundle/lightning-record-picker/documentation
lightning/uiGraphQLApi (正式リリース) < 新規追加または変更された Lightning Web コンポーネントのモジュール
GraphQLのwireアダプターがGAになった。検索系はApex書かなくてもほとんどのことができるようになりそう。
import { LightningElement, wire } from "lwc";
import { gql, graphql } from "lightning/uiGraphQLApi";
export default class MyGQLQuery extends LightningElement {
@wire(graphql, {
query: gql`
query AccountInfo {
uiapi {
query {
Account(where: { Name: { like: "Account1" } }) {
edges {
node {
Name {
value
displayValue
}
}
}
}
}
}
}
}`,
})
propertyOrFunction;
}
https://developer.salesforce.com/docs/platform/lwc/guide/reference-graphql.html
Salesforce フロー
Flow Builder
反応型コンポーネントを使用した画面フローの作成 (正式リリース)
(日本語訳が変ですが、リアクティブコンポーネントのことです。)
反応型コンポーネントは、画面フローにおいて、あるユーザの入力によって同一画面内のコンポーネントの表示を変えられる機能のこと。今までは表示を変えるには画面遷移が必要だった。
見出しのリンクから飛んでもらえるとわかるが、これに関係していろいろな機能がリリースされている。例えば、「反応型画面で使用できる数式関数の増加」の機能追加では、以前はユーザーが別の画面に移動するまで、数式はフローの他の場所の変更に反応しなかったのが反応するようになる。
だいぶ画面フローのユーザビリティーが上がる。
実現した IdeaExchange:レコードトリガーフローでのカスタムエラーメッセージの作成
入力規則のようなバリデーションをフローで実現できるようになった。
以下の図のように更新後にカスタムなエラーメッセージを画面に表示することも可能になった。
(2)のところに「As an inine error on a field」とあるように指定項目のところにエラーメッセージを表示することもできる。
待望のエンハンス。
HTTP コールアウトを介してコードなしで Salesforce データを外部サーバーに送信 (正式リリース)
前はベータだった機能。
フローからのHTTPコールアウトアクションがPOST/PUT/PATCH/DELETEをサポート。
次のフローのデータの変換 (ベータ)と組み合わせが強力。
以前は、[ループ] 要素と [割り当て] 要素が含まれるフローを作成するしかなかった領域に、嬉しいアップデート。
[変換]という名前の要素が追加される。
例えば特定の条件に応じて取得したオブジェクトのデータを元に他のオブジェクトに対してInsertやUpdateをするときにデータ変換していたが、それが楽できるようになる。
こんな感じのマッピングをセットできるようになる
以下は金額を数式を用いて変換してセットするようなやり方。
上に書いたが、HTTPコールアウトアクションとの組み合わせが強力。APIリクエストの構築やAPIレスポンスの解析がかなり簡単になる。
これまで全ての設定がされていなければフローが保存できなかったけど、設定中でのドラフト保存できるようになった。大変ありがたい。
さりげないけど、喉から手が出るほど欲しかった機能。
画面フローを連結させたとき、「次へ」「前へ」の操作などで、入力規則エラーが発生したとき、前の画面に戻ったときに、画面フローで値が保持されるようになりました。
以前はデフォルト値を指定しないと指定した値が削除されていたので、対策のために必要な変数が余計に増え手間が増えていた。
フローでのセッション ID へのアクセスを無効化 (リリース更新)
フローで $Api.Session_ID 変数が利用できなくなる。使っている人は要注意。
フローを実行するためのユーザーアクセスの制限 (リリース更新)
一応以前から、「フローの管理」または「フローを実行」権限をプロファイルまたは権限セットで追加できていた認識だけど、「特定のフロー」に対するアクセスは制御できなかった認識だから、影響は大きいかも。Winter '25 で適用。
フローオーケストレーション
要件を使用したオーケストレーションフェーズおよびステップの実行制御
今まではステップの開始条件が複雑な場合は評価フローを作る必要があったが、最大3つの条件に限り評価フローを作らずフェーズのプロパティパネルで設定できるようになった。
セールス
セールスの基本
Salesforce Maps Liteというものがあるらしい。Unlimited Edition 以上なのであまり使う機会はなさそう
注意が必要な取引先責任者の表示および取引先責任者ホームからのアクションの直接実行
「取引先責任者インテリジェントビュー」というのができるらしい。
注意が必要なリードを確認してリードホームから直接アクションを実行
リードには「リードインテリジェンスビュー」が追加される
Einstein 会話インサイト
通話記録 (Video Callオブジェクト?) のサマリーを自動生成してくれるらしい。UEのみでEEではアドオン。他社製品を使っているが、試してみたい。
詳しくは 、ヘルプの「Einstein 会話インサイト」を参照、またトレイルヘッドモジュールもある「セールス向け Einstein 会話インサイト」
Video Callレコードを自動的に、商談、取引先、リード、または取引先責任者を照合して適切な関連を追加してくれるらしい。
Revenue Intelligence
売上予測インサイトダッシュボードで見れる情報が追加されたっぽい?UEでも有料オプション。
パイプラインインスペクション
刷新されたパイプラインインスペクションページで商談に迅速に対応
パイプラインビューめっちゃ変わるらしい。DFのキーノートで説明してた画面かな。
Sales Cloud Einstein
Einstein GPT for Sales を使用したセールスメールのパーソナライズ
Einstein GPTが表示しているレコード情報を埋め込んたメールを提案してくれる。UEのみ。
セキュリティ、ID、プライバシー
Salesforce バックアップ
バックアップと復元から Salesforce バックアップへの名前変更
バックアップと復元から Salesforce バックアップへ名前変更される。機能は変わらず。ドキュメントとかに更新が入る
ID とアクセス管理
接続アプリケーションが新しくなったようだ。キャッチアップしないといけない。
指定ログイン情報
クライアントログイン情報フローによる指定ログイン情報コールアウトの認証
指定ログイン情報がサーバー間のAPIコールに便利なOAuth 2.0 クライアントログイン情報フロー(Client Credentials フロー)に対応した。
Client Credentials フローとは、クライアントIDとシークレットのみでアクセストークンを取得するフローのこと。
Winter ‘23でSalesforce APIがOAuth2 Client Credentialsフローをサポートしたが、今回はその逆でSalesforceから外部サービスを呼ぶときの認証方式としてOAuth2 Client Credentials フローをサポートした。
指定ログイン情報でJWT認証プロトコルが設定できるようになった。元々OAuth 2.0のJWTベアラートークンフローはサポートしていたので混同しそうになる。
おわりに
めちゃめちゃ多いですね。これを1時間で話しているので、イベントは大忙しでした。主要リリースを紹介するイベントは他にあるので、このイベントはこんな感じでいいかなあと思っています。
しかし、最近Unlimitedでしか使えない機能が増えてきています。Unlimitedの上のEditionもDreamforceで発表されていたし、「だんだんUnlimitedが一般的です。」みたいな世界になっていくのだろうか。。。
毎月第2火曜16:30に「ゆるっとSalesforceトーク」という運営がゆるいけど内容は割りと濃いオンラインイベントをやっています。今回のリリースノート輪読会もそのうちの一回です。よろしければ上のリンクからグループにご参加ください。イベントの通知が届きます。