CData Software Blog

クラウド連携のCData Software の技術ブログです。

ArcESB : Salesforceのスケジュール情報をGaroonに同期する

こんにちは、CData Software Japanエンジニアの浦邊です。 今回はArcESBを使ってSalesfroceのスケジュール情報をGaroonに同期する方法を紹介します。

1. シナリオ

今回実現するシナリオは、Salesforceのスケジュール情報のGaroonへの同期です。 ArcESBを使ってSalesforceからスケジュールデータを取り出し、それをGaroonへ登録します。

f:id:urabe_shintaro:20211207204813p:plain

1.1 ユーザ

スケジュールのユーザ情報を同期するために、SalesforceとGaroonとでそれぞれ同じユーザ名を持つユーザアカウントが存在している必要があります。 今回はテスト用にユーザ「テスト1」を作成しました。 当該ユーザは「test1@cdatatest.com」というユーザ名を持ちます。 これはSalesforceでは[ユーザ名]、Garoonでは[ログイン名]として参照されます。

f:id:urabe_shintaro:20211207203424p:plain

1.2 テストデータ

Salesforceのテストデータを以下に示します。 今回は1件の終日イベントを含む3件のイベントを対象とします。 取得する項目はイベントのタイトル開始時刻終了時刻終日フラグユーザの5つとします。

f:id:urabe_shintaro:20211207185712p:plain

同期後のGaroonのスケジュール画面を以下に示します。 Salesforceに格納されていた3件のデータが同期されています。

f:id:urabe_shintaro:20211207185725p:plain

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つのコネクタを使ってフローを作成します。

f:id:urabe_shintaro:20211207185736p:plain

2.1 接続の設定

はじめにSalesforceとGaroonのコネクタでサービスに接続する設定を行います。

Salesforce

Salesforceの接続方法は大きく分けて二つあります。 一つはBasic認証で、ユーザ名、パスワード、セキュリティトークンの3つの情報を使って接続します。 もう一つはOAuth認証で、接続時にブラウザでログインして認証します。

今回はBasic認証を使います。 [Auth Scheme][basic]を選択し、[User], [Password], [Security Token]をそれぞれ設定します。 設定が完了したら[接続テスト]をクリックして接続内容に間違いがないか確認してください。

f:id:urabe_shintaro:20211207185751p:plain

Garoon

Garoonの接続方法は主にパスワード認証とBasic認証の二つがあります。 パスワード認証ではURL、ユーザ名とパスワード、Basic認証ではさらにBasic認証のユーザ名とパスワードが必要です。 今回のテスト環境ではBasic認証が必要なため、[URL], [User], [Password], [Basic Auth User](Advancedタブ), [Basic Auth Password](Advancedタブ)をそれぞれ設定します。 こちらも設定が完了したら[接続テスト]をクリックして接続を確認してください。

f:id:urabe_shintaro:20211207185804p:plain

2.2 Salesforceからのスケジュールデータの取得

それではSalesforceからスケジュールデータを取得する設定を行います。 アウトプットマッピングにEventテーブルを追加してください。 カラムとしてチェックする項目は以下の通りです。

項目 カラム
タイトル Subject
開始時刻 StartDateTime
終了時刻 EndDateTime
終日フラグ IsAllDayEvent
ユーザ OwnerId

さらにユーザ名を取得するために、マッピング[追加]をクリックしてUserテーブルを追加します。 Userテーブルを選択したらUsernameカラムをチェックし、[フィルタ]を以下のように設定してください。

f:id:urabe_shintaro:20211207185832p:plain

この設定により、Eventテーブルの1レコードごとにOwnerIdをキーとしてUserテーブルをルックアップし、ユーザ名(Username)を取得します。

XMLプレビューを参照すると以下のようにスケジュールの各項目とユーザ名が取得できていることが分かります。

f:id:urabe_shintaro:20211207185845p:plain

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形式のデータが必要なことが分かります。

f:id:urabe_shintaro:20211207185859p:plain

2.4 マッピングの設定

最後にXMLMapコネクタでマッピングの設定を行います。 SalesforceのアウトプットマッピングとGaroonのインプットマッピングの設定が完了すると、以下のようにデフォルトのマッピングが設定されます。

f:id:urabe_shintaro:20211207185912p:plain

ここで手動の設定が必要なのは宛先(Garoon)の StartTimeZone, EndTimeZone, EventType, IsAllDay, Attendeesです。 あとはデフォルトのマッピングをそのまま適用します。

手動で行うマッピング内容を以下に示します。 設定方法の詳細を付録に記載しましたので、設定方法が分からない方は参考にしてください。

項目 設定内容 設定方法
StartTimeZone 固定値「Asia/Tokyo」を設定 設定方法
EndTimeZone 固定値「Asia/Tokyo」を設定 設定方法
EventType 固定値「REGULAR」を設定 設定方法
IsAllDay ソースのIsAllDayEventを設定 設定方法
Attendees スクリプト*を設定 設定方法

*Attendeesに設定するスクリプトの内容

\[{"code":"[xpath(User/Username)]","type":"USER"}\]

上記設定後のマッピング画面を以下に示します。

f:id:urabe_shintaro:20211207185928p:plain

これでマッピングの設定は完了です。

3. 結果の確認

最後にSalesforceコネクタの[受信]を実行し、GaroonにSalesforceのスケジュールデータが同期されることを確認してください。

付録. 手動マッピング方法

ここではXMLMapで手動マッピングする方法を説明します。

ソース項目の個別マッピング

IsAllDayにはSalesforceのEventテーブルのIsAllDayEventをマッピングします。 これは[ソース]のIsAllDayEventを、[宛先]のIsAllDayにドラッグすれば設定できます。

f:id:urabe_shintaro:20211207185946p:plain

固定値の設定

StartTimeZone, EndTimeZone, EventTypeには固定値を指定します。 ここではEventTypeに固定値「REGULAR」を設定する例を示します。

EventTypeにマウスカーソルを重ねるとアイコンが表示されますので、一番左の[式]をクリックします。

f:id:urabe_shintaro:20211207185956p:plain

以下のように[式エディタ]が表示されますので、シングルクウォートで固定値を囲んで入力し、[変更を保存]をクリックします。

f:id:urabe_shintaro:20211207190007p:plain

これで固定値が設定されます。

f:id:urabe_shintaro:20211207190016p:plain

カスタムスクリプトの設定

AttendeesにはSalesforceから取得したユーザ名を含んだ、以下のJSON形式で文字列を設定します。

[
 {
    "code" : <ユーザ名>,
    "type" : "USER"
 }
]

XMLMapコネクタでは、マッピングスクリプトの結果を設定することができます。 ユーザ名は受信メッセージに含まれていますので、これをスクリプトで取り出します。

ここで使用するスクリプトXPathフォーマッタです。 このフォーマッタは以下の形式で使用します。

xpath(<XMLパス>)

今回取得するユーザ名のXMLパスを確認します。 Salesforceコネクタで受信したメッセージのサンプルは以下の通りです。

f:id:urabe_shintaro:20211207190029p:plain

ユーザ名のXMLパスは/Items/Event/User/Username であることが分かります。

また、以下のようにXMLMapのAttendeesは /Items/Event のループの中にあります。

f:id:urabe_shintaro:20211207211223p:plain

そのため、Attendeesから参照したXMLパス(相対パス)は /User/Username となります。 これにより、Eventのユーザ名を取り出すスクリプトは以下の通りとなります。

xpath(User/Username)

前述のJSONのユーザ名にこのフォーマッタを連結すると以下のスクリプトが構成されます。

\[{"code":"[xpath(User/Username)]","type":"USER"}\]

このスクリプトを固定値と同じ方法で設定します。

f:id:urabe_shintaro:20211207190050p:plain