1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Salesforce と SendGrid でコンタクトを同期する方法

Last updated at Posted at 2017-05-19

現代、Eメールはもはや業務にかかせないインフラの1つとなりました。Eメールはビジネスの場において必須のツールですが、そんなメール配信も今や SaaS の時代です。
メール配信サービスの1つに SendGrid があります。SendGrid を利用すれば、顧客や見込み客に一斉にメール送信を行うことができます。ですが、SendGrid はあくまでメール配信サービスであり、顧客の管理自体は別のシステムで行うことになります。そのため、顧客を管理しているシステムから SendGrid へデータを同期できると便利です。

ここでは、Salesforce で管理している取引先の情報をSendGrid に同期するサンプルアプリケーションを開発してみます。
CDataドライバーを利用すれば、こういったデータ同期を行うアプリケーションの作成を行うことができます。

構成図.png

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

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

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

ソースコード

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

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

CData製品のインストール

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

プロジェクト作成

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

参照設定

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

  • System.Data.CData.Salesforce.dll
  • System.Data.CData.SendGrid.dll

参照設定.png

データ接続を作成

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

データ接続.png

実装

フォームの作成

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

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

フォーム作成.png

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

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

DGVタスク.png

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

データソースの種類.png

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

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

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

データ接続の選択.png

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

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

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

同じようにして、SendGrid側もデータソースの設定を行います。
SendGrid側は、Recipientsをデータベースオブジェクトとして選択します。

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

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

// TODO: このコード行はデータを 'sendGridDataSet.Recipients' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
this.recipientsTableAdapter.Fill(this.sendGridDataSet.Recipients);
// TODO: このコード行はデータを 'salesforceDataSet.Contact' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
this.contactTableAdapter.Fill(this.salesforceDataSet.Contact);

インポート処理

フォームデザイナで「インポート」ボタンをダブルクリックして、クリック時の処理を実装します。

private void btImport_Click(object sender, EventArgs e)
{
    var sendGridMap = this.dgvDestination.Rows
        .Cast<DataGridViewRow>()
        .Select(o => (SendGridDataSet.RecipientsRow)((DataRowView)o.DataBoundItem).Row)
        .ToDictionary(o => o.Email, o => o);

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


    this.btImport.Enabled = false;

    Task.Factory.StartNew(() =>
    {
        var processed = 0;

        foreach (var selected in selectedList)
        {
            Invoke(new Action(() => this.Text = "処理中... (" + (processed + 1) + " / " + selectedList.Count + ")" ));

            if (sendGridMap.ContainsKey(selected.Email) || selected.IsEmailNull())
            {
                continue;
            }
            
            this.recipientsTableAdapter.Insert(
                DBNull.Value, DBNull.Value, DBNull.Value,
                selected.Email, selected.IsFirstNameNull() ? "" : selected.FirstName, selected.LastName,
                DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value);

            processed++;
        }
    })
    .ContinueWith(task =>
    {
        // エラー処理は省略

        Invoke(new Action(() =>
        {
            this.btImport.Enabled = true;
            this.Text = "完了";
        }));
    });
}

リロードのボタンの処理も実装しておきましょう。
リロードボタンの処理はたったこれだけです。

private void btReload_Click(object sender, EventArgs e)
{
   this.recipientsTableAdapter.Fill(this.sendGridDataSet.Recipients);
}

実装は以上です。

実行

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

アプリ起動後.png

移行したい行を選択して「インポート」ボタンをクリックすると、選択したデータが SendGrid に登録されます。
ただ、SendGridにデータが反映されるまで少し時間がかかるようです。少し待ってからリロードボタンでデータをリロードし、データが登録されたことを確認します。

アプリインポート後.png

インポート後SG画面.png

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?