Google 电子表格

本页介绍了如何使用带有 Google 电子表格的 Google 图表。

简介

Google 图表与 Google 电子表格紧密集成。您可以将 Google 图表放入 Google 电子表格中,并且 Google 图表可以从 Google 电子表格中提取数据。本文档将向您介绍如何执行这两个操作。

无论您选择哪种方法,只要底层电子表格发生变化,您的图表都会随之更改。

将图表嵌入电子表格中

在电子表格中添加图表非常简单。在电子表格工具栏中,依次选择“插入”和“图表”,您可以选择图表类型并选择各种选项:

通过单独的电子表格创建图表

通常,用户通过填充数据表并使用这些数据绘制图表来创建 Google 图表。如果您想从 Google 电子表格中检索数据,则需要查询该电子表格,以检索要绘制成图表的数据:

function drawChart() {
  var query = new google.visualization.Query(URL);
  query.send(handleQueryResponse);
}

function handleQueryResponse(response) {
  var data = response.getDataTable();
  var chart = new google.visualization.ColumnChart(document.getElementById('columnchart'));
  chart.draw(data, null);
}

这是因为 Google 电子表格支持用于对数据进行排序和过滤的 Google 图表查询语言;任何支持查询语言的系统都可以用作数据源。

请注意,未经明确授权,图表无法使用查看图表的人员的权限。该电子表格必须对所有人都可见,或者页面必须明确获取最终用户凭据(如本页面的授权部分中所述)。

要将 Google 电子表格用作数据源,您需要相应网址:

  1. 打开现有电子表格。此电子表格应具有您的可视化图表所需的格式,并且应正确设置查看权限。(查看“在网络上公开”或“知道链接的任何人”权限是最简单的方法,本部分中的说明假定使用以这种方式设置的电子表格。您可以通过将电子表格保持为“不公开”状态并授予各个 Google 帐号访问权限来进行限制,但需要按照下面的授权说明进行操作。
  2. 从浏览器中复制网址。 如需详细了解如何选择特定范围,请参阅查询来源范围
  3. 将网址提供给 google.visualization.Query() 该查询支持以下可选参数:
    • headers=N:指定标题行的行数,其中 N 为 0 或更大的整数。 它们将从数据中排除,并作为数据表中的列标签分配。如果您未指定此参数,电子表格将猜测有多少行是标题行。 请注意,如果您的所有列都是字符串数据,则在没有此参数的情况下,电子表格可能难以确定哪些行是标题行。
    • gid=N:指定要链接到多工作表文档中的哪个工作表(如果您未链接到第一个工作表)。 N 是工作表的 ID 编号。您可以前往该工作表的已发布版本并在网址中查找 gid=N 参数,以了解 ID 编号。您也可以用 sheet 参数代替此参数。问题:在浏览器中查看时,Google 电子表格可能会重新排列网址中的 gid 参数;如果是从浏览器复制,请确保所有参数都位于网址的 # 标记之前。示例:gid=1545912003
    • sheet=sheet_name:指定要链接到多工作表文档中的哪个工作表(如果您未链接到第一个工作表)。sheet_name 是工作表的显示名称。示例:sheet=Sheet5

下面是一个完整示例:

以下是绘制此图表的两种方法:一种使用 gid 参数,另一种使用 sheet 参数。在浏览器中输入任一网址将为图表生成相同的结果/数据。

GID
    function drawGID() {
      var queryString = encodeURIComponent('SELECT A, H, O, Q, R, U LIMIT 5 OFFSET 8');

      var query = new google.visualization.Query(
          'https://docs.google.com/spreadsheets/d/1XWJLkAwch5GXAt_7zOFDcg8Wm8Xv29_8PWuuW15qmAE/gviz/tq?gid=0&headers=1&tq=' + queryString);
      query.send(handleQueryResponse);
    }

    function handleQueryResponse(response) {
      if (response.isError()) {
        alert('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage());
        return;
      }

      var data = response.getDataTable();
      var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
      chart.draw(data, { height: 400 });
    }
表格
    function drawSheetName() {
      var queryString = encodeURIComponent('SELECT A, H, O, Q, R, U LIMIT 5 OFFSET 8');

      var query = new google.visualization.Query(
          'https://docs.google.com/spreadsheets/d/1XWJLkAwch5GXAt_7zOFDcg8Wm8Xv29_8PWuuW15qmAE/gviz/tq?sheet=Sheet1&headers=1&tq=' + queryString);
      query.send(handleSampleDataQueryResponse);
    }

    function handleSampleDataQueryResponse(response) {
      if (response.isError()) {
        alert('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage());
        return;
      }

      var data = response.getDataTable();
      var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
      chart.draw(data, { height: 400 });
    }

查询来源范围

查询源网址指定要在查询中使用的电子表格的哪个部分:特定单元格、单元格范围、行或列,或整个电子表格。请使用“range=<range_expr”range_expr> 语法指定范围,例如:

https://docs.google.com/spreadsheets/d/1XWJLkAwch5GXAt_7zOFDcg8Wm8Xv29_8PWuuW15qmAE/gviz/tq?range=A1:C4
   

以下是演示语法的几个示例:

  • A1:B10 - 从单元格 A1 到 B10 的范围
  • 5:7 - 第 5-7 行
  • D:F - D-F 列
  • A:A70 - A 列中的前 70 个单元格
  • A70:A - A 列(从第 70 行到末尾)
  • B5:5 - B5 到第 5 行末尾
  • D3:D - D3 到 D 列末尾
  • C:C10 - 从 C 列的开头到 C10

授权

Google 表格需要最终用户凭据才能通过 Google Visualization API(“/tq 请求”)访问私人电子表格。

注意:共享到“知道链接的任何人都可以查看”的电子表格不需要凭据。更改电子表格的共享设置要比实施授权简单得多。

如果链接共享不是可行的解决方案,开发者将需要更改其代码,以传递针对 Google Sheets API 范围 (https://www.googleapis.com/auth/spreadsheets) 授权的 OAuth 2.0 凭据。

有关 OAuth 2.0 的更多背景信息,请参阅使用 OAuth 2.0 访问 Google API

示例:使用 OAuth 访问 /gviz/tq

必备条件:从 Google Developer Console 获取客户端 ID

如需更详细地了解如何与 Google 的 Identity Platform 集成,请参阅 Google 登录创建 Google API 控制台项目和客户端 ID

要获取最终用户的 OAuth 令牌,您必须先在 Google Developer Console 中注册您的项目,并获取客户端 ID。

  1. 在开发者控制台中,创建一个新的 OAuth 客户端 ID
  2. 选择 Web 应用作为应用类型。
  3. 请选择任意名称;该名称仅供您自己参考。
  4. 将您的网域(及任何测试网域)的名称添加为已获授权的 JavaScript 来源
  5. 已获授权的重定向 URI 留空。

点击“创建”后,复制客户端 ID 以供日后参考。本练习不需要客户端密钥。

更新您的网站以获取 OAuth 凭据。

Google 提供的 gapi.auth 库大大简化了获取 OAuth 凭据的过程。以下代码示例使用此库获取凭据(必要时请求授权),并将生成的凭据传递给 /gviz/tq 端点。

demo.html
<html>
<body>
  <button id="authorize-button" style="visibility: hidden">Authorize</button>
  <script src="./demo.js" type="text/javascript"></script>
  <script src="https://apis.google.com/js/auth.js?onload=init"></script>
</body>
</html>
demo.js
// NOTE: You must replace the client id on the following line.
var clientId = '549821307845-9ef2xotqflhcqbv10.apps.googleusercontent.com';
var scopes = 'https://www.googleapis.com/auth/spreadsheets';

function init() {
  gapi.auth.authorize(
      {client_id: clientId, scope: scopes, immediate: true},
      handleAuthResult);
}

function handleAuthResult(authResult) {
  var authorizeButton = document.getElementById('authorize-button');
  if (authResult && !authResult.error) {
    authorizeButton.style.visibility = 'hidden';
    makeApiCall();
  } else {
    authorizeButton.style.visibility = '';
    authorizeButton.onclick = handleAuthClick;
  }
}

function handleAuthClick(event) {
  gapi.auth.authorize(
      {client_id: clientId, scope: scopes, immediate: false},
      handleAuthResult);
  return false;
}

function makeApiCall() {
  // Note: The below spreadsheet is "Public on the web" and will work
  // with or without an OAuth token.  For a better test, replace this
  // URL with a private spreadsheet.
  var tqUrl = 'https://docs.google.com/spreadsheets' +
      '/d/1XWJLkAwch5GXAt_7zOFDcg8Wm8Xv29_8PWuuW15qmAE/gviz/tq' +
      '?tqx=responseHandler:handleTqResponse' +
      '&access_token=' + encodeURIComponent(gapi.auth.getToken().access_token);

  document.write('<script src="' + tqUrl +'" type="text/javascript"></script>');
}

function handleTqResponse(resp) {
  document.write(JSON.stringify(resp));
}

授权成功后,gapi.auth.getToken() 将返回所有凭据详细信息,包括可附加到 /gviz/tq 请求的 access_token

如需详细了解如何使用 gapi 库进行身份验证,请参阅:

使用 drive.file 范围

上例使用的是 Google Sheets API 范围,该范围授予对用户所有电子表格内容的读写权限。这一限制可能比必要更宽松,具体取决于应用。如需进行只读访问,请使用 spreadsheets.readonly 范围,该范围会授予对用户表格及其属性的只读权限。

drive.file 范围 (https://www.googleapis.com/auth/drive.file) 仅授予对用户使用 Google 云端硬盘文件选择器(通过 Picker API 启动)显式打开的文件的访问权限。

使用 Picker 会更改应用的流程。用户必须使用“选择器”对话框来选择希望您的网页访问哪个电子表格,而不是粘贴网址或使用上述示例中的硬编码电子表格。请参照选择器“Hello World”示例,使用 google.picker.ViewId.SPREADSHEETS 代替 google.picker.ViewId.PHOTOS