プログラマ38の日記

主にプログラムメモです。

Salesforce: レイアウト項目一覧の取得Excelマクロでミニページレイアウトの表示を追加しました

レイアウトの一覧とレイアウト項目 を取得するExcelマクロを以前作成しました。

レイアウト項目は、詳細項目と関連リストを対象としていたのですが、ミニページレイアウトの項目の追加しました。

 

ダウンロードはこちら からになります。

 

次のようにレイアウト項目でミニページレイアウト項目とミニページレイアウトの関連リストを表示を追加しました。

 

f:id:crmprogrammer38:20180620195657p:plainf:id:crmprogrammer38:20180620195747p:plain

 

[前回作成時の記事]

crmprogrammer38.hatenablog.com

 

最後に

ページレイアウトを設定する時に、ミニページレイアウトの設定はあまり深く考えないで項目を置いておくことが多いです。

そして、レコードタイプの追加にあわせてレイアウトを増やしていくと、見直し作業が意外と手間な時があります。

そんな時に使えるかなーと思います。

といっても、メタデータAPI名を一覧で表示しているだけで、ラベルの表示はしてなくてあまり使いやすくはないですけどね。

Salesforce: Lightningレコードページの割り当てをリリースする

結論として、Lightningレコードページの割り当てをリリースするには、「オブジェクト」「Lightning アプリケーション」をリリースする必要があります。

 

メタデータでLightningレコードページの割り当てがどこに記載されているかを確認したところ、オブジェクトとLightning アプリケーション(メタデータのCustomApplication)に情報が記載されていました。

 

メタデータの詳細

まず、Lightningレコードページの割り当ては次の内容です。

f:id:crmprogrammer38:20180616223338p:plain

  • 組織のデフォルト
  • アプリケーションのデフォルト
  • アプリケーション、レコードタイプ、プロファイル

表示の優先度は下からなので、「アプリケーション、レコードタイプ、プロファイル」を指定していれば、組織のデフォルトより優先されて表示されます。

 

上記の内容はメタデータ上では次のようになっています。

 

組織のデフォルト(メタデータ:オブジェクト)
    <actionOverrides>
        <actionName>View</actionName>
        <comment>Action override created by Lightning App Builder during activation.</comment>
        <content>LightningレコードページのAPI</content>
        <formFactor>Large</formFactor>
        <skipRecordTypeSelect>false</skipRecordTypeSelect>
        <type>Flexipage</type>
    </actionOverrides>

 

アプリケーションのデフォルト(メタデータ:アプリケーション)
    <actionOverrides>
        <actionName>View</actionName>
        <comment>Action override created by Lightning App Builder during activation.</comment>
        <content>LightningレコードページのAPI</content>
        <formFactor>Large</formFactor>
        <skipRecordTypeSelect>false</skipRecordTypeSelect>
        <type>Flexipage</type>
        <pageOrSobjectType>オブジェクトのAPI</pageOrSobjectType>
    </actionOverrides>

 

 アプリケーション、レコードタイプ、プロファイル(メタデータ:アプリケーション)
    <profileActionOverrides>
        <actionName>View</actionName>
        <content>LightningレコードページのAPI</content>
        <formFactor>Large</formFactor>
        <pageOrSobjectType>オブジェクトのAPI</pageOrSobjectType>
        <recordType>オブジェクトのAPI.レコードタイプのAPI</recordType>
        <type>Flexipage</type>
        <profile>プロファイル名</profile>
    </profileActionOverrides>

 

最後に

今までのプロファイル・レコードタイプ別のレイアウト割り当てで、ページの項目の表示を変更した後に、さらに、アプリケーション・レコードタイプ・プロファイルでLighningレコードページで表示の使い分けができて便利です。

が、リリース時の確認も本当に大変だなーと思いました。(アプリケーションをリリースしないとなると手動になってしまいますし)

Salesforce: オブジェクト情報取得マクロとメタデータエクスポート取得ツールをバージョンアップしました(APIVer43)

SalesforceがSummer18(APIVer43)にバージョンアップしたので、次のツールのバージョンをあげました。

 

Excel VBA : オブジェクト一覧と項目一覧の取得マクロ

 

Java : メタデータエクスポートツール

 

使い方は前回の内容から変更はありません。 

crmprogrammer38.hatenablog.com

  

crmprogrammer38.hatenablog.com

 

Api43から、SOAP APIでオブジェクトの数式項目「空白項目の処理(formulaTreatNullNumberAsZero)」を項目の属性として取得できるようになったのでオブジェクト項目の一覧マクロで表示を追加しました。

 

他に、excelマクロには表示していませんがaiPredictionFieldという属性も追加されています。これからAI用の項目も追加されていくのか楽しみです。

 

また、Api43で次のオブジェクトなどが追加されています。

・アプリケーション定義[AppDefinition]
・タブ定義[TabDefinition]
・アプリケーションタブメンバー[AppTabMember]

 

標準のアプリケーションの物理名などがわかりやすくなったなーと思いました。

Salesforce: プロファイルのIPアドレス制限の説明がメタデータでエクスポートできるようになってました

ついこの間まで、IPアドレス制限の説明はメタデータで取得できませんでした。

ですが、現時点(2018/5/15)で取得できるようになっていました。

 

画面の登録内容

f:id:crmprogrammer38:20180516093726p:plain

 プロファイルのメタデータの内容

f:id:crmprogrammer38:20180516094100p:plain

 

プロファイルのメタデータのテキストを使えば、今どの範囲に開放しているのかと、その説明が取得できるようになります。個人的にちょっと嬉しいです。

 

※補足として、Summer18(Apiバージョン43)になった環境でIPアドレス制限の説明が取得できるようになっているようです。
(まだSpring18(Apiバージョン42)の環境では取得できませんでした。)

 

Java: Map.remove ではまりました(java.util.ConcurrentModificationException)

Javaコードを書いていて、for each 内で、Mapのremoveを行いjava.util.ConcurrentModificationExceptionエラーになるのをすっかり忘れてました。

 

エラーになるコード

        HashMap<String, String> map = new HashMap<String, String>();
        
        map.put("k1", "v1");
        map.put("k2", "v2");
        map.put("k3", "v3");
        
        for(String k : map.keySet()){
            if( k.endsWith("2")){
                map.remove(k);
            }
        }

 

エラーにならないコード

        HashMap<String, String> map = new HashMap<String, String>();
        
        map.put("k1", "v1");
        map.put("k2", "v2");
        map.put("k3", "v3");
        
        for(Iterator<String> i = map.keySet().iterator();i.hasNext();){
            String k = i.next();
            if( k.endsWith("2")){
                i.remove();
            }
        }

 

Iteratorで要素を順に取得する場合は、要素の削除は Iterator.remove で行う必要がありました。(拡張for文はコンパイル時にIteraterのコードに展開されるようです)

すっかり拡張for文に慣れてしまいIteratorなんてほぼ目にしなくなっているのに、removeするときだけIteratorで回すのは面倒くさいなーと思いました。

 

removeではなく、新しいMapを作成する

処理に問題がなければ、removeした結果と同じMapを新規に作成しとけば問題ないですよね。

        HashMap<String, String> map = new HashMap<String, String>();
        
        map.put("k1", "v1");
        map.put("k2", "v2");
        map.put("k3", "v3");
        
        HashMap<String, String> newmap = new HashMap<String, String>();
        for(String k : map.keySet()){
            
            if( k.endsWith("2") == false){
                newmap.put(k, map.get(k));
            }
        }
        
        map = newmap;

さらにStreamAPIで綺麗に書けるようになってます。

    HashMap<String, String> map = new HashMap<String, String>();
    
    map.put("k1", "v1");
    map.put("k2", "v2");
    map.put("k3", "v3");
    
    map = map.entrySet().stream()
        .filter(m-> m.getKey().endsWith("2")==false)
        .collect(
          Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1,HashMap::new)
        );

 

でもラムダ式に慣れてなくて、いちいち調べないとまともに書けないですねー。ちゃんと把握しようかな。。と思いました。

Salesforce: メタデータAPIのretrieveでプロセスビルダーのメタデータ取得がうまくいかない件

メタデータAPIで、プロセスビルダーのメタデータを取得しようとしてうまくいかないことがわかりました。
メタデータダウンロードツールを作成していますが修正済みです。

 

 

プロセスビルダーのメタデータをlistMetadataで取得した際の物理名と、メタデータのリクエスト時の物理名が合ってないのが問題でした。

例えば、プロセスビルダーで物理名が「AutoCreateContact」というものを作成したとすると

listMetadataで取得した際の物理名 : AutoCreateContact
メタデータのリクエスト時の物理名 : AutoCreateContact-1

のようになる時があるようです。(listMetadataで取得した際の物理名で末尾の"-1"が最初から入っている場合もあり、条件は不明です)

対応策としては、プロセスビルダーのメタデータワイルドカードで取得するように変更しました。


最後に

Salesforceのヘルプ(https://developer.salesforce.com/docs/atlas.ja-jp.api_meta.meta/api_meta/meta_retrieve.htm)を参考に作成してもそのままでは取得できないメタデータがあるので注意が必要ですね。。

Salesforce: Lightning Lightning レコードページの設定

Lightning レコードページ を使うことでレイアウトの配置がさらに細かく指定できます。

 

f:id:crmprogrammer38:20180319092515p:plain

 

配置では次をよく使います。

指定できるもの 内容
強調表示パネル ヘッダとボタン
パス パスを設定した場合のパス表示
レコードの詳細 レコードの詳細ページ(ページレイアウトで設定したもの)
タブ Lightning レコードページを指定しない場合の、詳細ページと関連リストの表示に近いもの(タブは追加可能)
関連リスト ページレイアウトで指定した関連リストを表示(表示条件を追加可能)
関連リスト - 1つ ページレイアウトで指定した関連リストの中から1つを表示(表示条件を追加可能)

 

関連リストの指定で表示条件を追加できますが、この条件は関連リストそのものの表示・非表示で、関連リストに表示するデータの条件ではありませんでした。

 

Lightning レコードページはデフォルトで指定したり、アプリケーション毎やアプリケーションとレコードタイプ毎で指定できます。

また、Visualforceや、Lightningコンポーネントも指定できてレコード詳細表示でやりたいことは、ほぼ設定でできてしまいます。

 

ただ設定変更が画面に反映されるまで、多少ラグがあるのが気になりました。