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 的强大功能结合起来。

本文将介绍如何使用 RESTful Google Data API 开始构建企业混搭应用,即使您刚开始使用 Salesforce.com 平台或 Google Data 协议也是如此。我将帮助您设置开发环境、安装现有的 Salesforce.com 和 Google 混搭应用,然后编写自己的混搭应用。

Hello, Salesforce.com!

如果您像我一样是 Salesforce.com 新手,则需要先在 Apex 开发者网络 (ADN) 上注册开发者账号。开发者账号可让您获得功能齐全的 Salesforce.com 账号,并可访问 Apex Wiki讨论论坛

接下来,您需要获取适用于 Eclipse 的 Apex 工具包。该工具包需要 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-Controls、类和触发器。如果您之前没有使用过 Apex 代码,则应先完成本教程并创建一个 Apex 项目,然后再继续学习。

将活动导出到 Google 日历

Ron Hess 编写了一个 Google 日历混搭应用,可让您将 Salesforce.com 中的活动导出到 Google 日历。Ron 还撰写了一篇文章,介绍了他的混搭作品的运作方式。我稍后将向您展示如何构建的 Google Spreadsheets 应用就是以 Ron 的 Google 日历混搭应用为模型构建的。谢谢 Ron!

如果您是 Salesforce.com 高级用户,那么您可能无需任何说明即可集成和使用 Ron 的 Google 日历应用。我一开始需要一些帮助,因此我采取了以下措施来查看 Ron 的应用实际运行情况。

  1. 安装应用:
    • 前往 Google 日历混搭页面,然后点击立即获取
    • 输入您的 ADN 凭据,然后点击继续
    • 阅读《条款及条件》,然后点击继续
    • 点击下一步,直至显示“检查软件包内容”页面。
    • 选择安全级别,然后点击下一步
    • 点击安装
  2. 配置 Salesforce.com AJAX 代理
    • 在“管理设置”菜单中,点击安全控制 | 远程站点设置
    • 点击 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 工具包会不断与 Salesforce.com 同步。很酷吧?

您可以构建自己的 Google 数据应用,并重用 Google 日历混搭应用的部分功能,例如身份验证控件。在本部分的其余内容中,我将向您展示如何构建一个应用,将 Salesforce.com 联系人导出到 Google 电子表格中。

发布简单的 S-Control

S-Control 是由 Salesforce.com 托管的文件,当用户访问您的应用时,该文件会在网络浏览器中执行。S-Control 可以包含您可以在 Web 浏览器中显示或运行的任何类型的内容,例如 HTML、CSS 或 JavaScript。

Salesforce.com 和 Google 混搭中有很多活动部件,因此我做的第一件事是在联系人列表页面中添加一个“导出到 Google”按钮,该按钮会调用一个简单的 S-Control,以确保在深入研究 JavaScript 之前所有管道都正确无误。

在您的 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 并设置一个用于调用它的按钮。

  1. 使用 Eclipse 发布 S-Control 文件:
    • 右键点击您的 Apex 项目,然后选择 Apex | 与 Salesforce 同步
    • 在目录树中找到新的 S-Control,右键点击它,然后选择覆盖远程并发布到服务器
    • 如果您找不到 S-Control,Apex 工具包可能已为您上传了它,但最好使用同步透视图来确保服务器上运行的是最新代码。
  2. 使用 Salesforce.com 界面定义将调用此 S-Control 的按钮:
    • 在“应用设置”菜单中,点击自定义 | 联系人 | 按钮和链接
    • 在“自定义按钮和链接”部分中,点击新建
    • 为标签输入 Export to Google,并保留 Export_to_Google 作为名称。
    • 选择“列表按钮”作为显示类型。
    • 选择“自定义 S-Control”作为内容来源。
    • 选择“在带有边栏的现有窗口中显示”作为行为。
    • 从“自定义 S-Controls”菜单中选择“export_contacts”。
  3. 将按钮添加到联系人列表:
    • 在“应用设置”菜单中,点击自定义 | 联系人 | 搜索布局
    • 点击“联系人列表视图”行中的修改
    • 突出显示“导出到 Google”,然后点击向右箭头 (>) 以添加该按钮。
    • 点击保存
  4. 试用一下:
    • 点击联系人标签页。
    • 选择“所有联系人”作为视图,然后点击开始!
    • 点击全新的导出到 Google 按钮。
    • 观看“等待圆点”,但不要期待发生任何其他情况。

与 Google 电子表格互动

如果您查看 Google 日历混搭的源代码,就会发现 gcal_snippet.scf 文件包含 Google 日历服务器的抽象。如需与 Google 电子表格互动,您需要为 Google 电子表格服务器创建类似的文件。我重用了 Ron Hess 的代码,用于使用 Salesforce.com AJAX 代理并通过 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 协议中,每个电子表格都可以通过一个唯一的网址进行标识。您可以通过查询元 Feed 网址 http://spreadsheets.google.com/feeds/spreadsheets/private/full 来获取用户的电子表格列表(以及关联的网址)。以下方法会遍历这些电子表格,查找具有特定标题的电子表格。当找到正确的电子表格时,它会先获取工作表列表,然后返回第一个工作表的单元格 Feed 网址。

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 Spreadsheets Data API 中提供的 Feed,请参阅参考指南

queryCallback 函数使用 getCellFeedUrl 方法查找发送更新单元格的请求所需的单元格 Feed 网址,然后一次写入一个单元格的联系信息。

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 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 Spreadsheets Data API 更新单元格,请参阅开发者指南

Google Spreadsheets Data API 使用子网域 https://spreadsheets.google.com,因此在上述代码生效之前,您需要配置 Salesforce.com AJAX 代理服务器并添加 https://spreadsheets.google.com

您还需要前往 Google 文档并创建一个新的电子表格来保存数据。请务必将其保存为 Salesforce.com 联系人

上传这些 S-Control 后,您就可以将联系信息导出到 Google 电子表格。反过来呢?现在,您已经了解了 Salesforce.com 和 Google Data API,还可以编写一些代码,将 Google 电子表格中的联系信息导入 Salesforce.com。

总结

本文只是浅尝辄止,但现在您已经了解了 Salesforce.com 平台和 Google Data API,不妨想想您可以编写哪些应用来利用这些强大的系统。Google Data 系列 API 一直在不断发展,可提供更多信息供您在应用中加以利用,而 Salesforce.com 平台也提供了许多实用工具,本文并未涵盖这些工具。我期待在 AppExchange 中看到您的下一个企业混搭应用。

祝大家编码顺利!

资源