プログラマ38の日記

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

Salesforce:Lightning showToastイベント(e.force:showToast)について調べたこと

データ保存時にメッセージを表示するのに、showToastイベント(e.force:showToast)を使うことがあります。

showToastイベントについて調べたことの備忘メモです。

1.mode (画面の表示の仕方)  は 3 種類

dismissible : ×クリックで消える。durationで指定した時間経過で消える。

f:id:crmprogrammer38:20190903193244p:plain
sticky : ×クリックで消える。時間経過では消えない。

f:id:crmprogrammer38:20190903193255p:plain
pester : ×クリックできない(表示がない)。durationで指定した時間経過で消える。

f:id:crmprogrammer38:20190903193316p:plain

2.type (色やアイコン) は 5 種類

f:id:crmprogrammer38:20190903194049p:plain : info

f:id:crmprogrammer38:20190903194107p:plain : success

f:id:crmprogrammer38:20190903194121p:plain  : warning

f:id:crmprogrammer38:20190903194131p:plain : error

 f:id:crmprogrammer38:20190903194138p:plain : other

3.一度に表示できるのは 3個 のメッセージ

連続してshowToastイベントを実行しても一度の画面表示は3つまでのようです。
同時に3つ以上実行しても、表示されているメッセージが消えてから次のメッセージを表示するという動きをします。

f:id:crmprogrammer38:20190903194603p:plain

4.タイトルを指定すると、メッセージのフォントが小さくなる

f:id:crmprogrammer38:20190903194919p:plain

5.メッセージを改行するには別途スタイルシートが必要

次のような改行区切りのメッセージをToastで表示しようとすると、うまく改行されません。
メッセージ内容:
 表示メッセージ1
 表示メッセージ2
 表示メッセージ3

画面表示: 

f:id:crmprogrammer38:20190911122550p:plain

Toast内で改行する場合は、スタイルシートの指定が必要です。

1.次のスタイルシートを静的リソースに登録します。

.toastMessage.forceActionsText{
     white-space : pre-line !important;
}

2.Lightning Componentのcmpで、外部CSS リソースを読み込みます。

<ltng:require styles="{!$Resource.MultiLineToast}" />

 ※静的リソースには「MultiLineToast」として登録しました。


上記1,2を実施後の画面表示は次の通りとなります。

f:id:crmprogrammer38:20190911123514p:plain

 

最後に

この調査をするにあたって作成したLightning Componentのサンプルは次になります。

cmp:

<aura:component implements="lightning:isUrlAddressable,force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,force:lightningQuickAction" access="global" >
  <ltng:require styles="{!$Resource.MultiLineToast}" />
    
    <lightning:layout multipleRows="true">
        <lightning:layoutItem  size="4" padding="around-small" largeDeviceSize="4" smallDeviceSize="12">

    <lightning:card title="Toastイベントサンプル">
        <table class="slds-table slds-table_bordered slds-table_cell-buffer">
            <thead>
              <th>#</th>
              <th>mode</th>
              <th>type</th>
              <th></th>
              
            </thead>
            <tbody>
                <tr><td>1</td><td>dismissible</td><td>info</td><td><lightning:button aura:id="dismissible info" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>2</td><td>dismissible</td><td>success</td><td><lightning:button aura:id="dismissible success" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>3</td><td>dismissible</td><td>warning</td><td><lightning:button aura:id="dismissible warning" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>4</td><td>dismissible</td><td>error</td><td><lightning:button aura:id="dismissible error" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>5</td><td>dismissible</td><td>other</td><td><lightning:button aura:id="dismissible other" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>

                <tr><td>6</td><td>sticky</td><td>info</td><td><lightning:button aura:id="sticky info" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>7</td><td>sticky</td><td>success</td><td><lightning:button aura:id="sticky success" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>8</td><td>sticky</td><td>warning</td><td><lightning:button aura:id="sticky warning" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>9</td><td>sticky</td><td>error</td><td><lightning:button aura:id="sticky error" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>10</td><td>sticky</td><td>other</td><td><lightning:button aura:id="sticky other" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>

                <tr><td>11</td><td>pester</td><td>info</td><td><lightning:button aura:id="pester info" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>12</td><td>pester</td><td>success</td><td><lightning:button aura:id="pester success" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>13</td><td>pester</td><td>warning</td><td><lightning:button aura:id="pester warning" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>14</td><td>pester</td><td>error</td><td><lightning:button aura:id="pester error" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
                <tr><td>15</td><td>pester</td><td>other</td><td><lightning:button aura:id="pester other" variant="brand" label="showToast" onclick="{!c.showMyToast}" /></td></tr>
            </tbody>
        </table>
    
    </lightning:card>
            </lightning:layoutItem>
        </lightning:layout>
</aura:component>

 js:

({
  showMyToast : function(component, event, helper) {
        
        var modestr = event.getSource().getLocalId().split(' ')[0];
        var typestr = event.getSource().getLocalId().split(' ')[1];
        
        
        var toastEvent = $A.get("e.force:showToast");
        toastEvent.setParams({
            mode: modestr,
            type : typestr,
            //title: '表示タイトル',
            message: '表示メッセージ1\n表示メッセージ2\n表示メッセージ3'
        });
        toastEvent.fire();
  }
})

 

Salesforce:Lightning Promiseを使ってサーバコールを順番に処理する

Lightning Componentのクライアントサイドコントローラで業務ロジックを書く時に、サーバサイドコントローラのメソッドを順次呼び出したり、全部の処理が完了した後にメッセージ表示をしたりしたい時があります。

例えば、次のようなhelperとcontrollerを用意したとします。

//helper.js    
    invokeApex1 : function(arg, component, event, helper) {
        var serveraction = component.get('c.sampleCall1');
        serveraction.setParams({
            "value": arg
        });
        
        serveraction.setCallback(this, function(response){
            var state = response.getState();
            if (state === "SUCCESS") {
                //ロジック
            }
        });
        $A.enqueueAction(serveraction);
    }
    ,
    invokeApex2 : function(arg, component, event, helper) {
        var serveraction = component.get('c.sampleCall2');
        serveraction.setParams({
            "value": arg
        });
        
        serveraction.setCallback(this, function(response){
            var state = response.getState();
            if (state === "SUCCESS") {
                //ロジック
            }
        });
        $A.enqueueAction(serveraction);
    }    
//controller.js    
    handleClick : function(component, event, helper) {
        helper.invokeApex1('invoke01',component, event, helper);
        helper.invokeApex2('invoke02',component, event, helper);
		
        var toastEvent = $A.get("e.force:showToast");
        toastEvent.setParams({
            "title": "Success!",
            "message": "処理が完了しました。"
        });
        toastEvent.fire();
    }

 上記controllerの handleClick 実行時には、helper.invokeApex1 helper.invokeApex2 が完了していなくても、"処理が完了しました。" と表示されます。
これは、$A.enqueueAction が非同期のためです。

 

 上の処理をPromiseを使って書き直すと

//helper.js   
invokeApex1 : function(arg, component, event, helper) {
        return new Promise(function(resolve, reject){
            var action = component.get('c.sampleCall1');
            action.setParams({
                "value": arg
            });
            
            action.setCallback(this, function(response){
                var state = response.getState();
                if (state === "SUCCESS") {
                    //業務ロジック
                    resolve(response.getReturnValue());
                } else {
                    reject(new Error(response.getError()));
                }
            });
            $A.enqueueAction(action);            
        });
    }    
    ,
    invokeApex2 : function(arg, component, event, helper) {
        return new Promise(function(resolve, reject){
            var action = component.get('c.sampleCall2');
            action.setParams({
                "value": arg
            });
            
            action.setCallback(this, function(response){
                var state = response.getState();
                if (state === "SUCCESS") {
                    //業務ロジック
                    resolve(response.getReturnValue());
                } else {
                    reject(new Error(response.getError()));
                }
            });
            $A.enqueueAction(action);
            
        });
    }    
//controller.js   
    handleClick : function(component, event, helper) {
        
        const invokeApex1 = helper.invokeApex1('invoke01' ,component, event, helper);
        
        invokeApex1.then(function (response){
            //response は、invokeApex1のresolveの引数なので、invokeApex1の実行結果が使えます
            return helper.invokeApex2('invoke02' ,component, event, helper);
        }).then(function (response){
            //response は、invokeApex2のresolveの引数なので、invokeApex2の実行結果が使えます
            var toastEvent = $A.get("e.force:showToast");
            toastEvent.setParams({
                "title": "Success!",
                "message": "処理が完了しました。"
            });
            toastEvent.fire();                
        } , function (error){
            //エラー発生時の制御
        });
    }

 上記のように書き換えることで、非同期処理でも順番に実行することができます。

最後に

次のようにサーバサイドコントローラのメソッドをコールする場合、$A.enqueueAction(action); を一度に実行されます。そして、例えばSOQLの発行回数などはまとめて実行したメソッド全体で加算されていきます。

helper.invokeApex1('invoke01',component, event, helper); 
helper.invokeApex2('invoke02',component, event, helper);

特に、PromiseやsetCallback の中で次のactionを順番に制御しなくてもいい場合でも、まとめて実行してしまうと予想外のガバナ制限エラーが発生してしまうので注意です。

Salesforce:Lightning tableのヘッダを固定する

以前のVisualforceではtableタグのヘッダ固定は、JavaScriptスタイルシートで自前で設定してきました。
ですが、Lightning Componentのスタイルシート(すなわち、SLDSのCSS)ではあらかじめヘッダ固定用のスタイルが定義されています。
※今のVisualforceではSLDSのタグを使えるので、Lightning Componentと同様にヘッダが固定できます。(こちらのサイトにサンプルがありました)

これを使うと簡単にヘッダ固定の次のようなtableが作れます。

f:id:crmprogrammer38:20190814143608p:plain


ポイントですが、下記のソース中に青文字にしています。

<div class="slds-table--header-fixed_container slds-color__border_gray-5" style="height:300px; border-style:solid;border-width:1px;">
  <div class="slds-scrollable_y" style="height:100%;">
    <table class="slds-table slds-table_bordered slds-table--header-fixed slds-table_cell-buffer">
      <thead>
        <tr class="slds-text-title_caps">
          <th><div class="slds-cell-fixed" title="取引先名">取引先名</div></th>
          <th><div class="slds-cell-fixed" title="業種">業種</div></th>
          <th><div class="slds-cell-fixed" title="国(請求先)">国</div></th>
          <th><div class="slds-cell-fixed" title="都道府県(請求先)">都道府県</div></th>
          <th><div class="slds-cell-fixed" title="市区郡(請求先)">市区郡</div></th>
          <th><div class="slds-cell-fixed" title="町名・番地(請求先)">町名・番地</div></th>
          <th><div class="slds-cell-fixed" title="郵便番号(請求先)">郵便番号</div></th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><div class="slds-truncate" title="Pyramid Construction Inc.">Pyramid Construction Inc.</div></td>
          <td><div class="slds-truncate" title="Construction">Construction</div></td>
          <td><div class="slds-truncate" title="USA">USA</div></td>
          <td><div class="slds-truncate" title="CA">CA</div></td>
          <td><div class="slds-truncate" title="San Francisco">San Francisco</div></td>
          <td><div class="slds-truncate" title="The Landmark @ One Market">The Landmark @ One Market</div></td>
          <td><div class="slds-truncate" title="75251">75251</div></td>
        </tr>
        <!-- 以下trタグを繰り返し  -->
      </tbody>
    </table>
  </div>
</div>

 

上記のように、タグとCSSを指定することでヘッダ固定が簡単にできます。
簡単にできる分、手を加えるのが難しそうです。

以下自分で試してみてできなかったこと(ホントはできるのかもしれません)

  • ヘッダを1行ではなくて、複数行で固定する
  • ヘッダの色を変更する(きっとできるんでしょうけど。。)
  • 列も固定

最後に

上記のタグを使って書くと、ヘッダは淡いグレーになります。
白の背景色にヘッダ固定のtableを配置すると、ヘッダの色の境目があいまいになってしまうため枠線を指定しています。(ソース内で緑色にした所です)

多少タグやスタイルを書くだけでヘッダ固定できてしまうのは便利です。列の固定は難しそうですが、あえて固定にこだわらなくても、title属性を使って行にホバーさせれば必要な情報が出るというような対応も取れそうだなと思いました。

<-- 行のタイトルをつけるサンプル  trの中のタグにtitleを付けるとtitleの表示は上書きされます -->
<tr title="固定タイトル">
  <td><div class="slds-truncate">Pyramid Construction Inc.</div></td>
  <td><div class="slds-truncate">Construction</div></td>
  <td><div class="slds-truncate">USA</div></td>
  <td><div class="slds-truncate">CA</div></td>
  <td><div class="slds-truncate">San Francisco</div></td>
  <td><div class="slds-truncate">The Landmark @ One Market</div></td>
  <td><div class="slds-truncate">75251</div></td>
</tr>    

 

Salesforce:Lightning 背景/文字/枠線のグレイ(Gray)の色

Lightning Componentで画面を作る際に、文字の色、背景の色、枠線の色へグレイを指定する際に、あらかじめclassが用意されています。


文字の色

slds-color__text_gray-1 から slds-color__text_gray-12 まで指定できます。
次が表示した時の色合いです。

f:id:crmprogrammer38:20190812231204p:plain

slds-color__text_gray-1 や slds-color__text_gray-2 ではほぼ白に近いなという印象ですが、背景色に濃色を指定して白抜きで表示する際に使えると思います。
slds-color__text_gray-10 や slds-color__text_gray-11 だと黒より大分薄くてタイトルの文字色で使いやすそうです。

背景の色

slds-color__background_gray-1 から slds-color__background_gray-12 まで指定できます。
次が表示した時の色合いです。

f:id:crmprogrammer38:20190812231713p:plain

標準画面のヘッダなどでよく使われるグレイは slds-color__background_gray-3 となります。開発した画面でも、標準画面の色と統一感を持たせる時に使うことになると思います。

枠線の色

slds-color__border_gray-1 から slds-color__border_gray-12 まで指定できます。
次が表示した時の色合いです。

f:id:crmprogrammer38:20190812232514p:plain

標準画面の枠線でよく使われるグレイは slds-color__border_gray-5 だと思います、多分。開発した画面でも、標準画面の色と統一感を持たせる時に使うことになると思います。

最後に

色合いの画像を表示するために用意したLightning Component用のtableタグは下記の通りです。

<table class="slds-table slds-table_bordered" >
  <tr  class="slds-text-title_caps">
    <td class="slds-theme_inverse">対象</td>
    <td class="slds-theme_inverse">classの指定</td>
    <td class="slds-theme_inverse">画面表示</td>
  </tr>
  <tr>
    <td rowspan="12">文字色</td>
    <td>slds-color__text_gray-1</td>
    <td class="slds-color__text_gray-1">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-2</td>
    <td class="slds-color__text_gray-2">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-3</td>
    <td class="slds-color__text_gray-3">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-4</td>
    <td class="slds-color__text_gray-4">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-5</td>
    <td class="slds-color__text_gray-5">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-6</td>
    <td class="slds-color__text_gray-6">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-7</td>
    <td class="slds-color__text_gray-7">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-8</td>
    <td class="slds-color__text_gray-8">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-9</td>
    <td class="slds-color__text_gray-9">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-10</td>
    <td class="slds-color__text_gray-10">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-11</td>
    <td class="slds-color__text_gray-11">文字色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__text_gray-12</td>
    <td class="slds-color__text_gray-12">文字色サンプル</td>
  </tr>
  <tr  class="slds-text-title_caps">
    <td class="slds-theme_inverse">対象</td>
    <td class="slds-theme_inverse">classの指定</td>
    <td class="slds-theme_inverse">画面表示</td>
  </tr>
  <tr>
    <td rowspan="12">背景色</td>
    <td>slds-color__background_gray-1</td>
    <td class="slds-color__background_gray-1">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-2</td>
    <td class="slds-color__background_gray-2">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-3</td>
    <td class="slds-color__background_gray-3">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-4</td>
    <td class="slds-color__background_gray-4">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-5</td>
    <td class="slds-color__background_gray-5">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-6</td>
    <td class="slds-color__background_gray-6">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-7</td>
    <td class="slds-color__background_gray-7">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-8</td>
    <td class="slds-color__background_gray-8">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-9</td>
    <td class="slds-color__background_gray-9">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-10</td>
    <td class="slds-color__background_gray-10">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-11</td>
    <td class="slds-color__background_gray-11">背景色サンプル</td>
  </tr>
  <tr>
    <td>slds-color__background_gray-12</td>
    <td class="slds-color__background_gray-12">背景色サンプル</td>
  </tr>
  <tr  class="slds-text-title_caps">
    <td class="slds-theme_inverse">対象</td>
    <td class="slds-theme_inverse">classの指定</td>
    <td class="slds-theme_inverse">画面表示</td>
  </tr>
  <tr>
    <td rowspan="12">枠線</td>
    <td>slds-color__border_gray-1</td>
    <td><div class="slds-color__border_gray-1" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-2</td>
    <td><div class="slds-color__border_gray-2" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-3</td>
    <td><div class="slds-color__border_gray-3" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-4</td>
    <td><div class="slds-color__border_gray-4" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-5</td>
    <td><div class="slds-color__border_gray-5" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-6</td>
    <td><div class="slds-color__border_gray-6" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-7</td>
    <td><div class="slds-color__border_gray-7" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-8</td>
    <td><div class="slds-color__border_gray-8" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-9</td>
    <td><div class="slds-color__border_gray-9" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-10</td>
    <td><div class="slds-color__border_gray-10" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-11</td>
    <td><div class="slds-color__border_gray-11" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>
  <tr>
    <td>slds-color__border_gray-12</td>
    <td><div class="slds-color__border_gray-12" style="border-style:solid; border-width:1px;">枠線サンプル</div></td>
  </tr>

</table>

Salesforce:Lightning タブを作成しないで、Lightning ComponentにURLでアクセスする

Visualforceの場合、 /apex/[VisualforceのAPI名] を使うことで直接Visualforceページの表示が可能です。

Lightning Componentで同じような表示をするには、 /lightning/cmp/c__[Lightning ComponentのAPI名] となります。
そして次のように、Lightning Componentのインターフェース属性に"lightning:isUrlAddressable" が必要になります。

<aura:component implements="lightning:isUrlAddressable">

 

もちろん、Lightning Componentを使用するには、私のドメインを取得してあることが前提となっています。

ちなみに、タブを作成してある場合は、 /lightning/n/[Lightning ComponentのAPI名] になり、Lightning Componentのインターフェース属性に"lightning:isUrlAddressable" は必要ありません。


最後に

タブを作成しないで利用するには、インターフェース属性が必要なのと、Lightning Component のAPI名の前の謎の"c__"を追加する必要があります。
Visualforceよりも最初の慣れに時間がかかるなーと思いました。


Salesforce: メタデータダウンロードツールとExcel項目取得ツールのバージョンを上げました(ApiVer46)

Summer19のリリースに伴い次のツールのバージョンを上げました。

Summer19でも、オブジェクトが増えていたりメタデータが追加されていたりします。
メタデータダウンロードツールでは、ソースコードもつけていますのでロジックを確認後お使い頂けると考えています。

最後に

Summer19から、オブジェクトや項目に、「dataTranslationEnabled」の属性が追加されています。まだどういう用途で使うのかは理解していないのですが、新機能向けの属性だと思います。まだあまり情報がないですね。。なので項目取得マクロへは今回はこの属性は追加していません。


あと、Excel VBAでソースを参照できたり、Javaソースコードをつけいたりしていいます。販売しているわけではないのでライセンスは考えたこともなかったのですが、ソースコードをつけているからにはライセンスを明示しておくほうがいいのかなとか思うようになりました。
今の時代に、ライセンスが明示されていないソースコードを利用できない時があります。あまりよく理解せずに過ごしてきてしまいましたが、きちんと著作権を侵害しないようにしないといけないなと感じています。

 

Salesforce: メタデータダウンロードツールとExcel項目取得ツールのバージョンを上げました(ApiVer45)

Spring19のリリースに伴い次のツールのバージョンを上げました。

Spring19で、オブジェクトが増えていたりメタデータが追加されていたりします。
最低確保されるディスク容量も増えるようですし、どんどん機能が増えていくのは嬉しいですね。

 

ツールをアップするストレージはGoogleドライブを使っているのですが、メタデータダウンロードツールはそれなりにファイルが大きいので気長にダウンロードしてください。ソースファイルもつけてますので、安心して使って欲しいなと思います。

最後に

いくつかのメタデータのファイル名は物理名(API名)ではなくて、ラベル名がそのまま使用されるものがあります。代表的なものとして、プロファイル・レイアウト・ホームページレイアウトなどがあります。

ファイル名として使えない文字はメタデータファイルではURLエンコードされるのですが、「*」だけはメタデータのファイル名に含まれてしまいます。

その結果、Salesforceが提供されているツールでは、「*」が含まれるメタデータファイルは、エラーとなり保存できません。

そこで、このメタデータダウンロードツールでは「*」を「%2a」に変換することでエラーにならないようにしています。

注意点として、Ant Migration Toolなどpackage.xmlを使ってデプロイする場合、このダウンロードしたファイル名に合わせてpackage.xmlコンポーネント名を変更しておく必要があります。

名前を合わせておけばデプロイはエラーとならず、「*」のつくコンポーネントをデプロイすることができます。

メタデータのリクエスト時に、「*」を「%2a」に変換しておけば、package.xmlでは%2aに変換後のコンポーネント名で出力されます。このようにメタデータダウンロードツールは変更してます。
※「%2a」はデプロイ後は「*」に変換されます。