REST for the Traveling Salesman: Using Google Data on Salesforce.com

Lane LiaBraaten、Google デベロッパー プログラム
2007 年 11 月

はじめに

Salesforce.com と Google は、人気の高い「サービスとしてのソフトウェア」アプリケーションをホストしています。両組織は、デベロッパーがこれらのアプリケーションを支える大量のデータにアクセスできる API を提供しています。両方の API を組み合わせると、興味深いことが起こります。G Suite はエンタープライズ環境でますます使用されるようになり、Salesforce.com はカスタム ビジネス アプリケーションを構築するための広範なプラットフォームを構築しています。そのため、デベロッパー(つまり、あなたです)が Google と Salesforce.com の機能を組み合わせる機会はたくさんあります。

この記事では、Salesforce.com プラットフォームや Google Data プロトコルを使い始めたばかりの方でも、RESTful Google Data API を使用してエンタープライズ マッシュアップの構築を開始する方法について説明します。開発環境の設定、既存の Salesforce.com と Google のマッシュアップのインストール、独自のマッシュアップの作成について説明します。

Hello, Salesforce.com!

私のように Salesforce.com を初めて使用する場合は、まず Apex Developer Network(ADN)でデベロッパー アカウントに登録する必要があります。デベロッパー アカウントでは、フル機能の Salesforce.com アカウントに加えて、Apex wikiディスカッション ボードにアクセスできます。

次に、Eclipse 用 Apex Toolkit を取得します。このツールキットには、Java 1.5Eclipse 3.2.2 以降が必要です。Eclipse の操作に慣れている場合は、ツールキットのソフトウェア アップデート サイトは http://www.adnsandbox.com/eclipsetoolkit/10.0/ です。Eclipse プラグインに慣れていない場合や、インストール中に問題が発生した場合は、Apex Wiki に詳細なインストール手順が記載されています。

ツールキットをインストールすると、Eclipse のヘルプ システムに統合された Apex ヘルプ コンテンツにアクセスできます。Eclipse で、[Help] | [Help Contents] | [Apex Toolkit for Eclipse] に移動して、このコンテンツを表示します。ヘルプ リソースの 1 つであるクイック スタート チュートリアルでは、新しいプロジェクトを作成し、S-Control、クラス、トリガーを追加する方法を説明しています。Apex コードを扱ったことがない場合は、このチュートリアルに沿って Apex プロジェクトを作成してから、次に進んでください。

Google カレンダーに予定を書き出す

Ron Hess 氏は、Salesforce.com から Google カレンダーに予定を書き出すことができる Google Calendar Mash-up アプリケーションを作成しました。Ron は、マッシュアップの仕組みを説明する記事も書いています。後で作成方法を紹介する Google スプレッドシート アプリケーションは、Ron の Google カレンダー マッシュアップをモデルにしています。ロンさん、ありがとうございます。

Salesforce.com のパワーユーザーであれば、おそらく説明なしで Ron の Google カレンダー アプリケーションを統合して使用できるでしょう。最初は少し手助けが必要だったので、Ron のアプリを実際に動作させるために行った手順をご紹介します。

  1. アプリケーションをインストールします。
    • Google カレンダー マッシュアップ ページにアクセスし、[今すぐ入手] をクリックします。
    • ADN の認証情報を入力し、[続行] をクリックします。
    • 利用規約を読み、[続行] をクリックします。
    • [パッケージの内容を確認] ページで [次へ] をクリックします。
    • セキュリティ レベルを選択し、[次へ] をクリックします。
    • [インストール] をクリックします。
  2. Salesforce.com AJAX プロキシを構成する
    • [Administration Setup] メニューで、[Security Controls | Remote Site Settings] をクリックします。
    • [新規リモートサイト] をクリックします。
    • [Remote Site Name](リモート サイト名)に「Google」と入力し、[Remote Site URL](リモート サイト URL)に「https://www.google.com」と入力します。
    • [保存] をクリックします。
  3. [Google に追加] ボタンをイベントの詳細ページに追加します。
    • [App Setup] メニューで、[Customize | Activities | Event Page Layouts] をクリックします。
    • [Event Layout] 行の [Edit] をクリックします。
    • [Detail Page Buttons] 領域をダブルクリックします。
    • [Google に追加] をハイライト表示し、右矢印(>)をクリックしてボタンを追加します。
    • [OK] をクリックします。
    • [ページ レイアウトのプロパティ] ページで [保存] をクリックします。
  4. 予定を書き出す
    • 左上の [ホーム] をクリックして、カレンダーを表示します。
    • イベントがない場合は、[新しいイベント] をクリックして作成します。
    • イベントをクリックすると、[イベントの詳細] ページが表示されます。
    • [Google に追加] ボタンをクリックします。
    • JavaScript アラートで [OK] をクリックします。
    • 自分の Google ユーザー名とパスワードでログインします。
    • [アクセス権を付与] をクリックして、SalesForce アプリケーションに Google カレンダーへの書き込みアクセス権を付与します。
    • Google カレンダーで予定を表示する

Google スプレッドシート アプリケーションの構築

Salesforce.com のページをあちこちクリックするのに飽きて、コードを記述する準備ができたことでしょう。Eclipse を再度起動すると、作成した Apex プロジェクトに Ron の Google カレンダー アプリの S-Control が含まれていることがわかります。これは、Eclipse 用 Apex Toolkit が Salesforce.com と常に同期しているためです。

認証コントロールなど、Google カレンダー マッシュアップの機能の一部を再利用して、独自の Google データアプリを構築できます。このセクションの残りの部分では、Salesforce.com の連絡先を Google スプレッドシートにエクスポートするアプリを構築する方法について説明します。

簡単な S コントロールの公開

S-Control は、Salesforce.com でホストされ、ユーザーがアプリケーションにアクセスしたときにウェブブラウザで実行されるファイルです。S-Control には、HTML、CSS、JavaScript など、ウェブブラウザで表示または実行できるあらゆる種類のコンテンツを含めることができます。

Salesforce.com と Google のマッシュアップには多くの可動部分があるため、まず、JavaScript に深く関わる前に、すべての配管が正しいことを確認するために、簡単な S-Control を呼び出す [Export to Google] ボタンを連絡先リストページに追加しました。

Apex プロジェクトで、[S-Controls] フォルダを右クリックし、[Apex | New S-Control] を選択します。新しい S-Control に「export_contacts」というラベルと名前を付け、タイプを [カスタム HTML] のままにして、[完了] をクリックします。

新しい S-Control には、スケルトン HTML ファイルが含まれます。<head> に JavaScript をたくさん追加しますが、連絡先のエクスポート中にユーザーに表示するものを先に <body> に入力しておきましょう。次の HTML を S-Control の本文にコピーして、「待機中のドット」と Google スプレッドシートのロゴを表示します。

<div id="waiting" align="center" />
  <img src="/img/icon/home32.png" height="64" width="64" />
  <img src="/img/waiting_dots.gif" alt="Please wait..." title="Please wait..." height="25" width="196" />
  <img src="http://docs.google.com/images/doclist/logo_docs.gif" />
  <p><h3>Exporting contacts to Google Spreadsheets, please wait...</h3></p>

</div>

これで、S-Control を公開して、S-Control を呼び出すボタンを設定できます。

  1. Eclipse を使用して S-Control ファイルを公開します。
    • Apex プロジェクトを右クリックし、[Apex | Synchronize with Salesforce] を選択します。
    • ディレクトリ ツリーで新しい S-Control を見つけ、右クリックして [Override remote and publish to server] を選択します。
    • S-Control が見つからない場合は、Apex Toolkit によってすでにアップロードされている可能性がありますが、同期パースペクティブを使用して、最新のコードがサーバーで実行されていることを確認することをおすすめします。
  2. Salesforce.com の UI を使用して、この S-Control を呼び出すボタンを定義します。
    • [App Setup] メニューで、[Customize | Contacts | Buttons and Links] をクリックします。
    • [カスタム ボタンとリンク] セクションで [新規] をクリックします。
    • ラベルに「Export to Google」と入力し、名前は「Export_to_Google」のままにします。
    • 表示タイプとして [リストボタン] を選択します。
    • コンテンツ ソースとして [カスタム S-Control] を選択します。
    • [動作] で [Display in existing window with sidebar] を選択します。
    • [Custom S-Controls] メニューから [export_contacts] を選択します。
  3. ボタンを連絡先リストに追加します。
    • [App Setup] メニューで、[Customize | Contacts | Search Layouts] をクリックします。
    • [連絡先リスト ビュー] 行で [編集] をクリックします。
    • [Google にエクスポート] をハイライト表示し、右矢印(>)をクリックしてボタンを追加します。
    • [保存] をクリックします。
  4. お試しください。
    • [連絡先] タブをクリックします。
    • [ビュー] で [すべての連絡先] を選択し、[移動] をクリックします。
    • 新しく追加された [Google にエクスポート] ボタンをクリックします。
    • 「waiting_dots」が表示されますが、それ以外のことは起こりません。

Google スプレッドシートの操作

Google カレンダー マッシュアップのソースを見ると、gcal_snippet.scf ファイルに Google カレンダー サーバーの抽象化が含まれていることがわかります。Google スプレッドシートを操作するには、Google スプレッドシート サーバー用の同様のファイルを作成する必要があります。Salesforce.com AJAX プロキシの使用と Google AuthSub での認証を行う Ron Hess のコードを再利用し、Google カレンダーにイベントを書き込む関数を、Google スプレッドシートに情報を書き込む関数に置き換えました。このファイルの完全なソースは gspreadsheet_snippet.scf で確認できます。

次に、export_contacts.scf S-Control に JavaScript を追加して、Salesforce.com に連絡先情報をクエリし、Google スプレッドシートに書き込むようにしました。Salesforce.com からデータを取得するのは簡単です。クエリを構築し、データが返されたときに実行するコールバック関数を指定するだけです。次に例を示します。

  var query = 'Select FirstName, LastName, Phone From Contact';
  var queryResult = sforce.connection.query(query, queryCallback);

Salesforce.com から連絡先情報を取得したら、エクスポート先を決定する必要があります。RESTful Google Data プロトコルでは、各スプレッドシートは一意の URL で識別できます。メタフィード URL(http://spreadsheets.google.com/feeds/spreadsheets/private/full)をクエリすると、ユーザーのスプレッドシートのリスト(および関連する URL)を取得できます。次のメソッドは、これらのスプレッドシートを反復処理して、特定のタイトルのスプレッドシートを探します。正しいスプレッドシートが見つかると、まずワークシートのリストを取得し、最初のワークシートのセル フィード URL を返します。

function getCellFeedUrl() {
  var SPREADSHEET_TITLE = 'Salesforce.com Contacts';
  var WORKSHEET_REL = 'http://schemas.google.com/spreadsheets/2006#worksheetsfeed';
  var CELLSFEED_REL = 'http://schemas.google.com/spreadsheets/2006#cellsfeed';

  // Query to find the spreadheet called "Salesforce.com Contacts"
  var spreadsheets = g.getFeed('http://spreadsheets.google.com/feeds/spreadsheets/private/full');
  var entries = g.getEntryList(spreadsheets);
  for (var e in entries) {
    if (g.getTitle(entries[e]) == SPREADSHEET_TITLE) {
      var worksheetsFeedUrl = g.link(entries[e],WORKSHEET_REL);
      var worksheets = g.getFeed(worksheetsFeedUrl);
      var worksheetEntries = g.getEntryList(worksheets);
      return g.link(worksheetEntries[0], CELLSFEED_REL);
    }
  }
}

Google スプレッドシート データ API で使用可能なフィードの詳細については、リファレンス ガイドをご覧ください。

queryCallback 関数は getCellFeedUrl メソッドを使用して、セルの更新リクエストの送信に必要なセル フィード URL を見つけ、連絡先情報を 1 つずつセルに書き込みます。

function queryCallback(queryResult) {
  var cellFeedUrl = getCellFeedUrl();
  var contacts = queryResult.getArray('records');
  for (var i=0; i<contacts.length; i++) {
    g.updateCell(cellFeedUrl, i+1, 1, contacts[i].LastName + ", " + contacts[i].FirstName);
    g.updateCell(cellFeedUrl, i+1, 2, contacts[i].Phone);
  }
  
  jumpback(); // Return to the contacts page when your done
}

updateCell メソッドは、gspreadsheet_snippet.scf S-Control に存在します。このメソッドは、指定された行と列のセルの編集 URL を取得し、更新されたセルの Google Data 表現を含む HTTP PUT メッセージを送信します。

GoogleSpreadsheet.prototype.updateCell = function(cellsFeedUrl, row, column, content ) {
  var cellEntry = this.getFeed(cellsFeedUrl+'/R'+row+'C'+column);
  var cellEditUrl = this.link(cellEntry,'edit');

  var newCellEntry = "<atom:entry xmlns:atom='http://www.w3.org/2005/Atom'>" +
      "<atom:category scheme='http://schemas.google.com/spreadsheets/2006' " +
      "term='http://schemas.google.com/spreadsheets/2006#cell' />" +
      "<gs:cell xmlns:gs='http://schemas.google.com/spreadsheets/2006' " +
      "row='" + row + "' col='" + column + "' inputValue='" + content + "' />" +
      "</atom:entry>";

  this.putEntry(cellEditUrl, newCellEntry);
} 

Google スプレッドシート データ API を使用してセルを更新する方法について詳しくは、デベロッパー ガイドをご覧ください。

Google スプレッドシート データ API はサブドメイン https://spreadsheets.google.com を使用するため、上記のコードが機能する前に、Salesforce.com AJAX プロキシ サーバーを構成して https://spreadsheets.google.com を追加する必要があります。

また、Google ドキュメントにアクセスして、データを保持する新しいスプレッドシートを作成する必要があります。必ず [Salesforce.com Contacts] として保存してください。

これらの S-Control をアップロードすると、連絡先情報を Google スプレッドシートにエクスポートできるようになります。逆方向の場合はどうなりますか?Salesforce.com と Google Data API の新しい知識を活用して、Google スプレッドシートから Salesforce.com に連絡先情報をインポートするコードを記述することもできます。

まとめ

この記事では、Salesforce.com プラットフォームと Google Data API の概要を説明しました。これらの強力なシステムを活用するために作成できるアプリケーションについて、ぜひ考えてみてください。Google Data ファミリーの API は常に進化しており、アプリケーションで活用できる情報がますます増えています。また、Salesforce.com プラットフォームには、この記事で取り上げなかった便利なツールが多数用意されています。AppExchange で、次のエンタープライズ マッシュアップをお待ちしています。

よろしくお願いいたします。

リソース