REST for the Traveling Salesman:在 Salesforce.com 上使用 Google 資料

Google 開發人員計畫 Lane LiaBraaten
2007 年 11 月

簡介

Salesforce.com 和 Google 都是熱門的「軟體即服務」應用程式主機,兩家機構都提供 API,讓開發人員存取這些應用程式的大量資料儲存空間。當我們結合這兩組 API 時,有趣的事情就開始發生了。G Suite 在企業環境和 Salesforce.com 的使用率持續攀升,而 Salesforce.com 打造的平台可建構自訂商務應用程式,因此開發人員 (就是您!) 有許多機會結合 Google 和 Salesforce.com 的強大功能。

本文將說明如何使用 RESTful Google Data API 開始建構企業混搭應用程式,即使您才剛開始使用 Salesforce.com 平台或 Google Data 通訊協定也沒問題。我將協助您設定開發環境、安裝現有的 Salesforce.com 和 Google 混搭應用程式,然後自行編寫。

Hello, Salesforce.com!

如果您像我一樣是 Salesforce.com 新手,請先在 Apex 開發人員網路 (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」即可查看這項內容。其中一項資源是快速入門教學課程,可說明如何建立新專案,以及新增 S-Control、類別和觸發條件。如果您從未使用過 Apex 程式碼,請先完成本教學課程並建立 Apex 專案,再繼續後續步驟。

將活動匯出至 Google 日曆

Ron Hess 編寫了 Google 日曆混搭應用程式,可將 Salesforce.com 的活動匯出至 Google 日曆。Ron 也撰寫了文章,說明混搭歌曲的製作方式。稍後我會說明如何建構 Google 試算表應用程式,這個應用程式是以 Ron 的 Google 日曆混搭應用程式為範本。謝謝 Ron!

如果您是 Salesforce.com 的進階使用者,可能不需要任何操作說明,就能整合及使用 Ron 的 Google 日曆應用程式。我一開始需要一些協助,因此採取了以下做法,查看 Ron 的應用程式運作情形。

  1. 安裝應用程式:
    • 前往 Google 日曆 Mash-up 頁面,然後按一下「立即取得」
    • 輸入 ADN 憑證,然後按一下「繼續」
    • 閱讀條款及細則,然後按一下「繼續」
    • 按一下「檢查保護殼包裝內容物」頁面中的「下一步」
    • 選擇安全性等級,然後按一下「下一步」
    • 按一下 [安裝]
  2. 設定 Salesforce.com AJAX Proxy
    • 在「Administration Setup」選單中,按一下「Security Controls | Remote Site Settings」
    • 按一下「New Remote Site」(新增遠端網站)
    • 輸入「Google」做為「遠端網站名稱」,並使用「https://www.google.com」做為「遠端網站網址」。
    • 按一下 [儲存]
  3. 在活動詳細資料頁面中新增「新增至 Google」按鈕:
    • 在「應用程式設定」選單中,按一下「自訂 | 活動 | 活動頁面版面配置」
    • 按一下「活動版面配置」列中的「編輯」
    • 按兩下「詳細資料頁面按鈕」區域。
    • 醒目顯示「新增至 Google」,然後按一下向右箭頭 (>) 即可新增按鈕。
    • 按一下「確定」
    • 按一下「頁面版面配置屬性」頁面上的「儲存」
  4. 匯出活動
    • 按一下左上方的「首頁」,即可查看日曆。
    • 如果沒有任何活動,請按一下「新增活動」建立活動。
    • 點選活動即可查看「活動詳細資料」頁面。
    • 按一下「新增至 Google」按鈕。
    • 按一下 JavaScript 快訊中的「確定」
    • 使用自己的 Google 使用者名稱和密碼登入帳戶。
    • 按一下「授予存取權」,即可授予 SalesForce 應用程式 Google 日曆的寫入權。
    • Google 日曆中查看活動

建構 Google 試算表應用程式

好了,您可能已經厭倦在 Salesforce.com 頁面中點選,準備好編寫一些程式碼了。再次啟動 Eclipse,您會發現建立的 Apex 專案現在包含 Ron 的 Google 日曆應用程式適用的 S-Controls。這是因為 Eclipse 適用的 Apex Toolkit 會持續與 Salesforce.com 同步處理。很酷吧?

您可以重複使用 Google 日曆 Mash-up 的部分功能 (例如驗證控制項),建構自己的 Google 資料應用程式。在本節的其餘部分,我將說明如何建構應用程式,將 Salesforce.com 聯絡人匯出至 Google 試算表。

發布簡易的 S-Control

S-Control 是由 Salesforce.com 託管的檔案,使用者存取應用程式時,會在網路瀏覽器中執行。S-Control 可以包含任何可在網頁瀏覽器中顯示或執行的內容類型,例如 HTML、CSS 或 JavaScript。

Salesforce.com 和 Google 混搭的移動部分相當多,因此我做的第一件事是在聯絡人清單頁面中新增「匯出至 Google」按鈕,叫用簡單的 S-Control,確保所有管道都正確無誤,再深入研究 JavaScript。

在 Apex 專案中,以滑鼠右鍵按一下「S-Controls」資料夾,然後選擇「Apex | New S-Control」。為新的 S-Control 指定標籤和名稱「export_contacts」,將類型保留為「Custom HTML」,然後按一下「Finish」

新的 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 的按鈕:
    • 在「應用程式設定」選單中,按一下「自訂 | 聯絡人 | 按鈕和連結」
    • 在「自訂按鈕和連結」部分中,按一下「新增」
    • 輸入「Export to Google」做為標籤,並保留「Export_to_Google」做為名稱。
    • 選擇「清單按鈕」做為顯示類型。
    • 選擇「自訂 S-Control」做為內容來源。
    • 選擇「在現有視窗中顯示,並顯示側欄」做為「行為」。
    • 從「自訂 S-Controls」選單中選取「export_contacts」。
  3. 將按鈕新增至聯絡人清單:
    • 在「應用程式設定」選單中,按一下「自訂 | 聯絡人 | 搜尋版面配置」
    • 按一下「聯絡人清單檢視畫面」列中的「編輯」
    • 醒目顯示「匯出至 Google」,然後按一下向右箭頭 (>) 新增按鈕。
    • 按一下 [儲存]
  4. 立即試用:
    • 按一下「聯絡人」分頁標籤。
    • 選取「所有聯絡人」做為檢視畫面,然後按一下「前往!」
    • 按一下全新的「匯出至 Google」按鈕。
    • 觀看「waiting_dots」,但不要期待會發生其他事情。

與 Google 試算表互動

如果您查看 Google 日曆 Mash-up 的來源,會發現 gcal_snippet.scf 檔案包含 Google 日曆伺服器的抽象化。如要與 Google 試算表互動,您需要為 Google 試算表伺服器建立類似的檔案。我重複使用 Ron Hess 的程式碼,透過 Salesforce.com AJAX Proxy 進行驗證,並使用 Google AuthSub 驗證,然後將事件寫入 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 通訊協定中,每份試算表都有專屬網址。如要取得使用者的試算表清單 (和相關聯的網址),請查詢中繼動態饋給網址:http://spreadsheets.google.com/feeds/spreadsheets/private/full。下列方法會逐一檢查這些試算表,尋找具有特定標題的試算表。找到正確的試算表後,系統會先取得工作表清單,然後傳回第一個工作表的儲存格動態饋給網址。

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 方法找出更新儲存格要求所需的儲存格動態饋給網址,然後一次寫入一個儲存格的聯絡資訊。

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 中。這個方法會取得指定資料列和資料欄中儲存格的編輯網址,然後傳送包含更新儲存格 Google 資料表示法的 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 Proxy Server 並新增 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 中尋找您的下一個企業混搭應用程式。

祝您編寫程式一切順利!

資源