こんにちは、CData Software Japanエンジニアの浦邊です。 今回はArcESBを使ってSalesfroceのスケジュール情報をGaroonに同期する方法を紹介します。
1. シナリオ
今回実現するシナリオは、Salesforceのスケジュール情報のGaroonへの同期です。 ArcESBを使ってSalesforceからスケジュールデータを取り出し、それをGaroonへ登録します。
1.1 ユーザ
スケジュールのユーザ情報を同期するために、SalesforceとGaroonとでそれぞれ同じユーザ名を持つユーザアカウントが存在している必要があります。 今回はテスト用にユーザ「テスト1」を作成しました。 当該ユーザは「test1@cdatatest.com」というユーザ名を持ちます。 これはSalesforceでは[ユーザ名]、Garoonでは[ログイン名]として参照されます。
1.2 テストデータ
Salesforceのテストデータを以下に示します。 今回は1件の終日イベントを含む3件のイベントを対象とします。 取得する項目はイベントのタイトル、開始時刻、終了時刻、終日フラグ、ユーザの5つとします。
同期後のGaroonのスケジュール画面を以下に示します。 Salesforceに格納されていた3件のデータが同期されています。
1.3 同期する項目
SalesforceのスケジュールデータはEventテーブルで、GaroonはEventsテーブルでアクセスできます。 基本的にはSalesforceのEventテーブルからGaroonのEventsテーブルへ各項目をマッピングしますが、ユーザ情報だけはそのままマッピングできません。
理由は二つあります。一つはSalesforceのEventテーブルはユーザのID(SalesforceのレコードID)しか取得できないためです。 Garoonのユーザ名へ登録する値を取得するためには、EventテーブルのOwnerId(イベントのユーザID)からUserテーブルをルックアップする必要があります。 もう一つの理由はGaroonのEventsテーブルのユーザ情報がJSON形式で保持されるためです。 EventsテーブルのAttendeesカラムは以下の形式を要求します。
[ { "code" : <ユーザ名>, "type" : "USER" } ]
そのため、Salesforceから取得したユーザ名から上記JSON文字列を構成し、GaroonのAttendeesに渡す必要があります。
同期項目の一覧を以下に示します。
項目 | Salesforceのテーブルとカラム | Garoonのテーブルとカラム |
---|---|---|
タイトル | Event.Subject | Events.Subject |
開始時刻 | Event.StartDateTime | Events.StartDateTime |
終了時刻 | Event.EndDateTime | Events.EndDateTime |
終日フラグ | Event.IsAllDayEvent | Events.IsAllDay |
ユーザ | User.Username* | Events.Attendees |
*User.UsernameはEvent.OwnerIdを使ってルックアップ
2. フローの作成
今回は3つのコネクタを使ってフローを作成します。
2.1 接続の設定
はじめにSalesforceとGaroonのコネクタでサービスに接続する設定を行います。
Salesforce
Salesforceの接続方法は大きく分けて二つあります。 一つはBasic認証で、ユーザ名、パスワード、セキュリティトークンの3つの情報を使って接続します。 もう一つはOAuth認証で、接続時にブラウザでログインして認証します。
今回はBasic認証を使います。 [Auth Scheme]で[basic]を選択し、[User], [Password], [Security Token]をそれぞれ設定します。 設定が完了したら[接続テスト]をクリックして接続内容に間違いがないか確認してください。
Garoon
Garoonの接続方法は主にパスワード認証とBasic認証の二つがあります。 パスワード認証ではURL、ユーザ名とパスワード、Basic認証ではさらにBasic認証のユーザ名とパスワードが必要です。 今回のテスト環境ではBasic認証が必要なため、[URL], [User], [Password], [Basic Auth User](Advancedタブ), [Basic Auth Password](Advancedタブ)をそれぞれ設定します。 こちらも設定が完了したら[接続テスト]をクリックして接続を確認してください。
2.2 Salesforceからのスケジュールデータの取得
それではSalesforceからスケジュールデータを取得する設定を行います。 アウトプットマッピングにEventテーブルを追加してください。 カラムとしてチェックする項目は以下の通りです。
項目 | カラム |
---|---|
タイトル | Subject |
開始時刻 | StartDateTime |
終了時刻 | EndDateTime |
終日フラグ | IsAllDayEvent |
ユーザ | OwnerId |
さらにユーザ名を取得するために、マッピングの[追加]をクリックしてUserテーブルを追加します。 Userテーブルを選択したらUsernameカラムをチェックし、[フィルタ]を以下のように設定してください。
この設定により、Eventテーブルの1レコードごとにOwnerIdをキーとしてUserテーブルをルックアップし、ユーザ名(Username)を取得します。
XMLプレビューを参照すると以下のようにスケジュールの各項目とユーザ名が取得できていることが分かります。
2.3 Garoonへのスケジュールデータの登録
つづいてGaroonでスケジュールデータを登録する設定を行います。 インプットマッピングにEventsテーブルを追加してください。 カラムとしてチェックする項目は以下の通りです。
項目 | カラム |
---|---|
タイトル | Subject |
開始時刻 | StartDateTime |
終了時刻 | EndDateTime |
終日フラグ | IsAllDay |
ユーザ | Attendees |
開始時刻タイムゾーン | StartTimeZone |
終了時刻タイムゾーン | EndTimeZone |
イベントタイプ | EventType |
開始時刻タイムゾーン、終了時刻タイムゾーン、イベントタイプの3つの項目はEventsテーブルへデータを登録する際の必須項目です。 これらはSalesforceから取得できませんので、今回はそれぞれ以下の固定値を指定します。 (固定値の指定は次に説明するマッピングで行います。)
項目 | カラム | 固定値 |
---|---|---|
開始時刻タイムゾーン | StartTimeZone | Asia/Tokyo |
終了時刻タイムゾーン | EndTimeZone | Asia/Tokyo |
イベントタイプ | EventType | REGULAR |
設定が完了したらサンプルインプットを確認してください。 シナリオで述べた通りAttendeesにはJSON形式のデータが必要なことが分かります。
2.4 マッピングの設定
最後にXMLMapコネクタでマッピングの設定を行います。 SalesforceのアウトプットマッピングとGaroonのインプットマッピングの設定が完了すると、以下のようにデフォルトのマッピングが設定されます。
ここで手動の設定が必要なのは宛先(Garoon)の StartTimeZone, EndTimeZone, EventType, IsAllDay, Attendeesです。 あとはデフォルトのマッピングをそのまま適用します。
手動で行うマッピング内容を以下に示します。 設定方法の詳細を付録に記載しましたので、設定方法が分からない方は参考にしてください。
項目 | 設定内容 | 設定方法 |
---|---|---|
StartTimeZone | 固定値「Asia/Tokyo」を設定 | 設定方法 |
EndTimeZone | 固定値「Asia/Tokyo」を設定 | 設定方法 |
EventType | 固定値「REGULAR」を設定 | 設定方法 |
IsAllDay | ソースのIsAllDayEventを設定 | 設定方法 |
Attendees | スクリプト*を設定 | 設定方法 |
*Attendeesに設定するスクリプトの内容
\[{"code":"[xpath(User/Username)]","type":"USER"}\]
上記設定後のマッピング画面を以下に示します。
これでマッピングの設定は完了です。
3. 結果の確認
最後にSalesforceコネクタの[受信]を実行し、GaroonにSalesforceのスケジュールデータが同期されることを確認してください。
付録. 手動マッピング方法
ここではXMLMapで手動マッピングする方法を説明します。
ソース項目の個別マッピング
IsAllDayにはSalesforceのEventテーブルのIsAllDayEventをマッピングします。 これは[ソース]のIsAllDayEventを、[宛先]のIsAllDayにドラッグすれば設定できます。
固定値の設定
StartTimeZone, EndTimeZone, EventTypeには固定値を指定します。 ここではEventTypeに固定値「REGULAR」を設定する例を示します。
EventTypeにマウスカーソルを重ねるとアイコンが表示されますので、一番左の[式]をクリックします。
以下のように[式エディタ]が表示されますので、シングルクウォートで固定値を囲んで入力し、[変更を保存]をクリックします。
これで固定値が設定されます。
カスタムスクリプトの設定
AttendeesにはSalesforceから取得したユーザ名を含んだ、以下のJSON形式で文字列を設定します。
[ { "code" : <ユーザ名>, "type" : "USER" } ]
XMLMapコネクタでは、マッピングにスクリプトの結果を設定することができます。 ユーザ名は受信メッセージに含まれていますので、これをスクリプトで取り出します。
ここで使用するスクリプトはXPathフォーマッタです。 このフォーマッタは以下の形式で使用します。
xpath(<XMLパス>)
今回取得するユーザ名のXMLパスを確認します。 Salesforceコネクタで受信したメッセージのサンプルは以下の通りです。
ユーザ名のXMLパスは/Items/Event/User/Username であることが分かります。
また、以下のようにXMLMapのAttendeesは /Items/Event のループの中にあります。
そのため、Attendeesから参照したXMLパス(相対パス)は /User/Username となります。 これにより、Eventのユーザ名を取り出すスクリプトは以下の通りとなります。
xpath(User/Username)
前述のJSONのユーザ名にこのフォーマッタを連結すると以下のスクリプトが構成されます。
\[{"code":"[xpath(User/Username)]","type":"USER"}\]
このスクリプトを固定値と同じ方法で設定します。