プログラマ38の日記

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

Salesforce: メタデータエクスポートツールのバージョンを上げました(APIVer44)

Salesforce Winter19(APIVer44)用にメタデータエクスポートツールのバージョンをあげました。

 

ダウンロードはこちらからです。

 

今回からツールにjdkを含めています。というのも、OracleJDKが使えなくなる(有償化される)日が近いうちに来るため、openJDKに慣れておきたいと考えたからです。

 

APIVer43と44では、オブジェクト情報にChangeDataCaptureの情報が追加されていたり、ダッシュボードのコンポーネントで数字の小数点の情報などが追加されていたりなど多少違いがありました。

 

最後に

Salesforceの周辺ツール(DataLoaderやforce.com IDE、移行ツールなど)JDKの有償化や、JDK9から32bit版がなかったりなどJavaに関連する対応が気になります。

全く先が読めないですが、これから大変になっていくんですかね。。

Salesforce: 階層を持つフォルダとそのフォルダのレポート・ダッシュボードをデプロイする

Summer18からレポート・ダッシュボードフォルダは階層を持つことができるようになりました。

 

変更セットを使えば、フォルダの階層関係とレポート・ダッシュボードをそのまま他の組織にリリースできます。(サブフォルダは更新できませんので変更セットでもリリース先にフォルダがあるとエラーになります)

が、メタデータからのデプロイでは次の問題があります。

メタデータからのデプロイの問題点

  • サブフォルダとサブフォルダ内のレポート・ダッシュボードは、retrieveしたZipファイルをそのままdeployできずpackage.xmlの編集が必要

問題点の詳細と対策

そもそもメタデータでretrieveすると次のようになります。
例として、フォルダ「Lv1」の下にフォルダ「Lv2」、フォルダ「Lv2」の下にはレポート「Lv2Report」という構成とします。

f:id:crmprogrammer38:20181021185518p:plain

retrieveしたメタデータ

f:id:crmprogrammer38:20181021190458p:plain


Salesforceのフォルダ階層と同じように、メタデータのフォルダも階層となっています。(※workbenchで取得したためunpackagedフォルダがルートにありますが、Force.com IDEや、Ant移行ツールでは多少違いがあります)


そして、package.xmlは次のようになります。

<!--?xml version="1.0" encoding="UTF-8"?-->

<package xmlns="http://soap.sforce.com/2006/04/metadata">

    <types>

        <members>Lv1</members>

        <name>Report</name>

    </types>

    <types>

        <members>Lv2</members>

        <name>Report</name>

    </types>

    <types>

        <members>Lv2/Lv2Report</members>

        <name>Report</name>

    </types>

    <version>43.0</version>

</package>

問題の詳細ですが、

  • Lv2フォルダは、Lv1のサブなので本来であれば「Lv1/Lv2」なのですが、retrieveしたpackage.xmlでは「Lv2」となっていること
  • 同様に、Lv2Reportレポートも本来であれば「Lv1/Lv2/Lv2Report」なのですが、retrieveしたpackage.xmlでは「Lv2/Lv2Report」となっていること
  • サブフォルダは、Deployで更新すると「このフォルダの一意の名前はこのフォルダ種別ですでに使用されているか、以前に使用されていました。別の名前を選択してください。」のエラーが発生します。(これは変更セットでも同様です)

 

上記を踏まえると、deployする前には次のようにpackage.xmlの編集が必要です。

<!--?xml version="1.0" encoding="UTF-8"?-->

<package xmlns="http://soap.sforce.com/2006/04/metadata">

    <types>

        <members>Lv1</members>

        <name>Report</name>

    </types>

    <types>

        <members>Lv1/Lv2</members>

        <name>Report</name>

    </types>

    <types>

        <members>Lv1/Lv2/Lv2Report</members>

        <name>Report</name>

    </types>

    <version>43.0</version>

</package>

フォルダ構成を押さえておいて、サブフォルダやサブフォルダのレポートのコンポーネントにトップレベルからのフォルダの記載をする必要があります。

そして、deploy先にサブフォルダが既に存在する場合は次のようにpackage.xmlの記載から削除しておく必要があります。

<!--?xml version="1.0" encoding="UTF-8"?-->

<package xmlns="http://soap.sforce.com/2006/04/metadata">

    <types>

        <members>Lv1</members>

        <name>Report</name>

    </types>

<!--
<types> <members>Lv1/Lv2</members> <name>Report</name> </types>
--> <types> <members>Lv1/Lv2/Lv2Report</members> <name>Report</name> </types> <version>43.0</version> </package>

 レポートフォルダを例としましたが、ダッシュボードフォルダも同様です。

最後に

まだフォルダが階層を持てるようになってから期間が短いので、メタデータのretrieveが最新の仕様に追い付いていない状況です。

モジュールのバックアップとしてメタデータを取得しておいて、うっかり削除してしまった際にはバックアップしたメタデータをdeployして元に戻す運用にしている場合があります。

ですが、レポート・ダッシュボードでフォルダを階層にしている場合、上記の問題がありそのままでは復旧できないので注意が必要です。

また、参考としてAPI43以上であればフォルダ(Folder)オブジェクトに、Folder ID(ParentId )項目があるので、DataLoaderで取得した後にフォルダの階層情報をたどることができます。※Folder IDには参照先名がないので、SOQLで参照先をたどって取得はできないようです。

 

Java: int から byte と byte から int の変換

急に忘れてしまうので、備忘メモ

 

intからbyteは、キャストする。

    int intval1 = 255;
    
    byte byteval1 = (byte)intval1;

 

byteからintは、ビット演算または、Byte.toUnsignedInt を使う

    byte byteval2 = -1;
    
    int intval2 = byteval2 & 0xFF;
    
    int intval3 = Byte.toUnsignedInt(byteval2);

 

Javaのファイル操作で read の結果が int で そのintの値をbyteで扱いたいときにいちいち調べたりしてしまいます。。 そろそろファイル操作のreadの結果をbyteで返すメソッド追加されないかなー。 なんで int で返ってくるんだろ。。

Salesforce/Excel: アプリケーションのタブを一覧表示するマクロを作成しました

どのタブをどのアプリケーションで使っているか一覧で欲しいなと思い、アプリケーションのタブを一覧表示するマクロを作成しました。

ダウンロードはこちらからです。

 

 機能は、アプリケーション毎のタブを一覧にします。

 

アプリケーションのタブを一覧表示

マクロの操作感は次の通りです。(以前から作成しているマクロと同じです)

Salesforceの接続情報を指定
②通信設定を指定
③アプリケーションタブ取得ボタンをクリック後アプリケーション毎のタブを取得

 

f:id:crmprogrammer38:20180814231726p:plain

 

表示項目は、次です

[アプリケーション]

  • Name:物理名
  • Label:表示ラベル
  • navType:ナビゲーション種別
  • utilityBar:UI種別
  • utilityBar:ユーティリティバー名
  • description:説明 

[タブ] 

  • Name:物理名
  • Label:表示ラベル

 

フィルタを使う想定で、1つのアプリケーションに複数のタブがある場合はそれぞれのIタブにアプリケーションの情報をつけています。

工夫した点は、アプリケーションの属性とタブの表示ラベルは、オブジェクトのAppDefinitionとTabDefinitionの情報も使っています。

というのもメタデータAPIのreadMeadataを使っているのですが、それだけでは表示ラベルが取得できないものがあったからになります。

 

最後に

 

SalesforceAPI操作を目的にVBAを大分書くことができました。今回のVBAでは連想配列や通常の配列などを使ってみました。(今さら感がとても強いですが) 

そもそもVBAのfunctionでは戻り値は、関数名に代入する書き方をします。(まだ慣れないです。一生慣れることはなさそうです。。)

functionの戻り値でオブジェクトを戻す際には、関数名の代入にもsetが必要というところで結構はまりました。エラーの箇所の特定も大分難しいと思いました。

 

Excel VBAは、Pythonが使えるようになるなどの情報もありますので期待して待とうと思います。

 

雑記: はてなのHTML編集ではまったこと(&nbsp;の文字)

色々なソースコードを記載してきましたが、自分の記載したソースコードをコピーして使おうとして気がつきました。
html編集で「&nbsp;」にすると文字コードで「C2A0」という文字で表示されるんですね。。


わざわざ半角スペースを「&nbsp;」に変換して貼り付けていたのが仇となりました。
今までのせてきたものは全部直そうと思います。
良い機会だから<code></code>ではさむようにしとこ。

150程度しか記事はないけど意外と大変です。。

Salesforce/Excel: プロファイルIPアドレスの制限を一覧表示するマクロを作成しました

各プロファイルにどのIPアドレスの制限がかかっているか一覧で欲しいなと思い、プロファイルのIPアドレスの制限を一覧表示するマクロを作成しました。

ダウンロードはこちらからです。

 

 機能は、プロファイルに対してのIPアドレスの制限を一覧にします。

 

プロファイルIPアドレスの制限の一覧を表示

マクロの操作感は次の通りです。(以前から作成しているマクロと同じです)

Salesforceの接続情報を指定
②通信設定を指定
③プロファイルIPアドレス制限取得ボタンをクリック後IPアドレス制限を取得

f:id:crmprogrammer38:20180801093952p:plain

 

表示項目は、プロファイル名(メタデータのfullName)、カスタムかどうか、ユーザライセンスと、IPアドレス制限情報になります。

 

フィルタを使う想定で、1つのプロファイルに複数のIPアドレスの制限がある場合は、それぞれのIPアドレスの制限にプロファイルの名前をつけています。

 

最後に

プロファイルの名前は、メタデータのfullNameです。例えば「システム管理者」は「Admin」と表現されますのでご注意ください。

 

セキュアにSalesforceを使いたい場合はIPアドレスの制限がとても有効です。設定を間違ったり、SandboxからプロファイルをリリースしたりなどでIPアドレスの制限がおかしくなってないかチェックするのに使えるかなーと思っています。

 

後、動すと結構時間がかかります。

プロファイルのメタデータをreadMetadataで取得すると項目レベルセキュリティなどその他のプロファイルの属性も取得しており、通信の量が多くなっていることが原因の一つだと思います。

 

メタデータのretrieveならプロファイル単独で取得すれば項目レベルセキュリティなと他の情報は取得しないのですが、readMetadataはプロファイルの設定は全て取得する設計のようです。

IPアドレスの制限だけ使うには、情報量が多いですが、うまく作ればプロファイルの様々な設定をEXCELで表示することも可能です。

 

CSV: Excelで開く際に、ゼロサプレスや日付変換を回避する

CSVファイルは、大体Excelに関連付けがされていてダブルクリックするとExcelで開きます。
Excelで中身を確認できるのはとても便利ですが、次のようになってしまい使いづらいことがあります。
CSVの文字は「0001」なのに、Excelでは「1」となる
CSVの文字は「2000-01」なのに、Excelでは日付の「2000/1/1」となる

この現象は数式扱いにすると回避できます。


テキストが変換されてしまうCSVの中身

"0001","2000-01"

Excelで開いた場合の表示

f:id:crmprogrammer38:20180711102325p:plain
ゼロサプレスされるのと、勝手に日付変換されてしまいます。


テキストを数式扱いにしたCSVの中身

="0001",="2000-01"

Excelで開いた場合の表示

f:id:crmprogrammer38:20180711102436p:plain

セルは数式の値でcsvの文字列がそのまま表示されます。

 

気をつけること

ただし、数式扱いにしなければ正しく表示される値でも、数式扱いにすると表示がおかしくなる場合があります。

おかしくなるのは、文字列中にカンマ(,)や改行( )がはいる場合です。


通常のCSV

"000,000,000","AAAAA
BBBBB"

Excel表示

f:id:crmprogrammer38:20180711102214p:plain
正しく表示されます

 

数式に変更

="000,000,000",="AAAAA
BBBBB"

Excel表示

f:id:crmprogrammer38:20180711102123p:plain
表示が崩れてしまいます。


この現象を回避するため、テキスト内のカンマと改行も数式で表現しておく必要があります

="000" & char(44) & "000" & char(44) & "000",="AAAAA" & char(10) & "BBBBB"

 ※カンマはchar(44) で、改行はchar(10)で表現しています。

Excel表示

f:id:crmprogrammer38:20180711102106p:plain

最後に

テキストを数式扱いしたCSVは連携用途で扱えません、Excelでの表示用途に限定したやり方になります。

業務ユーザにCSVを配布した際にゼロサプレスされては困る、勝手に日付変換されたら困る項目に限定して数式扱いにするのがいいのかなと思います。