Labyrinth of Wisdom

-This is My Archive-


リードの取引開始時に取引先責任者でレコードタイプを引き継ぐ

リードオブジェクトのレコードタイプを、取引開始後の取引先責任者でも引き継ぎたくて下記の記事を参考にプロセスビルダーを触っていました。

www.systemforest.com

この記事の中で「18桁のレコードタイプIDを指定する」的なことが書いてあるんですけど、通常の画面からだとURLに記載されている15桁のレコードタイプIDしか参照できないのでそれでやってみました。 いちいちデータローダとか使うの面倒くさいし。

で、ちゃっちゃと真似てプロセスビルダーを作って、取引開始してみたんですけど、一向に指定したレコードタイプにならない。 何回やってもならない。

でちょっと面倒だけど18桁のレコードタイプIDを取得してみました。 レコードタイプを指定した適当なレコードを各オブジェクトに一つずつ作り、それを取り出します。

Lead[] lead = [SELECT Name, RecordTypeId FROM Lead WHERE name = 'xxx' LIMIT 1];

Contact[] contact = [SELECT Name, RecordTypeId FROM Contact WHERE name = 'xxx' LIMIT 1]

System.debug(lead);
System.debug(contact);

取得した18桁のレコードタイプIDを使ってプロセスビルダーを更新すると・・・

できた!

ちゃんと書いてあること守るべきでしたね。すいません。

同じところでハマってる人もいるかもなのでメモしときます。

パスワードの強度と桁数等の関係について

最近読んだコラムですごく為になったのでシェア。

WEBサービスで設定するパスワードって大体が6文字以上 or 8文字以上の半角英数字、中には大文字小文字識別記号も使えるみたいなところもありますね。

まあ複雑な方が当然見破られにくく、セキュリティは強いっていうのは誰でも想像つくんですけど、文字数や組み合わせでどれくらい強度が違うのかを示している記事がありました。

情報化推進レター

上記リンクより拝借

f:id:Labyrinth_of_Wisdom:20160607092656p:plain

6桁の英字(大文字小文字区別なし)だと、なんと37分!でパスワードを破られることがあるという驚きの結果!(PCの性能条件などは上記リンク参照)

Amazon楽天なんかの大手ショッピングサイトでも、パスワードの条件は6文字以上の英数字(大文字小文字区別なし)だったと思います。(違ってたらすいません)

もちろん簡単に破れないように何らかの対策をしているとは思いますが、やっぱり怖いですよね。 僕はこれを見て急いで全て8文字以上に変えました。

表を見る限り、最低でも8文字以上の英数字(大文字小文字区別あり)位にしとけば解析されるのに大体50年かかるみたいなので、今後のパスワード設定の基準にしてみてください。 もちろんどんなに強力なパスワードでも使いまわしは危険なのでそこも注意してください。

ランダムパスワード生成サービスなんてものもあります。

パスワード自動生成 (Automated Password Generator)

【Apex】取引開始をまとめて行う方法

Apexを使用して、リードから取引先責任者への移行(取引開始)をまとめて行うクラスのサンプルを作ってみました。

ただfor文の中でSOQL使用していたりするので、ガバナ制限には気を付けなければいけません。そこは注意してください。

// 取引開始メソッド
public void Convert(){

    // リード状況の「取引開始済み」に該当する値を取得(MasterLabel)
    LeadStatus convertStatus = [SELECT
                                    Id, MasterLabel
                                FROM
                                    LeadStatus
                                WHERE
                                    IsConverted = true
                                LIMIT
                                    1
                                ];

    // 取引開始していないリードを取得
    Lead[] leads = [SELECT
                        Id
                    FROM
                        Lead
                    WHERE
                        Status != :convertStatus.MasterLabel
                    ];

    // 取得したリードの数だけ取引開始を行う
    for(Lead lead : leads){
        Database.LeadConvert lc = new Database.LeadConvert(); //取引開始済みリードオブジェクトをNew

        Account account = [SELECT
                                Id
                            FROM
                                Account
                            WHERE
                                Name = :lead.Company
                            LIMIT
                                1
                            ];

        try{
            lc.setLeadId(lead.Id);
            lc.setConvertedStatus(convertStatus.MasterLabel);

            // 取引先に同じ会社名がある場合は既存のレコードを使用
            // 新しい取引先は作らない
            if(account != null){
                lc.setAccountId(account.Id);
            }

            lc.setDoNotCreateOpportunity(True); // 商談オブジェクトを作成しない
            Database.LeadConvertResult lcr = Database.convertLead(lc); // 取引開始
        }catch(DmlException e){
            System.debug('エラー:' + e);
        }

    }

}

参考

Web To リード(ケース)でレコードタイプを指定する

Web To リード(ケース)で生成したフォームからレコードタイプも同時に指定したいな、と思って調べたのでメモ。

Web to リード(ケース)で生成したHTMLに下記のコードを入れてやると指定できます。

フォームの生成方法は過去記事を参照。特にSandBox環境の人は読んでおいてください。

Value値にはレコードタイプのIDを入力。

  <input type="hidden" id="recordType" name="recordType" value="***************">

レコードタイプのID

レコードタイプのIDを知る方法を書いていきます。 とはいってもApexでどうこうする必要もなく、簡単にわかります。

まず下記のページに移動します。

  • 標準オブジェクト

設定 > カスタマイズ > 任意のオブジェクト(キャンペーン等) >レコードタイプ

  • カスタムオブジェクト

設定 > 作成 > オブジェクト >レコードタイプ

IDを知りたいレコードタイプをクリックして、個別ページに遷移。

そのページのURLにid=***************という形式で、15桁の英数字が並んでいる部分があります。それがIDです。(オブジェクトのレコード等と一緒ですね)

これを先ほどのコードに代入すれば、送信時にレコードタイプが入ります。

サンプルコード

最後にサンプルコードを書きます。

<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8">

<form action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST">

  <input type=hidden name="oid" value="xxxxxxxxxxxxxxx">

  <!-- 送信後に遷移するページ -->
  <input type=hidden name="retURL" value="http://www.yahoo.co.jp/">

  <!-- レコードタイプのIDを指定 -->
  <input type="hidden" id="recordType" name="recordType" value="***************">

  <label for="name">名前</label>
  <input id="name" maxlength="80" name="name" size="20" type="text" />
  <br>

  <input type="submit" name="submit">

</form>

参考

How can I pass a record type through a Web to X form?

データ型「複数選択リスト」をWeb To リード(ケース)のフォームでチェックボックス表示

Salesforceにおいて、オブジェクトの項目タイプに複数選択リストというのがありますが、これをHTML上でチェックボックスで表現したい場合のメモ。

事前準備

Web ToリードのHTML生成方法は過去記事をチェックしてください。

複数選択リスト

Web To リードでHTMLを生成すると下記の様になります。

<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8">

<form action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST">

  <input type=hidden name="oid" value="xxxxxxxxxxxxxxx">
  <input type=hidden name="retURL" value="http://">

  <p>
    <label for="yyyyyyyyyyyyyyy">希望曜日:</label>
    <select id="yyyyyyyyyyyyyyy" multiple="multiple" name="yyyyyyyyyyyyyyy" title="2_参加可能曜日・時間">
      <option value="月曜">月曜</option>
      <option value="火曜">火曜</option>
      <option value="水曜">水曜</option>
      <option value="木曜">木曜</option>
      <option value="金曜">金曜</option>
      <option value="土曜">土曜</option>
      <option value="日曜">日曜</option>
    </select>
  </p>
  <p>
    <input type="submit" name="submit">
  </p>
</form>

見た目はこんな感じ。いけてないですね。 f:id:Labyrinth_of_Wisdom:20160518163334p:plain

チェックボックス

先ほどのコードを下記の様に変更していきます。

<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8">

<form action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST">

  <input type=hidden name="oid" value="xxxxxxxxxxxxxxx">
  <input type=hidden name="retURL" value="http://">

希望曜日:
  <p>
    <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="月曜">月曜
    <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="火曜">火曜
    <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="水曜">水曜
    <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="水曜">木曜
    <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="木曜">金曜
    <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="金曜">土曜
    <input type="checkbox" id="yyyyyyyyyyyyyyy" name="yyyyyyyyyyyyyyy" value="土曜">日曜
  </p>
  <p>
    <input type="submit" name="submit">
  </p>

</form>

するとチェックボックスに変わっています。すっきりしましたね。

データもちゃんと反映されると思います。 f:id:Labyrinth_of_Wisdom:20160518163438p:plain

まとめ

Salesforceの話というよりは、ほぼHTMLの話のような気もしますが、気にしない気にしない。

参考

HTMLタグ/フォームタグ/チェックボックスを作る - TAG index Webサイト

リストビューに「レコードを複数選択して削除するボタン」を追加する

はじめに

Salesforceのリストビュー画面で、選択した複数のレコードを削除するボタンのサンプルを書きます。

標準だと一つづつレコードを消していくか全部消すしかないので、これがあると便利です。

オブジェクトの種類でアクセスする場所が違うので気を付けてください。

  • 標準オブジェクトの場合

設定 > カスタマイズ > 任意のオブジェクト(キャンペーン等) > ボタン、リンク、およびアクション > 新規ボタンまたはリンク

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

設定 > 作成 > オブジェクト > 任意のオブジェクト > ボタン、リンク、およびアクション > 新規ボタンまたはリンク

カスタムボタン作成

それぞれの種類に適した場所にアクセス後、下記の設定を行います。

表示の種類 => リストボタン

動作 => JavaScriptを実行

内容のソース => OnClick JavaScript

そしてテキストフィールドに下記のサンプルコードを記入してください。

3行目の対象オブジェクトは状況に応じて 変更してください。

{!REQUIRESCRIPT("/soap/ajax/9.0/connection.js")}

// 対象のオブジェクトを指定する
var records = {!GETRECORDIDS( $ObjectType.Hogehoge__c )};

if (records[0] == null) {
    alert("削除対象にチェックがついていません。");
} else if(confirm(records.length + "個のレコードを削除しますがよろしいですか?")){
        sforce.connection.deleteIds(records);// ここで削除
        location.reload();// 削除成功後に画面をリロード
} else {
        alert("キャンセルされました。");
}

リストビューに表示

これだけだとリストビューにボタンが表示されないので、ボタンが表示されるように設定します。

  • 標準オブジェクトの場合

設定 > カスタマイズ > 任意のオブジェクト(キャンペーン等) > 検索レイアウト > ***リストビュー

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

設定 > 作成 > オブジェクト > 任意のオブジェクト > 検索レイアウト > ***リストビュー

こんな感じでボタンが追加される。

f:id:Labyrinth_of_Wisdom:20160517180129p:plain

参考

ワークフロー機能ざっくりまとめ

はじめに

Salesforceのワークフローは使いこなせればとても便利な機能です。 プログラミングもしなくてもレコードの値を自動で変えたり、アラートメールを送ったりできるので、色んな使用方法が考えられます。

ただ設定方法がいまいち分かりにくいと思ったので、今回自分なりにまとめてみました。

ワークフローの大まかな流れ

コードで示した方が流れが伝わりやすいと思って書いてみました。

If(評価条件 == True){
    If(ルール条件 == True){
        ワークフローアクション実行
    }
}

// もしくは

If(評価条件 == True && ルール条件 == True){
    ワークフローアクション実行
}

要は評価条件ルール条件の二段階のチェックを通れば、ワークフローアクションが実行されるって感じですかね。 こう考えると凄くすっきりしました。

そして条件とワークフローアクションにもそれぞれ種類があります。

各条件とワークフローアクションの種類

評価条件

対象オブジェクトのレコードへのアクセスが下記のどれか一つに当てはまる時に、ルール条件のチェックを行います。

f:id:Labyrinth_of_Wisdom:20160511142912p:plain

ルール条件

数式や条件を指定し、ワークフローアクションを行うかどうかのチェックを行います。

例: f:id:Labyrinth_of_Wisdom:20160511142501p:plain

ワークフローアクション

ワークフローアクションを行うタイミングは2つあり、自分で設定することが出来ます。

一つ目がルール条件がTrueだった時に即座に行われるルール適用時のアクション、二つ目がルール条件がTrueだった時に時間指定でアクションを実行する時間ベースのアクションです。

アクションの内容は、ルール適用時も時間ベースも共通で下記の5つ。

  • 新規ToDo
  • 新規メールアラート
  • 新規項目自動更新
  • 新規アウトバウンドメッセージ
  • 既存アクションの選択

時間ベースのアクション実行のタイミングを設定するにはタイムトリガを追加する必要があります。

例:

f:id:Labyrinth_of_Wisdom:20160511142548p:plain

f:id:Labyrinth_of_Wisdom:20160511142601p:plain

例まとめ

今回の例をまとめます。

・評価条件
  キャンペーンオブジェクトのレコードが新たに作成された時
  もしくは後記するルール条件を満たすように編集された時

・ルール条件
  キャンペーンオブジェクトの項目「状況」の値が「進行中」の時

・時間ベースのアクション
  評価条件とルール条件を満たした場合、
  レコードの終了日から一日後に、レコードの「状況」を「完了」に変更

ワークフローの確認

待機中のワークフローは設定 > 監視 > 時間ベースのワークフローにアクセスし、条件を指定して検索することが出来ます。 f:id:Labyrinth_of_Wisdom:20160517130700p:plain

終わりに

ワークフローの設定方法を自分なりに噛み砕いてまとめてみましたが、いかがだったでしょうか? Salesforceは多機能なので使いこなすのが難しいですが、頑張っていきたいと思います。