2013年12月13日

salesforce1 で「Micro-Moment」を活用するアプリを作ってみた


この記事はForce.com Advend Calender 2013 13日目エントリーとなります。
http://atnd.org/events/45110

はじめまして。greendiverと申します。

人生初のブログがまさかの開発話 & イベント参加となりました。
・・そして今日は13日の金曜日

いや〜、ついてますね(´∀`*)

というわけで、ジェイソンさんにも負けないよう書いていきます!


今年の9月に東京で実施された
Salesforce Developer Conference
で出てきた「Micro-Moment
という言葉がとても印象に残っています。

僕の認識に誤りがなければ

Micro-Moment = 移動や待ち時間などに費やされる断片的な時間


なのですが、そういった時間を有効に活用できれば

より業務効率のアップにつながるいうお話がありました。

そこで今回は社内の営業さんの要望のもと
「Micro-Moment」を活用するアプリを作ってみました。


1. どんなアプリか


   営業さんが取引先責任者のもとへ訪問した後、

   社内に戻っていわゆる「お礼メール」的なものを送るらしい。

   メールの文面は基本的にテンプレのようなものらしいが
   訪問先のお客様の数が多くなればなるほど、その作業も
   結構大変になる。

before_app

   そこで、その一連の作業を 
salesforce1 を使って
   スマホから簡単に済ませてしまおうというアプリ。

after_app



2. アプリ制作条件

  • 開発期間は11/28 ~ 12/1
  • salesforce1 で動作すること
  • モバイル端末(iPhone)で使えること
          ※ 諸事情により実は結構早い段階で作成していました。


3. まずは、実現に向けてやることを細分化


  取引先責任者にテンプレートメールを送信ということで
  以下の流れで操作することを想定

  1. 取引先責任者を選択
  2. メールのテンプレート選択
  3. 送信決定(スケジュールに登録?)
  4. 指定された時間にメールが送られる
取引先責任者の選択は salesforce1 標準の機能で十分可能。
そこからテンプレート選択 & 送信を実現するには

「オブジェクト専用アクション」

で対象の取引先責任者選択後
独自のVFページを表示するようにすればいけそう。

ただ、ここまで考えてそもそも
テンプレートを使ったメール送信がApexでできるのか気になったので
まずは、メール送信の処理について調査を実施。
(大事なところを抑えてなかった。。)


4. Apexで「メールテンプレート使ったメール送信」を実装してみる


  調べていくとテンプレートを用いたメール送信は
  「MassEmailMessage」クラスを利用すると可能なことがわかりました。
  簡単なコードは ↓ のような感じ

List<String> targetIds = new List<String>{
     '対象のオブジェクトのID'
};
String templateId = '使用するテンプレートのID';

Messaging.MassEmailMessage message = new Messaging.MassEmailMessage();
message.setTargetObjectIds(targetIds);
message.setTemplateId(templateId);
Messaging.sendEmail(new Messaging.MassEmailMessage[] {message });


  補足ですが、この時送られるメールの差出人情報は
  実行ユーザの情報 が使用されるようです。
  そのため、メール受信者から見ても
  違和感なく担当営業さんのメールを受信することが可能となります。
  また、差し込み項目についても対象者の情報に合わせて展開されるので
  {!Contact.Name} といった差し込み項目を本文に差し込んでおけば
  ばっちり展開されます。


5. スケジュール機能を使って指定した時間にメールを送る

  次に、スケジュール機能を使ってメールを送ることができるかを検証してみました。
  スケジュール機能はApexに慣れ親しんだ方なら
  よくご存じかと思うので省略させていただきますが、
  スケジュール処理内でメール送信が実行できるかは
  試したことがなかったので、ドキドキしましたが。。。

  結果は、、

特に問題なく実行可能!!

  ということで、 ↓ のような簡単なソースで実現できました。

global class FollowMailScheduler implements Schedulable {

  private List<String> targetIds;
  private String templateId;

  //コンストラクタ
  public FollowMailScheduler(List<String> targetIds ,String templateId ) {
    this.targetIds = targetIds;
    this.templateId = templateId;
  }

  //executeメソッド
  global void execute(SchedulableContext ctx) {
    //メールを送るだけ
    Messaging.MassEmailMessage message = new Messaging.MassEmailMessage();
    message.setTargetObjectIds(targetIds);
    message.setTemplateId(templateId);
    Messaging.sendEmail(new Messaging.MassEmailMessage[] {message });    
    //おなじみの後始末
    System.abortJob(ctx.getTriggerId());
  }

}


  ちなみにスケジュールの実行時にも
  スケジュールを登録したユーザの権限で実行されるため
  先述したメールの差出人情報はスケジュールを
  登録したユーザの情報が適用されました。

  これで、
  1. salesforce1 から メールテンプレートを選択して登録(スケジュール登録)
  2. 指定した時間にスケジュールが実行されてメールが送られる
  3. 受信したメールの差出人は担当営業さんの情報
   という流れが見えてきました!!!


6. カスタム設定をうまいこと使ってみる

  選択するテンプレートや配信時間については
  ソースコードべた書きでもよかったのですが、
  やはり最低限の拡張性を持たせたいので
  「カスタム設定」にその情報を持たせるようにしました。


customesetting
   こんな感じで作成。。

  設定種別は「階層」にしました。
  実は設定種別についてあまり理解していなかったのですが、
  これを機に公式の情報も確認してみることに。
  調べたところ


設定種別  — [リスト] または [階層] を選択します。[リスト] は、国コードや州の省略名など、アプリケーションレベルのデータを定義します。[階層] は、階層の下位レベルで上書き可能なデフォルトの項目値などのカスタマイズ設定を定義します。


  という情報が出てきました。う~む、なんとなく分かったような。。

  例を挙げると
  ユーザA , ユーザB  がいて
  「テスト」という項目をもったカスタム設定があるとする

  この状態でカスタム設定のレコードを2つ作成しそれぞれ

組織のデフォルト設定  テスト項目の値 = "hogehoge"
ユーザB用の設定        テスト項目の値 = "piyopiyo"

  とした場合、

ユーザA がテスト項目の値を取得すると 「hogehoge」が取得できるが
ユーザB がテスト項目の値を取得すると 「piyopiyo」が取得できる

  ということらしい。

  この仕組みを利用すれば
  営業さんごとに好みのテンプレートを設定して使う
  ということができそうです。


7. ひとまず完成

  今回調査したことを踏まえて
  Visualforceページの作成、拡張コントローラの作成、取引先責任者の
  パブリッシャーアクションに登録、、と進めていき、なんとか salesforce1 で動くアプリを
  作成することができました。

  以下、簡単にアプリ操作の流れです。

  【salesforce1 で取引先責任者を選択した状態】
action1

  【取引先責任者にアクションが追加されています】
action2


  【テンプレートを選択して送信する】
action3


  【完了画面(手抜き)】
action4


  【予約した場合、SF上ではこんな感じでスケジュール登録される】
action5



   このアプリのソースはgithubに登録したので興味のある方は
   アクセスしていただければと思います。
   (エラーハンドリングや完了画面が手抜きですが、、、、)

@nishimura-yuki SimpleFollow - github



あとがき


  「すごい技術」的な内容にはなりませんでしたが、
  salesforce1 を使ってまずはアプリを作ってみたかったので
  なんとか作成できてよかったです。
  初ブログでなかなか大変でしたが
  今後はもっと軽い感じでちょこちょこ書いていこうと思います。
  どうもありがとうございました!
 


greendiver at 00:00│Comments(0)

コメントする

名前
URL
 
  絵文字