Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Salesforce と SharePoint 間でカレンダーを同期する方法

More than 3 years have passed since last update.

このご時世、行動予定をクラウド上で管理するということはもう大分浸透していると思いますが、基本的な機能のため、様々な SaaS で実装されている機能でもあります。利用している複数の SaaS に行動予定やカレンダーのような機能が備わっているとしたら、それらを同期しなければなりません。

CDataドライバーを利用すれば、こういったデータ同期を行うアプリケーションの作成を行うことができます。

構成図.png

このアプリケーションの概要は次の通りです。

  • Visual Studio 2015 C# による Windowsフォームアプリケーション
  • GUIコンポーネントを駆使して可能な限りコーディングレスを目指す
  • Salesforce および SharePoint からデータを読み込む
  • インポートしたい行を選択して、Salesforce から SharePoint へデータをインポートする

それでは、このサンプルアプリケーションの開発手順を見ていきます。

ソースコード

このサンプルアプリケーションのソースコードはこちらからどうぞ。

※ソースコードについて補足
このソースコードでは接続情報をアプリケーションの設定に格納しています。
動作させる際は、アプリケーション設定のConnectionStringSalesforceにSalesforce用の接続文字列を、ConnectionStringSharePointにSharePoint用の接続文字列を設定してください。
それぞれの接続文字列は以下のようになります。
Salesforce → Password=<パスワード>;Security Token=<セキュリティトークン>;User=<ユーザ名>
SharePoint → Password=<パスワード>;Share Point Edition="SharePoint Online";URL=;User=<ユーザ名>

CData製品のインストール

まずは CData Software をインストールします。今回必要になるのは、次の2つです。

プロジェクト作成

Visual Studio を起動し、新しいWindowsフォームアプリケーションのプロジェクトを作成します。

プロジェクト作成.png

参照設定

インストールした CData Software の2製品には、いくつかのADO.NETアセンブリが含まれています。
今回必要になるのは次の2つのDLLですので、これらをプロジェクトの参照設定で追加します。

  • System.Data.CData.Salesforce.dll
  • System.Data.CData.SharePoint.dll

参照設定.png

データ接続を作成

Salesforce および SharePoint へのデータ接続を作成します。
以下のオンラインマニュアルを参考にして、2つのデータ接続を作成します。
Salesforce用
SharePoint用

データ接続.png

実装

フォームの作成

メインのフォームを追加します。
このフォームには、次のコンポーネントを追加します。

  • データを表示するためのデータグリッドビュー×2 (左がSalesforce、右がSharePoint と対応する)
  • インポートを実行するボタン

フォーム作成.png

データグリッドビューのデータソースを設定

追加したデータグリッドビューに、データソースの設定を行います。
左側のデータグリッドビューで「DataGridView タスク」→「データソースの選択」→「プロジェクト データソースの追加」を選択します。

DGVタスク.png

「データソースの種類の選択」では「データベース」を選択して「次へ」ボタンをクリックします。

データソースの種類.png

次の画面では「データセット」を選択して「次へ」ボタンをクリックします。

データベースモデルの選択.png

データ接続の選択では、データ接続を作成で作成したSalesforceのデータ接続を選択して「次へ」ボタンをクリックします。

データ接続の選択.png

次の画面で接続文字列をアプリケーションに保存するかどうか選択できますが、ここでは任意に選択し、「次へ」ボタンをクリックします。

最後にデータベースオブジェクトの選択を行います。
今回はSalesforceの「行動」を対象としますので、Eventのチェックボックスにチェックを入れます。
データセット名は SalesforceDataSet として、「完了」ボタンをクリックします。

データベースオブジェクトの選択.png

同じようにして、SharePoint側もデータソースの設定を行います。
SharePoint側は、作成済みのカレンダー(ここでは"Salesforce予定表")をデータベースオブジェクトとして選択します。

データベースオブジェクトの選択(SP).png

これで、データグリッドビューへのデータの読み込みまでが行えるようになりました。ここまで、全くコーディングは必要ありません。
メインフォームには、データ読み込みのためのコードが自動生成されています。

// TODO: このコード行はデータを 'sharePointDataSet.Salesforce予定表' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
this.salesforce予定表TableAdapter.Fill(this.sharePointDataSet.Salesforce予定表);
// TODO: このコード行はデータを 'salesforceDataSet.Event' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
this.eventTableAdapter.Fill(this.salesforceDataSet.Event);

※ワンポイント
SharePointのAPIの仕様で、デフォルトでは30日分のデータが取得されます。これをもっと広い期間にしたい場合は、SharePointDataSet.xsdデザイナーで開く → Salesforce予定表を右クリック → 「構成」から構成ウィザードを開く とSQLステートメントを入力できるので、次のようなWHERE句を指定します。

WHERE [開始時刻] >= '2015-10-01' AND [終了時刻] <= '2017-10-01'

インポート処理

フォームデザイナで「インポート」ボタンをダブルクリックして、クリック時の処理を実装します。
ここでは、件名が同じであれば同じデータであると判断します。

private void btImport_Click(object sender, EventArgs e)
{
    var sharePointMap = this.dgvDestination.Rows
        .Cast<DataGridViewRow>()
        .Select(o => (SharePointDataSet.Salesforce予定表Row)((DataRowView)o.DataBoundItem).Row)
        .ToDictionary(o => o.タイトル, o => o);


    var selectedList = this.dgvSource.Rows.Cast<DataGridViewRow>()
        .Where(o => o.Selected)
        .Select(o => (SalesforceDataSet.EventRow)((DataRowView)o.DataBoundItem).Row)
        .ToList();

    var dummyId = 0;

    foreach (var selected in selectedList)
    {
        if (sharePointMap.ContainsKey(selected.Subject))
        {
            continue;
        }

        var newRow = this.sharePointDataSet.Salesforce予定表.NewSalesforce予定表Row();

        newRow.ID = dummyId++;
        newRow.タイトル3 = selected.Subject;
        newRow.開始時刻 = selected.StartDateTime;
        newRow.終了時刻 = selected.EndDateTime;
        newRow.場所 = selected.IsLocationNull() ? "" : selected.Location;
        newRow.終日 = selected.IsAllDayEvent ? "1" : "0";
        newRow.説明 = selected.IsDescriptionNull() ? "" : selected.Description;

        this.sharePointDataSet.Salesforce予定表.AddSalesforce予定表Row(newRow);
    }

    this.salesforce予定表TableAdapter.Update(this.sharePointDataSet.Salesforce予定表);
    this.salesforce予定表TableAdapter.Fill(this.sharePointDataSet.Salesforce予定表);
}

実装は以上です。

実行

アプリケーションを起動すると、データグリッドビューにデータが読み込まれます。

アプリ起動後.png

移行したい行を選択して「インポート」ボタンをクリックすると、選択したデータが SharePoint に登録されます。

アプリインポート後.png

SP画面.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away