non-programmers salesforce 小ネタブログ

Apexやvisualforceなどプログラミングの力を使わずにどこまでやれるか小ネタを投稿します。

IFTTTを使って外部サービスとsalesforceを連携する

IFTTTというサービスを今更知りました。簡単にいうとノンプログラミングでtwitterとかfacebookとかいろんなサービスを連携させる事ができるツールです。スマホGPSを使ってある場所に到着したらtwitterに投稿するとか、facebookにリンク投稿したらtwitterにも投稿するとか、いろんなことができます。

ifttt.com

 

このIFTTTはなんとsalesforceにも使えます。例によって日本語でのsalesforce連携に関する情報がほとんどなく、あったのは唯一これぐらい。

[salesforce][chatter] ChatterとIFTTTで外部サービス連携 – deferloader

というわけでもう少しノンプログラミングな人にもわかるように具体的に説明しようと思います。

 

準備について

1)salesforceにIFTTTのappexchangeをインストールします

Salesforce IFTTT - Salesforce Labs - AppExchange

appexchangeのインストール方法は色んな所に落ちているのでここでは省略します。とりあえずこれをインストールしないことには始まりません。

 

2)IFTTTのアカウントを取りましょう

これもあたりまえですね。IFTTTにアクセスしてsign upをクリックして、メールアドレスとパスワード登録してください。facebookのアカウントも使えるようです。

 

早速作ってみましょう。

1)Createを押します

名前をクリックすると、Createが出てきます。

f:id:non-prog-sf:20160402235709p:plain

 

2)thisをクリックします

Createを押すといきなりこんな画面が出てきます。thisというのはトリガーになるものです。具体的にはここが◯◯になると・・・、というアクション元のことですね。

f:id:non-prog-sf:20160402235923p:plain

 

3)トリガーにしたいアプリケーションやwebサービスを選びます

thisを押すとアイコンがいっぱい出てきます。androidの位置情報も連携できますし、メールとか、facebookとか、instagramとか、office365とかとにかくいろいろあります。海外のサービスなのでESPNとか、Spotifyとか、日本じゃあまり使えないものも。あとStockという株価情報もありますが、日本の東証などには一切対応していないのであしからず。ただ、天気予報は一部対応しているのでどうにか使えます。今回は天気予報をトリガーにしてsalesforceにレコードを作る、という連携をやってみます。

f:id:non-prog-sf:20160403000049p:plain

 

4)トリガー条件を選びます

サービスによって選べるものがことなります。今日の天気良予報は日本には対応していないみたいですが、なぜか明日の天気は大丈夫みたいです。Tomorrow's weather reportを選びます。

f:id:non-prog-sf:20160403000547p:plain

 

5)投稿時間を設定します

タイトルの通り投稿時間を決めます。これは日本時間で大丈夫みたいです。キャプチャにはありませんが、地域も選べます。

f:id:non-prog-sf:20160403000748p:plain

6)thatを押します

thatを押して、受け側を選びます。

f:id:non-prog-sf:20160403000958p:plain

 

7)salesforceを選びます

salesforceを受け側で選ぶことができます。

f:id:non-prog-sf:20160403001101p:plain

 

8)Insert a Recordを選びます

できることは4種類、chatter投稿、chatterにファイル投稿、chatterにリンク投稿、そしてレコードを作るです。今回はなぜか全然Webに情報がないInsert a Recordについて説明します。

f:id:non-prog-sf:20160403001145p:plain

9)salesforceアカウントと連携させます

キャプチャ取れなかったのですが、salesforceアカウントと連携させる場面が出てきます。log inボタンを押してsalesforceのIDとPASSを入れてください。これをする前にappexchageは入れておいてくださいね。

 

10)SObjectを選ぶ

SObjectという(ノンプログラマーには)聞き慣れない言葉が出てきますが、なんてことはありません。オブジェクトのことです。標準オブジェクトなり、カスタムオブジェクトなりを選んでください。

f:id:non-prog-sf:20160403001625p:plain

今回は天気というカスタムオブジェクトを作りました。情報は日付と天候をテキスト項目で、最高気温を数値項目で作っています。日付がテキスト項目なのは、April 03,2016という値で投稿してくるので、salesforce標準の日付項目では形式が合わずにエラーになってしまうのです。

f:id:non-prog-sf:20160403001954p:plain

 

11)項目連携をします

プロセスビルダーみたいに項目と値を決めていきます。Field Nameはsalesforce側のAPI参照名、Field Valueはweather側の値を設定します。weather側の値はフラスコマークをクリックすると選べます。最後にCreate Actionボタンを押せば完了です。

f:id:non-prog-sf:20160403002128p:plain

 

12)ちゃんと動くかチェックしましょう

Check nowを押してチェックします。キャプチャを取れなかったのですが、緑色になればOK、赤はNGなので、なにがおかしいかチェックしてください。

f:id:non-prog-sf:20160403002354p:plain

 

 結果、こんな風に投稿されます。

f:id:non-prog-sf:20160403002547p:plain

 

わーい、できたできた。

日本のサービスとの連携が弱いので(Lineとか)どう使っていいのかわからないところもあるのですが、普通はAPIとか使ってプログラムしないといけないような、salesforceと外部サービスの連携が意外と簡単にできてしまうのです。これを使って何か面白いことができないか考えてみたいですね。

 

 

 

プロセスビルダーでISCHANGED(「%項目」)を使わないでください

ご無沙汰してます。

ほぼ毎日のようにフローとプロセスビルダーを駆使していてかなりレベルは上がっているのですが、ブログに反映していませんでした。これからは貯めこんだネタというか備忘録代わりにかけていけたらと思います。

 

今日はライトにプロセスビルダーの起動条件について。

プロセスビルダーで条件分岐をする際に数式でISCHANGED関数を使うことはよくあると思います。◯◯が更新されたらこのアクションをする、というような。ここで項目を指定しますが、なぜかパーセント項目を指定すると、該当項目を更新しなくてもなぜか必ず起動してしまいます。そこがわからなくて、どうしても動いてしまうプロセスビルダーに対して数日間本当に苦労しました。

 

これはどうもプロセスビルダーのバグということで間違いないように思います。海外でも投稿がありました。

ISCHANGED(PercentType_Field__c) always returns true in Process Builder - Salesforce Developer Community

 

解決方法は上記リンクに記載されていましたが、パーセント項目の変化には数式を使わずに、条件を満たしているを使います。そして該当項目を選んだあとに「更新済み」で「true」を選ぶと解決します。演算子に「更新済み」なんてあるのを知らなかった・・・。

 

こんなシンプルな解決法ですが、ISCHANGED関数がパーセント項目に使えないのは本当にどうにかしてもらいたいものです。

【salesforce】親取引先とか商談の確度(%)とかを消す方法

取引先の画面にある、親取引先。これレイアウトの編集から削除することができないのです。キャプチャでも-マークが出てこないです。他にも商談のフェーズに紐づく%とか幾つかあります。

f:id:non-prog-sf:20150823013708p:plain

 

これを消す方法は大変簡単でした。

消したい項目の項目レベルセキュリティの設定ボタンを押します。

f:id:non-prog-sf:20150823013959p:plain

参照可能のチェックを外すだけです。

f:id:non-prog-sf:20150823014031p:plain

はい、消えました。ページレイアウトでは項目が残っていますが、ここでは消えます。

f:id:non-prog-sf:20150823014055p:plain

いや、項目レベルセキュリティで触れないようにすることはたしかに知っていたのですが、親取引先とかいらない項目を消すのにも使えるのに気づいていませんでした。完全に盲点でした。

 

今日は簡単ですがこれで。

 

プロセスビルダーとフローは毎週のように新しいものを作っているのですが、説明が大変難しい物はどうやってまとめたらいいのか、大変困っています。何か新作をお見せできたらいいですね。

プロセスビルダーで参照関係の子オブジェクトのレコードを一括変更する方法

久しぶりの更新になってしまいました。今日はライトに。

 

プロセスビルダーで参照関係のオブジェクトを更新することができますが、子オブジェクトの更新の仕方の設定がよくわからないという話をよく聞きます。これは、salesforceのセミナーなどで、取引先の住所が更新されると取引先責任者の住所もすべて置き換えられる、というテーマで行われていたりと割とメジャーなのですが、カスタムオブジェクトまで話が行かないケースも多いので、改めてまとめます。

 

例えば取引先と参照関係になっているカスタムオブジェクトがあって、そのレコードの項目を一括変更したいという要件です。プロセスビルダーの使い方は省略させていただきますが、肝心なところはここです。アクション種別でレコード更新を選択し、レコードタイプを選ぶ欄が出てくるのですが、これがややこしい。実際は更新したい連携関係にあるオブジェクトを選ぶのです。

f:id:non-prog-sf:20150801222322p:plain

 

しかし、選択欄にオブジェクト名は出てきません。実は参照関係のレコードがここで見えています。

f:id:non-prog-sf:20150801222803p:plain

実はこれです。子オブジェクト側で取引先と参照関係を作るときに子リレーション名を決めますが、これがプロセスビルダーで設定するときに影響するのです。そのため、上の画像ではaccountKz9Y__rとなっているのが、更新したい参照関係のオブジェクトとなります。これを選択します。

f:id:non-prog-sf:20150801223011p:plain

ここでオブジェクトの選択が完了すると、あとは子オブジェクトの条件に応じてどの項目を更新するかを決めることができます。すべて更新だけでなく、該当する一部のレコードだけ更新することもできるんですね。

f:id:non-prog-sf:20150801223406p:plain

 

 

 

とりあえずtwitterのアカウントを作りました。

twitter.com

 

【salesforce】プロセスビルダーで枝番をつける方法

商談における見積、見積における明細など、何でもいいのですが、1対多のリレーションを持つオブジェクトの多の方に枝番をつけるというのはよくある話です。1-1、1-2、1-3みたいな。salesforceが出しているforce.com workbookの中にもapex初学者向けの例題として出てきます。

JP:Force.com workbook - developer.force.com

 

この説明ではよくわからなかったので、ノンプログラミングで解決してみたいと思います。

 

まず要件を整理します。

  • あるオブジェクト(今回は商談でやります)と参照関係にあるオブジェクト(商談参照関係という名前のカスタムオブジェクト)がひとつ作られるたびにカスタム項目「枝番」に番号が入る。
  • 枝番は参照関係のオブジェクトが増えていくごとに1ずつ増加する。
  • 参照関係のオブジェクトの枝番の途中が削除された場合は欠番となり、その後に作られたオブジェクトが埋めることがない。

ざっくりこんなかんじでしょうか。

さて作ってみましょう。実は今回はプロセスビルダーのみで、フローは使いません。

 

まず、親オブジェクトである商談に数値のカスタム項目を作ります。とりあえず名前は枝番最大値とでもしておきます。注意点としてデフォルト値は0にしておいてください。これは裏側で枝番最大値を保有しておくためだけの項目なので、画面に表示させる必要はありません。

f:id:non-prog-sf:20150703232136p:plain

 

そして当然子オブジェクト(商談参照関係)には枝番を入れる数値形式のカスタム項目を用意します。

f:id:non-prog-sf:20150703232345p:plain

そしてプロセスビルダーです。作るのは大変シンプルです。

f:id:non-prog-sf:20150703232513p:plain

動作は子オブジェクトの作成のみです。更新は含めないでください。

f:id:non-prog-sf:20150703232607p:plain

実行は無条件に行います。

f:id:non-prog-sf:20150703232639p:plain

そしてルール適用時のアクションは2つです。順番が決まっているのでそのとおりに作ってください。

一つは枝番最大値の更新です。親オブジェクトの方の値を1つ増やします。ただ、全くまっさらでレコードを作ったことないオブジェクトに実装する場合は枝番最大値+1でいいのですが、途中からこれを始めた場合は枝番最大値はnullになっているのでif関数でnullだった場合は0に置き換えるという数式を入れなくてはなりません。

f:id:non-prog-sf:20150703234445p:plain

こんな数式ですね。nullだったら0、そうでなかったら最大値の数字をそのまま出して、+1をするというものです。

IF (ISNULL([opportunity_Lookup__c].Opportunity__c.branch_number_max__c), 0, [opportunity_Lookup__c].Opportunity__c.branch_number_max__c)  +1

f:id:non-prog-sf:20150703234821p:plain

次のアクションは子オブジェクトに枝番を割り当てます。割り当てるのは親オブジェクトは先ほど+1した枝番最大値です。

f:id:non-prog-sf:20150703235920p:plain

これだけで、オブジェクトがひとつ作られるたびに枝番がひとつずつ増えていきます。今までapex書かないと出来なかったのが、こんなに簡単にできるのが嬉しいですね。

 

 

【salesforce】一定時間経過するとレコードを追加する方法

開発者フォーラムにこんな投稿がありました。

https://developer.salesforce.com/forums?communityId=09aF00000004HT8IAM#!/feedtype=SINGLE_QUESTION_DETAIL&dc=Developer_Forums_JP&criteria=ALLQUESTIONS&id=906F0000000BNndIAG

一定期間が経過するとレコードを追加する といったことは可能でしょうか。

一定期間が経過するとレコードを追加する といったことは可能でしょうか。
取引先オブジェクトを作成後、~日経過した時点で、関連するレコードを追加するというものです。
上記だけならプロセスビルダーで可能ですが、
~日経過時点で取引先オブジェクトの項目を評価し、条件を満たしてなければ作成しないという
挙動を行おうとするとプロセスビルダーでは対処できず・・

なぜか投稿できないので、こちらに解決方法を書きます。

フローとプロセスビルダーで解決できます。

大まかな流れはこんな感じ。

1.取引先レコードが作られるとプロセスビルダーがフローを動かす。

2.フローが◯日間待機する。

3.取引先先レコードの判定する項目を持ってくる。

4.項目を判定して、trueならレコードを作る。

 

作るフローはこんな流れ。

f:id:non-prog-sf:20150628170437p:plain

最初の待機はこんな感じ。

アラーム:絶対時刻、基準時刻:

システム変数とグローバル変数→SFlow→CurrentDateTime

オフセット数:◯日や◯時間など◯に当てはまる数字

オフセット単位:日や時間と日本語で入れるらしいです、多分。

f:id:non-prog-sf:20150628170523p:plain

次にレコードの検索です。取引先をIDで検索します。検索はAccount、項目はIDで、値は後ほど設定するプロセスビルダーで検索用のIDを渡す変数を新規作成します。そして、レコードの項目の割り当てについては、判定条件を抽出します。今回はテストとして、チェックボックス一つがtrueかどうかで判断することにしたので、その変数をまた割り当てます。

f:id:non-prog-sf:20150628173707p:plain

取引先IDの変数はこのように設定。IDなのでデータ型はテキスト、入力/出力種別は入力のみです。

f:id:non-prog-sf:20150628174316p:plain

判定する項目を持ってくる変数は今回こう作ります。基本的に項目とデータ型を一致させて、入力のみにします。基本的に名前の付け方はなんでもいいです。チェックボックスの場合はtrue or falseなのでBooleanを選びます。BooleanってJAVAなどでも出てくる単語ですね。(私はJAVAを殆ど知らないのですが)

f:id:non-prog-sf:20150628174402p:plain

 

次に決定についてですが、先ほどの変数が指定の値だった場合はyesの結果を返すようにリソースと値を決めます。今回はBoolean形式なのでグローバル定数でtrueを選びます。

f:id:non-prog-sf:20150628174858p:plain

そして最後にレコードの作成。今回は取引先と参照関係になっているオブジェクトにレコードを作ることにしました。この時作るレコードは参照関係があってもなくても関係ないです。なんでも作れます。あとは次の項目値を使用からは項目と値(変数)の割り当てを行ってください。変数に入れる値はプロセスビルダーを作るときに決めるので、今はとりあえず作ってください。

f:id:non-prog-sf:20150628222424p:plain

あとは最初の画像のように線を引いていってください。そして、待機の右上の緑矢印をクリックして、スタートにするのを忘れずに。名前をつけて保存して有効化してください。

 

次はプロセスビルダーの設定です。

f:id:non-prog-sf:20150628223948p:plain

作成からスタートして(今回は変更はいれませんでした)、作成したレコードはすべからくルール適用時のアクションを設定します。

 

f:id:non-prog-sf:20150628224126p:plain

フローを選択して、各変数に対して、どの項目の情報をいれるか値の設定を行っていきます。

f:id:non-prog-sf:20150628224142p:plain

これで完成です。とりあえず時間差で項目の判断をして作成を行っているので、うまく出来ていると思います。

【salesforce】ノンプログラミングで参照関係の積み上げ集計を行う方法

salesforceの連携しているオブジェクトのレコード数を数えたりする積み上げ集計ですが、本来使えるのは主従関係だけで、参照関係の場合ではこれまでapexを書かないと行けなかったのです。下のリンクはコミュニティで質問があって、それをapexでやる方法が書いてあります。

https://developer.salesforce.com/forums?communityId=09aF00000004HT8IAM#!/feedtype=SINGLE_QUESTION_SEARCH_RESULT&id=906F00000009BPXIA2

 

今回フローとプロセスビルダーを使えば実現できるようになります。参考にしたのはここのブログなのでこっちを読んでいただいた方が早いです。 英語が苦手な方のために書いていこうと思います。

How To: Create Roll Up Summaries using Flow – Part 1

How To: Create Roll Up Summaries using Flow – Part 2

今回は取引先に参照関係のオブジェクトを作り、その数を数えようと思います。なので積み上げ集計でいうと、件数を数えるイメージです。

 

フローを作ります。完成図はこれ。

f:id:non-prog-sf:20150624135909p:plain

まず高速検索を設定します。検索は参照関係のオブジェクトを選択し、項目には参照元のカスタム項目を、値には変数を設定します。あとで説明しますが、この変数には取引先IDを割り当てます。

f:id:non-prog-sf:20150624140024p:plain

変数は適当な名前をつけて、データ型はテキスト、入力出力種別はなんでもいいと思うのですが、とりあえず、入力/出力にしておきます。

f:id:non-prog-sf:20150624140222p:plain

高速検索に話は戻って、必須の変数という項目があります。ここではSオブジェクトコレクション変数というものを新規作成します。

f:id:non-prog-sf:20150624140442p:plain

作成ルールは以下の画像のとおりです。入力出力種別は非公開にします。理由はちょっとわからないです。オブジェクト種別は参照関係のオブジェクトを選びます。

f:id:non-prog-sf:20150624140520p:plain

変数に保存するレコードの項目を指定します。というところで項目を選択します。合算を行う場合は、数字が入っているところを選びます。

f:id:non-prog-sf:20150624140948p:plain

次にループを設定します。ループ対象は先ほど作ったSオブジェクトコレクション変数を入れます。ループ変数は新しくSオブジェクト変数を作ります。

f:id:non-prog-sf:20150624141047p:plain

Sオブジェクト変数は以下のとおりに作ります。入力出力種別は非公開、オブジェクト種別は参照関係のオブジェクトですね。

f:id:non-prog-sf:20150624141302p:plain

次に割り当てを設定します。変数は新しく作ります。数を数える場合は演算子は追加で1とします。合計値を出す場合は値のところにSオブジェクト変数を入れます。

f:id:non-prog-sf:20150624141646p:plain

割り当てで作る変数は画像のとおりです。データ型は数値(金額の合計の場合は通貨)、スケール(小数点のことのようです)は適当、入力/出力種別は非公開、デフォルト値は0とします。このデフォルト値に0を入れないときちんと動かないケースがあるので気をつけてください。

f:id:non-prog-sf:20150624160530p:plain

最後の設定としてレコードの更新をします。更新には、積み上げ集計の結果を入れたいオブジェクトを選びます。検索条件としてはIdで、高速検索の時に使った変数(今回の場合取引先IDが入っている)を選びます。変数〜更新しますのところには、積み上げ集計した結果を入れたい項目を、値には先ほどの割り当てで使った変数を入れます。当然ですが、この項目と変数のデータ型が一致している必要があります。

f:id:non-prog-sf:20150624160752p:plain

最後に各設定を矢印で結びます。菱型から対象の設定までドラッグすると矢印が引けます。そして、特に注意する必要があるのがループと割り当てです。これは双方向で矢印を繋ぐ必要があります。これが一方向だとフローが動きません。

f:id:non-prog-sf:20150624135909p:plain

またループから割り当ての矢印を結ぶときに選択が出るのですが、「コレクションの各値」を選んでください。ループ→レコードの更新は「処理する値がなくなった場合」です。

f:id:non-prog-sf:20150624161412p:plain

最後に高速検索の右上の緑矢印をクリックして、これを開始の処理と決定して保存します。種別では自動起動フローを選んでください。また最後に有効化するのを忘れないで下さい。

f:id:non-prog-sf:20150624161555p:plain

 

次にプロセスビルダーの設定です。構造はこれです。

f:id:non-prog-sf:20150624161929p:plain

起動条件は参照関係オブジェクトが作成・編集された場合。

f:id:non-prog-sf:20150624162032p:plain

実行条件は設定しません。すべからくアクションを実行します。

f:id:non-prog-sf:20150624162105p:plain

ルール適用時のアクション種別はフローです。先ほど作ったフローを選びます。フローを有効化しておかないと、ここに表示されません。そしてフロー変数は前半で言いましたが高速検索の時につかった変数に、取引先IDを割り当てます。

f:id:non-prog-sf:20150624162239p:plain

変数に値を割り当てる時には参照関係オブジェクトの項目の中から選ぶのですが、参照項目はAPI参照名で表示されているので、それを選択します。今回の場合はaccount__cです。

f:id:non-prog-sf:20150624162505p:plain

あとは保存して有効化するとOKです。

 

ただし、ここまででは作成・編集には対応するのですが、削除には対応しません。故に削除までカバーする場合は、How To: Create Roll Up Summaries using Flow – Part 2に従って設定する必要があります。

 フローをもう一つ作ります。

f:id:non-prog-sf:20150624163856p:plain

最初は画面です。でも、この画面は作るだけで中身は一切いじりません。

f:id:non-prog-sf:20150624164000p:plain

次にレコードの削除です。削除対象は参照関係オブジェクト、項目はIdで変数を一つ用意します。

f:id:non-prog-sf:20150624164031p:plain

変数は、IDなのでテキスト型、入力/出力種別は入力のみでOKです。

f:id:non-prog-sf:20150624164140p:plain

そして、パレットのフローから先ほど作った参照関係オブジェクトの積み上げ集計を行うフローを持ってきます。入力/出力変数割り当てで入力と出力をそれぞれ入れるのですが、どちらも対象は取引先IDで、ソースは新しく用意した変数(入力・出力で同じものを使う)を割り当てます。

f:id:non-prog-sf:20150624164336p:plain

変数はデータ型はテキスト型、入力/出力種別は入力のみです。

f:id:non-prog-sf:20150624164813p:plain

あとは矢印でつないで、画面をスタートとして保存します。もちろん有効化を忘れないこと。

次に設定画面に戻って開発者コンソールを起動します。名前をクリックすると、開発者コンソールが表示されます。

f:id:non-prog-sf:20150624165142p:plain

File→New→Visualforce Pageをクリックします。

f:id:non-prog-sf:20150624165313p:plain

そこに以下のコードを貼り付けます。

<apex:page standardController="account_relationships__c">
<flow:interview name="deletelookup"
finishLocation="/{!account_relationships__c.account__c}">
<apex:param name="varAccountId" value="{!account_relationships__c.account__c}"/>
<apex:param name="varLookupId" value="{!account_relationships__c.Id}"/> </flow:interview> </apex:page>

色をつけたところを置き換えてください。

緑色(1行目):参照関係オブジェクトのAPI参照名

紫色(2行目):削除のために作ったフロー名

赤色(3行目):削除後にどこのページに遷移したいかを選びます。今回の場合は、参照関係オブジェクトがつながっている取引先ページに戻るようにします。

青色(4、5行目):削除のフローで使っている変数を入れます。

赤色(4、5行目):変数に入れる項目をAPI参照名で記入します。

これをsaveします。

f:id:non-prog-sf:20150624165229p:plain

 次に今作ったvisualforceを削除リンク(ボタン)に割り当てます。設定→作成→オブジェクト→参照関係オブジェクトをクリックします。ボタン、リンク、およびアクションにある表示ラベル「削除」の編集をクリックします。

上書き手段でVisualforceページを選択し、今作ったvisualforceページを選び保存します。

f:id:non-prog-sf:20150624170906p:plain

 

以上で、全て完了です。参照関係オブジェクトを作っても削除しても正しく数を数えてくれます。設定に手間はかかりますが、(一部プログラムが入ってしまいましたが)ノンプログラミングで目的を達成できます。