dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

[Salesforce]関連リストのレコードを一括更新する方法〜その1〜

やりたいことはこんな感じ。

とあるオブジェクトの詳細レコードから、参照関係にあるオブジェクトのレコードを関連リストとして表示する。
リストの各レコード左側にチェックボックスが表示されて、チェックを入れたレコードについて一括処理をする。

f:id:dackdive:20140610221907p:plain

今調べてわかっているだけで、このような一括処理を実現するには3通りぐらい方法があるみたい。

  1. javascriptだけで実装する
  2. Apex + Visualforce で実装する
  3. Apex Web Serviceを使って実装する

全部のやり方を載せようと思ったけど、2、3はまだ調べきれていないのでちょっとずつまとめていきます。
ただ、1 ~ 3のやり方のいずれにするにせよ、「カスタムボタン」を作成することになる。

というわけで今回は「1. javascriptだけで実装する」方法。

関連リストのレコードにチェックボックスを表示するには

カスタムオブジェクトの場合、

ボタン、リンク、およびアクション > 新規ボタンまたはリンク

をクリック。

そして、「表示の種類」から「リストボタン」を選択した時に表示される

チェックボックスの表示 (複数レコード選択用)

にチェックを入れる。

これだけ。

このカスタムボタンが1つでもあれば、関連リストにチェックボックスが表示されるようになる。

一括処理のjavascript

カスタムボタンの「動作」を「Javascriptを実行」にし、
下のテキストエリアに次のコードを記述する。

例1:一括削除

{!REQUIRESCRIPT('/soap/ajax/30.0/connection.js')} 

var records = {!GETRECORDIDS($ObjectType.MyObj__c)}; 

if (records[0] === null) { 
    alert('1つ以上選択してください');
} else { 
    sforce.connection.deleteIds(records); 
    window.location.reload(); 
}

例2:特定の項目を一括更新

{!REQUIRESCRIPT('/soap/ajax/30.0/connection.js')} 

var records = {!GETRECORDIDS($ObjectType.MyObj__c)}; 

if (records.length === 0) { 
    alert('1つ以上選択してください');
} else { 
    var objs = [];
    for (var i = 0; i < records.length; i++) {
        var obj = new sforce.SObject('MyObj__c');
        obj.id = records[i];

        obj.text__c = true;
        objs.push(obj);
    }
    var results = sforce.connection.update(objs);
    window.location.reload(); 
}

ポイント

  • connection.jsというファイルを利用する(これ、The AJAX Toolkitっていうそう)
  • 選択したレコードは{!GETRECORDIDS($ObjectType.[オブジェクトのAPI参照名])}を使うと、レコードのIDが取得できる
  • レコードのdeleteはdeleteIds
  • レコードのupdateはsforce.SObject('[オブジェクトのAPI参照名]')でSObjectとして取得し、IDをセットする

カスタムボタンをページレイアウトに追加する

やり方が分からなければ、こちらの記事に。
(3. ページレイアウトに表示させる、のところ)

[Salesforce]「メールを送信」画面をポップアップウィンドウで開く方法 - dackdive's blog

おしまい

というわけで、javascriptだけでの実装はこのような形。
さくっと書けていいけど、更新はレコードIDを元にオブジェクト取得して...とやや手順が煩雑な気がするし
カスタムボタンのjavascriptとしてロジックいろいろ書きすぎると保守もしんどそう。

(追記)

方法2, 3 についても書きました。

[Salesforce]関連リストのレコードを一括更新する方法〜その2〜 - dackdive's blog

[Salesforce]関連リストのレコードを一括更新する方法〜その3〜 - dackdive's blog

リファレンス

Salesforce Developers

Salesforce Developers

Help And Training Community