如何按价值排序"总计"在使用Google表格API的数据透视表中

时间:2018-06-13 02:16:00

标签: python google-sheets-api

我使用以下代码通过引用工作表ID自动创建数据透视表。我想知道如何使用Grand Total列对数据透视表进行排序。我可以在进入电子表格时手动完成,但我想自动完成。我检查了Google工作表文档HERE但是无法弄明白。也许它创造了一个桶但不确定。

这是我当前的工作代码,没有对值部分进行排序:

      {
        "requests": [
          {
            "updateCells": {
              "rows": {
                "values": [
                  {
                    "pivotTable": {
                      "source": {
                        "sheetId": source_sheet_id,
                        "startRowIndex": 0,
                        "startColumnIndex": 0,
                        "endRowIndex": max_row_count,
                        "endColumnIndex": 3 #total columns
                      },
                      "rows": [
                        {
                          "sourceColumnOffset": code_index,
                          "showTotals": True,
                          "sortOrder": "ASCENDING",
                          "valueBucket": {
                            "buckets": [
                              {
                                "stringValue": "West"
                              }
                            ]
                          }
                        }
                      ],
                      "columns": [
                        {
                          "sourceColumnOffset": month_index,
                          "sortOrder": "ASCENDING",
                          "showTotals": True,
                          "valueBucket": {
                             "buckets": [
                              {
                                "stringValue": "Panel"
                              }
                            ]
                          },
                        }
                      ],
                      "values": [
                        {
                          "summarizeFunction": "SUM",
                          "sourceColumnOffset": counts_index
                        }
                      ],
                      "valueLayout": "HORIZONTAL"
                    }
                  }
                ]
              },
              "start": {
                "sheetId": destination_sheet_id,
                "rowIndex": 0,
                "columnIndex": 0
              },
              "fields": "pivotTable"
            }
          }
        ]
      }

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,经过长时间的研究,我将其修复。

技巧是在每行中添加一个空的“ valueBucket”键,如下所示:

    "rows": [
  {
    "sourceColumnOffset": 0,
    "showTotals": true,
    "sortOrder": "DESCENDING",
    "valueBucket": {}
  },

然后,这些行将按“总计”列进行排序。

我在这里找到了答案:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#SortOrder

它说:“例如,在具有一个行组和两个列组的数据透视表中,该行组最多可以列出两个值。第一个值对应于第一个列组中的值,第二个值对应对应于第二个列组中的值。如果未列出任何值,则表明应根据列组中的“总计”对行进行排序。如果仅列出一个值,则相当于使用该存储桶的“总计”。”

在您的情况下,数据是从此处获取的:https://developers.google.com/sheets/api/samples/pivot-tables

查看此工作表示例:https://docs.google.com/spreadsheets/d/1f5s03qLAVaLfUfkyvjZtllVNz0FxAmn2jEmL9wYVGh8/edit?usp=sharing

在示例中,此函数根据您的代码创建了数据透视表,并使用Grand Total Column排序的值。

function makePivot() {

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheetId = sheet.getSheetByName("Data").getSheetId(); 

  // Create a new sheet which will contain our Pivot Table
  var pivotTableSheet = sheet.insertSheet("Pivot1");
  var pivotTableSheetId = pivotTableSheet.getSheetId();  

  var request = {    
    "updateCells": {
      "rows": {
        "values": [
          {
            "pivotTable": {
              "source": {
                "sheetId": sourceSheetId,
                "startRowIndex": 0,
                "startColumnIndex": 0,
                "endRowIndex": 20,
                "endColumnIndex": 7
              },
              "rows": [
                {
                  "sourceColumnOffset": 0,
                  "showTotals": true,
                  "sortOrder": "DESCENDING",
                  "valueBucket": {}
                },
                {
                  "sourceColumnOffset": 1,
                  "showTotals": true,
                  "sortOrder": "DESCENDING",
                  "valueBucket": {}
                }
              ],
              "columns": [
                {
                  "sourceColumnOffset": 4,
                  "sortOrder": "ASCENDING",
                  "showTotals": true}
              ],
              "values": [
                {
                  "summarizeFunction": "SUM",
                  "sourceColumnOffset": 3
                }
              ],
              "valueLayout": "HORIZONTAL"
            }
          }
        ]
      },
      "start": {
        "sheetId": pivotTableSheetId,
        "rowIndex": 2,
        "columnIndex": 0
      },
      "fields": "pivotTable"
    }
  }

  Sheets.Spreadsheets.batchUpdate({'requests': [request]}, sheet.getId());
}

希望这会有所帮助!

答案 1 :(得分:1)

向以下网址发送POST请求(填写您的电子表格ID):https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId:batchUpdate

包含以下有效内容(插入总计列号的实际值):

{
  "requests": [
    {
      "sortRange": {
        "range": {
          "sheetId": sheetId,
          "startRowIndex": 0,
          "endRowIndex": 10,
          "startColumnIndex": 0,
          "endColumnIndex": 6
        },
        "sortSpecs": [
          {
            "dimensionIndex": Index of GrandTotal Column,
            "sortOrder": "ASCENDING"
          }
        ]
      }
    }
  ]
}

请参阅此处查看完整文档:https://developers.google.com/sheets/api/samples/data(最底层示例)