数据透视表

使用 Google Sheets API,您可以在电子表格中创建和更新数据透视表。 本页面上的示例说明了如何使用 Sheets API 实现一些常见的数据透视表操作。

这些示例以 HTTP 请求的形式呈现,与语言无关。如需了解如何使用 Google API 客户端库以不同语言实现批量更新,请参阅更新电子表格

在这些示例中,占位符 SPREADSHEET_IDSHEET_ID 表示您可以提供这些 ID 的位置。您可以在电子表格网址中找到电子表格 ID。您可以使用 spreadsheets.get 方法获取工作表 ID。范围使用 A1 表示法指定。示例范围是 Sheet1!A1:D5。

此外,占位符 SOURCE_SHEET_ID 表示包含源数据的工作表。在这些示例中,这是数据透视表源数据下列出的表。

数据透视表源数据

在这些示例中,假设使用的电子表格的第一个工作表(“Sheet1”)中包含以下源“销售”数据。第一行中的字符串是各个列的标签。如需查看有关如何从电子表格的其他工作表中读取数据的示例,请参阅 A1 表示法

A B C D E F G
1 商品类别 型号 成本 数量 区域 销售人员 发货日期
2 摩天轮 W-24 20.50 美元 4 西 贝丝 2016 年 3 月 1 日
3 D-01X 15.00 美元 2 阿米尔 2016 年 3 月 15 日
4 Engine ENG-0134 ¥100.00 1 卡门 2016 年 3 月 20 日
5 Frame FR-0B1 34.00 美元 8 Hannah 2016 年 3 月 12 日
6 面板 P-034 6.00 美元 4 德温 2016 年 4 月 2 日
7 面板 P-052 11.50 美元 7 Erik 2016 年 5 月 16 日
8 摩天轮 W-24 20.50 美元 11 Sheldon 2016 年 4 月 30 日
9 Engine ENG-0161 330.00 美元 2 杰西 2016 年 7 月 2 日
10 D-01Y 29.00 美元 6 西 阿尔曼多 2016 年 3 月 13 日
11 Frame FR-0B1 34.00 美元 9 尤利安娜 2016 年 2 月 27 日
12 面板 P-102 3.00 美元 15 西 卡门 2016 年 4 月 18 日
13 面板 P-105 8.25 美元 13 西 杰西 2016 年 6 月 20 日
14 Engine ENG-0211 283.00 美元 1 阿米尔 2016 年 6 月 21 日
15 D-01X 15.00 美元 2 西 阿尔曼多 2016 年 7 月 3 日
16 Frame FR-0B1 34.00 美元 6 卡门 7/15/2016
17 摩天轮 W-25 20.00 美元 8 Hannah 2016 年 5 月 2 日
18 摩天轮 W-11 29.00 美元 13 Erik 2016 年 5 月 19 日
19 D-05 17.70 美元 7 西 贝丝 2016 年 6 月 28 日
20 Frame FR-0B1 34.00 美元 8 Sheldon 2016 年 3 月 30 日

添加数据透视表

以下 spreadsheets.batchUpdate 代码示例展示了如何使用 UpdateCellsRequest 根据源数据创建数据透视表,并将其锚定在 SHEET_ID 指定的工作表的单元格 A50 上。

该请求通过以下属性配置数据透视表:

  • 一个值组 (Quantity),用于表示销量。由于只有一个值组,因此 2 个可能的 valueLayout 设置是等效的。
  • 两个行组(Item CategoryModel Number)。第一项按“West”RegionQuantity 总数的升序排序。因此,“Engine”(West 销量为 15)显示在“Door”上方(West 销量为 15)。Model Number 组按所有地区总销量的降序排序,因此“W-24”(销量为 15)将显示在“W-25”(销量为 8)上方。将 valueBucket 字段设置为 {} 即可完成此操作。
  • 一个列组(地区),按多数销售的升序排序。 同样,将 valueBucket 设置为 {}。“North”区域的总销量最少,因此显示为第一个 Region 列。

请求协议如下所示。

POST https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID:batchUpdate
{
  "requests": [
    {
      "updateCells": {
          "rows": [
              {
            "values": [
              {
                "pivotTable": {
                  "source": {
                    "sheetId": SOURCE_SHEET_ID,
                    "startRowIndex": 0,
                    "startColumnIndex": 0,
                    "endRowIndex": 20,
                    "endColumnIndex": 7
                  },
                  "rows": [
                    {
                      "sourceColumnOffset": 0,
                      "showTotals": true,
                      "sortOrder": "ASCENDING",
                      "valueBucket": {
                        "buckets": [
                          {
                            "stringValue": "West"
                          }
                        ]
                      }
                    },
                    {
                      "sourceColumnOffset": 1,
                      "showTotals": true,
                      "sortOrder": "DESCENDING",
                      "valueBucket": {}
                    }
                  ],
                  "columns": [
                    {
                      "sourceColumnOffset": 4,
                      "sortOrder": "ASCENDING",
                      "showTotals": true,
                      "valueBucket": {}
                    }
                  ],
                  "values": [
                    {
                      "summarizeFunction": "SUM",
                      "sourceColumnOffset": 3
                    }
                  ],
                  "valueLayout": "HORIZONTAL"
                }
              }
            ]
          }
        ],
        "start": {
          "sheetId": SHEET_ID,
          "rowIndex": 49,
          "columnIndex": 0
        },
        "fields": "pivotTable"
      }
    }
  ]
}

该请求会创建一个如下数据透视表:

添加数据透视表配方结果

添加包含计算值的数据透视表

以下 spreadsheets.batchUpdate 代码示例展示了如何使用 UpdateCellsRequest 创建一个包含来自源数据的计算值组的数据透视表,并将其锚定在 SHEET_ID 指定的工作表的单元格 A50 上。

该请求通过以下属性配置数据透视表:

  • 两个值组(QuantityTotal Price)。第一个值表示销量。第二个值是基于零件费用与其总销量的乘积,使用以下公式计算得出的值:=Cost*SUM(Quantity)
  • 三个行组(Item CategoryModel NumberCost)。
  • 一个列组(区域)。
  • 行组和列组在每个组中按名称(而不是按 Quantity)排序,并按字母顺序对表进行排序。只需省略 PivotGroup 中的 valueBucket 字段即可。
  • 为了简化表格的外观,该请求会隐藏除主行组和列组之外的所有组的小计。
  • 为改进表格外观,该请求将 valueLayout 设置为 VERTICAL。仅当存在 2 个或更多值组时,valueLayout 才重要。

请求协议如下所示。

POST https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID:batchUpdate
{
  "requests": [
    {
      "updateCells": {
        "rows": [
              {
            "values": [
              {
                "pivotTable": {
                  "source": {
                    "sheetId": SOURCE_SHEET_ID,
                    "startRowIndex": 0,
                    "startColumnIndex": 0,
                    "endRowIndex": 20,
                    "endColumnIndex": 7
                  },
                  "rows": [
                    {
                      "sourceColumnOffset": 0,
                      "showTotals": true,
                      "sortOrder": "ASCENDING"
                    },
                    {
                      "sourceColumnOffset": 1,
                      "showTotals": false,
                      "sortOrder": "ASCENDING",
                    },
                    {
                      "sourceColumnOffset": 2,
                      "showTotals": false,
                      "sortOrder": "ASCENDING",
                    }
                  ],
                  "columns": [
                    {
                      "sourceColumnOffset": 4,
                      "sortOrder": "ASCENDING",
                      "showTotals": true
                    }
                  ],
                  "values": [
                    {
                      "summarizeFunction": "SUM",
                      "sourceColumnOffset": 3
                    },
                    {
                      "summarizeFunction": "CUSTOM",
                      "name": "Total Price",
                      "formula": "=Cost*SUM(Quantity)"
                    }
                  ],
                  "valueLayout": "VERTICAL"
                }
              }
            ]
          }
        ],
        "start": {
          "sheetId": SHEET_ID,
          "rowIndex": 49,
          "columnIndex": 0
        },
        "fields": "pivotTable"
      }
    }
  ]
}

该请求会创建一个如下数据透视表:

添加数据透视表值组配方结果

删除数据透视表

以下 spreadsheets.batchUpdate 代码示例展示了如何使用 UpdateCellsRequest 删除锚定在 SHEET_ID 所指定工作表的单元格 A50 中的数据透视表(如果存在)。

UpdateCellsRequest 可以通过在 fields 参数中添加“pivotTable”以及忽略锚点单元格中的 pivotTable 字段来移除数据透视表。

请求协议如下所示。

POST https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID:batchUpdate
{
  "requests": [
    {
      "updateCells": {
          "rows": [ 
            {
            "values": [
              {}
            ]
          }
        ],
        "start": {
          "sheetId": SHEET_ID,
          "rowIndex": 49,
          "columnIndex": 0
        },
        "fields": "pivotTable"
      }
    }
  ]
}

修改数据透视表的列和行

以下 spreadsheets.batchUpdate 代码示例展示了如何使用 UpdateCellsRequest 修改在添加数据透视表中创建的数据透视表。

无法使用 fields 参数单独更改 CellData 资源中 pivotTable 字段的子集。如需进行修改,必须提供整个 pivotTable 字段。从本质上讲,编辑数据透视表时,需要将其替换为新的数据透视表。

该请求将对原始数据透视表进行以下更改:

  • 从原始数据透视表(型号)中移除第二个行组。
  • 添加列组(销售人员)。这些列按 Panel 总销售额降序排序。“Carmen”(Panel 销量为 15)显示在“Jessie”(Panel 销量为 13)的左侧。
  • 收起除“西”以外的每个区域的列,并隐藏该区域的 Salesperson 组。方法是在区域列组内该列的 valueMetadata 中将 collapsed 设置为 true

请求协议如下所示。

POST https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID:batchUpdate
{
  "requests": [
    {
      "updateCells": {
        "rows": [
            {
          "values": [
              {
                "pivotTable": {
                  "source": {
                    "sheetId": SOURCE_SHEET_ID,
                    "startRowIndex": 0,
                    "startColumnIndex": 0,
                    "endRowIndex": 20,
                    "endColumnIndex": 7
                  },
                  "rows": [
                    {
                      "sourceColumnOffset": 0,
                      "showTotals": true,
                      "sortOrder": "ASCENDING",
                      "valueBucket": {
                        "buckets": [
                          {
                            "stringValue": "West"
                          }
                        ]
                      }
                    }
                  ],
                  "columns": [
                    {
                      "sourceColumnOffset": 4,
                      "sortOrder": "ASCENDING",
                      "showTotals": true,
                      "valueBucket": {},
                      "valueMetadata": [
                        {
                          "value": {
                            "stringValue": "North"
                          },
                          "collapsed": true
                        },
                        {
                          "value": {
                            "stringValue": "South"
                          },
                          "collapsed": true
                        },
                        {
                          "value": {
                            "stringValue": "East"
                          },
                          "collapsed": true
                        }
                      ]
                    },
                    {
                      "sourceColumnOffset": 5,
                      "sortOrder": "DESCENDING",
                      "showTotals": false,
                      "valueBucket": {
                        "buckets": [
                          {
                            "stringValue": "Panel"
                          }
                        ]
                      },
                    }
                  ],
                  "values": [
                    {
                      "summarizeFunction": "SUM",
                      "sourceColumnOffset": 3
                    }
                  ],
                  "valueLayout": "HORIZONTAL"
                }
              }
            ]
          }
        ],
        "start": {
          "sheetId": SHEET_ID,
          "rowIndex": 49,
          "columnIndex": 0
        },
        "fields": "pivotTable"
      }
    }
  ]
}

该请求会创建一个如下数据透视表:

修改数据透视表配方结果

读取数据透视表数据

以下 spreadsheets.get 代码示例演示了如何从电子表格获取数据透视表数据。fields 查询参数指定仅应返回数据透视表数据(与单元格值数据相反)。

请求协议如下所示。

GET https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?fields=sheets(properties.sheetId,data.rowData.values.pivotTable)

响应包含一个 Spreadsheet 资源,其中包含一个带有 SheetProperties 元素的 Sheet 对象。此外,还有一个 GridData 元素数组,其中包含有关 PivotTable 的信息。数据透视表的信息包含在表格锚定单元格(即表格的左上角)的工作表的 CellData 资源中。如果响应字段设置为默认值,则响应中会省略该字段。

在此示例中,第一个工作表 (SOURCE_SHEET_ID) 具有原始表源数据,而第二个工作表 (SHEET_ID) 具有锚定在 B3 上的数据透视表。空花括号表示不包含数据透视表数据的工作表或单元格。此请求还会返回工作表 ID,供您参考。

{
  "sheets": [
    {
      "data": [{}],
      "properties": {
        "sheetId": SOURCE_SHEET_ID
      }
    },
    {
      "data": [
        {
          "rowData": [
            {},
            {},
            {
              "values": [
                {},
                {
                  "pivotTable": {
                    "columns": [
                      {
                        "showTotals": true,
                        "sortOrder": "ASCENDING",
                        "sourceColumnOffset": 4,
                        "valueBucket": {}
                      }
                    ],
                    "rows": [
                      {
                        "showTotals": true,
                        "sortOrder": "ASCENDING",
                        "valueBucket": {
                          "buckets": [
                            {
                              "stringValue": "West"
                            }
                          ]
                        }
                      },
                      {
                        "showTotals": true,
                        "sortOrder": "DESCENDING",
                        "valueBucket": {},
                        "sourceColumnOffset": 1
                      }
                    ],
                    "source": {
                      "sheetId": SOURCE_SHEET_ID,
                      "startColumnIndex": 0,
                      "endColumnIndex": 7,
                      "startRowIndex": 0,
                      "endRowIndex": 20
                    },
                    "values": [
                      {
                        "sourceColumnOffset": 3,
                        "summarizeFunction": "SUM"
                      }
                    ]
                  }
                }
              ]
            }
          ]
        }
      ],
      "properties": {
        "sheetId": SHEET_ID
      }
    }
  ],
}