适用于差旅销售人员的 REST:在 Salesforce.com 上使用 Google 数据

Lane LiaBraaten,Google 开发者计划
2007 年 11 月

简介

Salesforce.com 和 Google 都托管热门的“软件即服务”应用,这两个组织都提供了 API,支持开发者访问为这些应用提供支持的大型数据存储。结合使用这两种 API 后,事情就开始变得有趣起来。在企业环境中,G Suite 的使用越来越广泛,Salesforce.com 构建了广泛的自定义业务应用平台,因此开发者(即您!)有很多机会来结合 Google 和 Salesforce.com 的强大功能。

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

您好,Salesforce.com!

如果您是 Salesforce.com 新手,就需要在 ADN(Apex 开发者网络)上注册开发者帐号。该开发者帐号不仅为您提供功能齐全的 Salesforce.com 帐号,还可访问 Apex Wiki讨论区

接下来,您需要获取 Apex Toolkit for Eclipse。该工具包要求使用 Java 1.5Eclipse 3.2.2 或更高版本。如果您熟悉 Eclipse,该工具包的软件更新网站是 http://www.adnsandbox.com/eclipsetoolkit/10.0/。如果您不熟悉 Eclipse 插件,或者您在安装过程中遇到任何问题,可在 Apex Wiki 中找到详细的安装说明

安装此工具包后,您可以访问已集成到 Eclipse 帮助系统中的 Apex 帮助内容。在 Eclipse 中,转到帮助 | 帮助内容 | Apex Toolkit for Eclipse 以查看此内容。“帮助”资源之一是快速入门教程,该教程介绍了如何创建新项目以及添加 S 控件、类和触发器。如果您之前未使用过 Apex 代码,则应先浏览本教程并创建 Apex 项目,然后再继续。

正在将活动导出到 Google 日历

Ron Hess 编写了一个 Google 日历混搭应用,这款应用可让您将活动从 Salesforce.com 导出到 Google 日历。Ron 还撰写了一篇文章来解释他的混搭的运作方式。稍后,我将向您展示如何进行构建。谢谢,罗恩!

如果您是 Salesforce.com 高级用户,您可能无需任何说明即可集成并使用 Ron 的 Google 日历应用。起初,我需要一些帮助,下面我将介绍 Ron 的应用的实际运作方式。

  1. 安装应用:
    • 前往 Google 日历混搭页面并点击 Get It Now
    • 输入您的 ADN 凭据,然后点击继续
    • 阅读条款及条件,然后点击继续
    • 在“检查软件包内容”页面中,点击下一步
    • 选择安全级别,然后点击下一步
    • 点击安装
  2. 配置 Salesforce.com AJAX 代理
    • 在“管理设置”菜单中,点击安全控件 | 远程网站设置
    • 点击 New Remote Site(新建远程网站)。
    • 输入 Google 作为“远程网站名称”,对于“远程网站网址”字段,请使用 https://www.google.com
    • 点击保存
  3. 将“添加到 Google”按钮添加到“活动详情”页面:
    • 在“应用设置”菜单中,点击自定义 | 活动 | 活动页面布局
    • 点击“事件布局”行中的修改
    • 双击“详情页面按钮”区域。
    • 突出显示“添加到 Google”,然后点击向右箭头 (>) 以添加按钮。
    • 点击 OK(确定)。
    • 点击“页面布局属性”页面上的保存
  4. 导出活动
    • 点击左上角的首页即可查看日历。
    • 如果您没有任何活动,请点击新建活动,创建一个活动。
    • 点击某个活动可查看“活动详情”页面。
    • 点击添加到 Google 按钮。
    • 点击 JavaScript 提醒中的确定
    • 使用您的 Google 用户名和密码登录。
    • 点击授予访问权,授予 Salesforce 应用对您的 Google 日历的写入权限。
    • Google 日历中查看活动

构建 Google 电子表格应用

好了,您可能已经厌倦了点击 Salesforce.com 页面,想要编写一些代码。再次启动 Eclipse,您会看到现在创建的 Apex 项目包含 Ron 的 Google 日历应用的 S-Control。这是因为 Apex Toolkit for Eclipse 会与 Salesforce.com 不断同步,非常酷?

您可以重复使用自己的 Google 日历混搭功能的一些功能(例如身份验证控件)来构建自己的 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 标签和名称,将类型设置为自定义 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 | Synchronize with Salesforce
    • 在目录树中找到您的新 S-Control,然后右键点击该 S-Control,并选择覆盖遥控器并发布到服务器
    • 如果您找不到 S-Control,则表明 Apex 工具包可能已为您上传该工具,但最好使用同步视角,以确保在服务器上运行最新的代码。
  2. 使用 Salesforce.com 界面定义将调用此 S-Control 的按钮:
    • 在“应用设置”菜单中,点击自定义 | 联系人 | 按钮和链接
    • 在“自定义按钮和链接”部分中,点击新建
    • 输入导出到 Google 作为标签,并保留 Export_to_Google 作为名称。
    • 选择“列表按钮”作为显示类型。
    • 选择“自定义 S-Control”作为“内容来源”。
    • 选择“在带边栏的现有窗口中显示”作为“行为”。
    • 从“自定义 S 控件”菜单中选择“导出联系人”。
  3. 将该按钮添加到联系人列表中:
    • 在“应用设置”菜单中,点击自定义 | 联系人 | 搜索布局
    • 点击“联系人列表视图”行中的修改
    • 突出显示“导出到 Google”,然后点击向右箭头 (>) 以添加按钮。
    • 点击保存
  4. 不妨来试驾:
    • 点击通讯录标签页。
    • 选择“所有联系人”作为视图,然后点击前往!
    • 点击闪亮的全新导出到 Google 按钮。
    • 注意“waiting_dots”,但应该不会有任何其他变化。

与 Google 电子表格互动

如果您查看 Google 日历混搭程序的源代码,则会发现 gcal_snippet.scf 文件包含 Google 日历服务器的抽象。要与 Google 电子表格互动,您需要为 Google 电子表格服务器创建一个类似文件。我重复使用了 Ron Hess 的代码,以使用 Salesforce.com AJAX 代理并通过 Google AuthSub 进行身份验证,并将将事件写入 Google 日历的函数替换为将信息写入 Google 电子表格的函数。gspreadsheet_snippet.scf 中提供了此文件的完整源代码。

接下来,我将 JavaScript 添加到 export_contacts.scf S-Control 中,以便查询 Salesforce.com 的联系信息,并将其写入 Google 电子表格。从 Salesforce.com 中获取数据非常简单。只需构建一个查询,并提供要在返回数据时执行的回调函数。例如:

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

获得 Salesforce.com 的联系信息后,您必须确定将其导出的位置。在 RESTful Google 数据协议中,每个电子表格都可以通过唯一网址来标识。您可以通过查询元 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 电子表格数据 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 中。该方法会获取给定行和列中单元格的修改网址,然后发送 HTTP PUT 消息,其中包含已更新单元格的 Google 数据表示形式:

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 联系人

上传这些 S 控件之后,您就可以将联系信息导出到 Google 电子表格了。那其他呢?随着您对 Salesforce.com 和 Google 数据 API 的了解,您还可以编写一些代码,将联系信息从 Google 电子表格导入 Salesforce.com。

总结

本文仅仅是浅层介绍,但现在您已经了解了 Salesforce.com 平台和 Google 数据 API,您可以思考可以编写哪些工具来利用这些强大的系统。Google Data API 系列一直在不断扩充,以提供更多的信息供您在应用中使用,而 Salesforce.com 平台提供了本文中未涵盖的许多实用工具。我将在 AppExchange 中查找您的下一个企业混搭程序。

乐享编码!

资源