ตาราง Pivot

คู่มือนี้อธิบายวิธีใช้ Google Sheets API สร้างตาราง Pivot ในสเปรดชีต

ตาราง Pivot คืออะไร

ตาราง Pivot เป็นวิธีสรุปข้อมูลในสเปรดชีต การรวม จัดเรียง นับ หรือหาค่าเฉลี่ยข้อมูลโดยอัตโนมัติ ในขณะที่แสดงผลลัพธ์ที่สรุปไว้ในตารางใหม่ ตาราง Pivot ทำหน้าที่เป็นคำค้นหา เทียบกับชุดข้อมูลต้นทาง ข้อมูลต้นฉบับนี้อยู่ที่ตำแหน่งอื่นในสเปรดชีต และตาราง Pivot แสดงมุมมองข้อมูลที่ผ่านการประมวลผลแล้ว

ตัวอย่างเช่น ลองพิจารณาชุดข้อมูลยอดขายต่อไปนี้

B C D จ. F G
1 Item Category หมายเลขรุ่น ค่าใช้จ่าย จำนวน ภูมิภาค พนักงานขาย วันที่จัดส่ง
2 ตั๋วขึ้นชิงช้าสวรรค์ W-24 205.00 THB 4 ตะวันตก เบธ 1/3/2016
3 ประตู D-01X 450 บาท 2 ใต้ อาเมียร์ 15/3/2016
4 เครื่องยนต์ ENG-0134 3,000 บาท 1 เหนือ คาร์เมน 20/3/2016
5 กรอบ ฝรั่งเศส-0ข1 340.00 THB 8 ตะวันออก วรรณา 12/3/2016
6 แผง P-034 $6.00 4 เหนือ เดวิน 2/4/2016
7 แผง P-052 335 บาท 7 ตะวันออก อิริค 16/5/2016
8 ตั๋วขึ้นชิงช้าสวรรค์ W-24 205.00 THB 11 ใต้ เชลดอน 30/4/2016
9 เครื่องยนต์ ENG-0161 330.00 บาท 2 เหนือ เจสซี่ 2/7/2016
10 ประตู D-01Y 290.00 THB 6 ตะวันตก อาร์มันโด 13/3/2016
11 กรอบ ฝรั่งเศส-0ข1 340.00 THB 9 ใต้ ยูเลียนา 27/2/2016
12 แผง P-102 90.00 บาท 15 ตะวันตก คาร์เมน 18/4/2016
13 แผง P-105 286 บาท 13 ตะวันตก เจสซี่ 20/6/2016
14 เครื่องยนต์ ENG-0211 283.00 บาท 1 เหนือ อาเมียร์ 21/6/2016
15 ประตู D-01X 450 บาท 2 ตะวันตก อาร์มันโด 3/7/2016
16 กรอบ ฝรั่งเศส-0ข1 340.00 THB 6 ใต้ คาร์เมน 15/7/2016
17 ตั๋วขึ้นชิงช้าสวรรค์ W-25 $20.00 8 ใต้ วรรณา 2/5/2016
18 ตั๋วขึ้นชิงช้าสวรรค์ W-11 290.00 THB 13 ตะวันออก อิริค 19/5/2016
19 ประตู D-05 177.00 THB 7 ตะวันตก เบธ 28/6/2016
20 กรอบ ฝรั่งเศส-0ข1 340.00 THB 8 เหนือ เชลดอน 30/3/2016

คุณอาจใช้ตาราง Pivot เพื่อสร้างรายงานที่แสดงจำนวนรุ่นแต่ละรุ่นที่ขายในแต่ละภูมิภาคได้ ดังนี้

ภาพหน้าจอของตาราง Pivot ที่แสดงจำนวนหมายเลขรุ่นตามภูมิภาค

สำหรับซอร์สโค้ดที่ใช้สร้างตาราง Pivot นี้ โปรดดูส่วนตัวอย่างด้านล่าง

เมื่อวางตาราง Pivot ในสเปรดชีต ผู้ใช้จะเปลี่ยนโครงสร้างและรายละเอียดของสรุปแบบอินเทอร์แอกทีฟได้โดยใช้ UI ของชีต

การทำงานกับตาราง Pivot

คำจำกัดความของตาราง Pivot จะเชื่อมโยงกับเซลล์เดียวในชีต แม้ว่าลักษณะที่แสดงผลคือเซลล์จำนวนมากทั้งความสูงและความกว้าง แต่แบบเป็นโปรแกรมจะอยู่ที่พิกัดของเซลล์เดียว เซลล์นี้จะกลายเป็นมุมซ้ายบนของตาราง Pivot ที่แสดงผล โดยมีขอบเขตแนวนอนและแนวตั้งที่กำหนดตามคำจำกัดความ

การเพิ่มตาราง Pivot

หากต้องการเพิ่มตาราง Pivot ให้ใช้เมธอด batchUpdate ในการจัดเตรียมคำขอ updateCells คุณใช้คำขอนี้เพื่อมอบคำจำกัดความของ PivotTable เป็นเนื้อหาของเซลล์ดังที่แสดงด้านล่าง

"updateCells": {
  "rows": {
    "values": [{
      "pivotTable": MyPivotTable
    },
    "start": {
      "sheetId": sheetId,
      "rowIndex": 0,
      "columnIndex": 0
    },
    "fields": "pivotTable"
  }

ซึ่งจะวางตาราง Pivot ที่ MyPivotTable อธิบายไว้ในชีตที่ระบุ โดยมีมุมบนซ้ายที่เซลล์ A1 (ความสูงและความกว้างของตาราง Pivot เป็นแบบไดนามิก คุณจะระบุเฉพาะต้นทางเท่านั้น)

ประเภท PivotTable ให้คุณระบุสิ่งต่อไปนี้

  • ช่วงข้อมูลต้นทาง
  • มีอย่างน้อย 1 ช่องที่ข้อมูลจะสร้างเป็นแถวของตาราง Pivot
  • มีอย่างน้อย 1 ช่องที่ข้อมูลจะสร้างคอลัมน์ของตาราง Pivot
  • เกณฑ์การกรองและการรวม
  • เลย์เอาต์ตาราง Pivot

การแก้ไขและลบตาราง Pivot

ไม่มีคำขอที่ชัดเจนให้แก้ไขหรือลบตาราง Pivot แต่ให้ใช้คำขอ updateCells กับเนื้อหาเซลล์อื่นแทน

  • หากต้องการแก้ไขตาราง Pivot ให้สร้างคำจำกัดความของ PivotTable ที่แก้ไขแล้วและอัปเดตเซลล์โดยใช้ตาราง Pivot ซึ่งคล้ายกับการเพิ่มตาราง Pivot ใหม่
  • หากต้องการลบตาราง Pivot ให้อัปเดตเซลล์ด้วยค่าว่าง โปรดดูตัวอย่างลบตาราง Pivot

Use Case

ตาราง Pivot มีประโยชน์ในหลายด้าน เช่น การวิเคราะห์เชิงสถิติ, การใช้ ERP, การรายงานทางการเงิน และอื่นๆ กรณีการใช้งานตาราง Pivot แบบคลาสสิกรวมถึงรายการต่างๆ เช่น

  • ยอดขายทั้งหมดตามภูมิภาคและไตรมาส
  • เงินเดือนเฉลี่ยตามชื่อและสถานที่ตั้ง
  • จำนวนเหตุการณ์ตามผลิตภัณฑ์และช่วงเวลาของวัน

การใช้งานตาราง Pivot ที่เป็นไปได้นั้นมีอยู่เป็นจำนวนมาก และความสามารถในการสร้างตาราง Pivot แบบเป็นโปรแกรมก็มีประสิทธิภาพมาก คุณอาจสร้างตาราง Pivot ที่รองรับการสำรวจแบบอินเทอร์แอกทีฟแต่ปรับแต่งให้เหมาะกับสถานการณ์บางอย่างได้ เช่น

  • สำรวจข้อมูลเหตุการณ์ในช่วง 24 ชั่วโมงล่าสุด
  • ดู/วิเคราะห์ข้อมูลที่รวบรวมไว้ซึ่งสอดคล้องกับบัญชีที่เลือกในปัจจุบัน
  • ตรวจสอบข้อมูลการขายสำหรับเขตแดนที่เป็นของผู้ใช้ปัจจุบัน

ตัวอย่าง

ตัวอย่างนี้สร้างตาราง Pivot จากชุดข้อมูลเพื่อสร้างรายงาน "หมายเลขรุ่นตามภูมิภาค" ซึ่งแสดงในบทนำของหน้านี้ ดูตัวอย่างเพิ่มเติมได้ที่หน้าตัวอย่างตาราง Pivot

Apps Script

sheets/api/spreadsheet_snippets.gs
/**
 * Create pivot table
 * @param {string} spreadsheetId spreadsheet ID
 * @returns {*} pivot table's spreadsheet
 */
Snippets.prototype.pivotTable = (spreadsheetId) => {
  try {
    const spreadsheet = SpreadsheetApp.openById(spreadsheetId);

    // Create two sheets for our pivot table, assume we have one.
    let sheet = spreadsheet.getSheets()[0];
    sheet.copyTo(spreadsheet);

    const sourceSheetId = spreadsheet.getSheets()[0].getSheetId();
    const targetSheetId = spreadsheet.getSheets()[1].getSheetId();

    // Create pivot table
    const pivotTable = Sheets.newPivotTable();

    let gridRange = Sheets.newGridRange();
    gridRange.sheetId = sourceSheetId;
    gridRange.startRowIndex = 0;
    gridRange.startColumnIndex = 0;
    gridRange.endRowIndex = 20;
    gridRange.endColumnIndex = 7;
    pivotTable.source = gridRange;

    let pivotRows = Sheets.newPivotGroup();
    pivotRows.sourceColumnOffset = 1;
    pivotRows.showTotals = true;
    pivotRows.sortOrder = 'ASCENDING';
    pivotTable.rows = pivotRows;

    let pivotColumns = Sheets.newPivotGroup();
    pivotColumns.sourceColumnOffset = 4;
    pivotColumns.sortOrder = 'ASCENDING';
    pivotColumns.showTotals = true;
    pivotTable.columns = pivotColumns;

    let pivotValue = Sheets.newPivotValue();
    pivotValue.summarizeFunction = 'COUNTA';
    pivotValue.sourceColumnOffset = 4;
    pivotTable.values = [pivotValue];

    // Create other metadata for the updateCellsRequest
    let cellData = Sheets.newCellData();
    cellData.pivotTable = pivotTable;

    let rows = Sheets.newRowData();
    rows.values = cellData;

    let start = Sheets.newGridCoordinate();
    start.sheetId = targetSheetId;
    start.rowIndex = 0;
    start.columnIndex = 0;

    let updateCellsRequest = Sheets.newUpdateCellsRequest();
    updateCellsRequest.rows = rows;
    updateCellsRequest.start = start;
    updateCellsRequest.fields = 'pivotTable';

    // Batch update our spreadsheet
    let batchUpdate = Sheets.newBatchUpdateSpreadsheetRequest();
    let updateCellsRawRequest = Sheets.newRequest();
    updateCellsRawRequest.updateCells = updateCellsRequest;
    batchUpdate.requests = [updateCellsRawRequest];
    const response = Sheets.Spreadsheets.batchUpdate(batchUpdate,
      spreadsheetId);

    return response;
  } catch (err) {
    // TODO (developer) - Handle exception
    console.log('Failed with error %s', err.message);
  }
};

Java

sheets/snippets/src/main/java/PivotTables.java
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.AddSheetRequest;
import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest;
import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse;
import com.google.api.services.sheets.v4.model.CellData;
import com.google.api.services.sheets.v4.model.GridCoordinate;
import com.google.api.services.sheets.v4.model.GridRange;
import com.google.api.services.sheets.v4.model.PivotGroup;
import com.google.api.services.sheets.v4.model.PivotTable;
import com.google.api.services.sheets.v4.model.PivotValue;
import com.google.api.services.sheets.v4.model.Request;
import com.google.api.services.sheets.v4.model.RowData;
import com.google.api.services.sheets.v4.model.UpdateCellsRequest;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/* Class to demonstrate the use of Spreadsheet Create Pivot Tables API */
public class PivotTables {
  /**
   * Create pivot table.
   *
   * @param spreadsheetId - Id of the spreadsheet.
   * @return pivot table's spreadsheet
   * @throws IOException - if credentials file not found.
   */
  public static BatchUpdateSpreadsheetResponse pivotTables(String spreadsheetId)
      throws IOException {
        /* Load pre-authorized user credentials from the environment.
           TODO(developer) - See https://developers.google.com/identity for
            guides on implementing OAuth2 for your application. */
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Create the sheets API client
    Sheets service = new Sheets.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Sheets samples")
        .build();

    // Create two sheets for our pivot table.
    List<Request> sheetsRequests = new ArrayList<>();
    BatchUpdateSpreadsheetResponse result = null;
    try {
      sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest()));
      sheetsRequests.add(new Request().setAddSheet(new AddSheetRequest()));

      BatchUpdateSpreadsheetRequest createSheetsBody = new BatchUpdateSpreadsheetRequest()
          .setRequests(sheetsRequests);
      BatchUpdateSpreadsheetResponse createSheetsResponse = service.spreadsheets()
          .batchUpdate(spreadsheetId, createSheetsBody).execute();
      int sourceSheetId = createSheetsResponse.getReplies().get(0).getAddSheet().getProperties()
          .getSheetId();
      int targetSheetId = createSheetsResponse.getReplies().get(1).getAddSheet().getProperties()
          .getSheetId();

      PivotTable pivotTable = new PivotTable()
          .setSource(
              new GridRange()
                  .setSheetId(sourceSheetId)
                  .setStartRowIndex(0)
                  .setStartColumnIndex(0)
                  .setEndRowIndex(20)
                  .setEndColumnIndex(7)
          )
          .setRows(Collections.singletonList(
              new PivotGroup()
                  .setSourceColumnOffset(1)
                  .setShowTotals(true)
                  .setSortOrder("ASCENDING")
          ))
          .setColumns(Collections.singletonList(
              new PivotGroup()
                  .setSourceColumnOffset(4)
                  .setShowTotals(true)
                  .setSortOrder("ASCENDING")
          ))
          .setValues(Collections.singletonList(
              new PivotValue()
                  .setSummarizeFunction("COUNTA")
                  .setSourceColumnOffset(4)
          ));
      List<Request> requests = Lists.newArrayList();
      Request updateCellsRequest = new Request().setUpdateCells(new UpdateCellsRequest()
          .setFields("*")
          .setRows(Collections.singletonList(
              new RowData().setValues(
                  Collections.singletonList(
                      new CellData().setPivotTable(pivotTable))
              )
          ))
          .setStart(new GridCoordinate()
              .setSheetId(targetSheetId)
              .setRowIndex(0)
              .setColumnIndex(0)

          ));

      requests.add(updateCellsRequest);
      BatchUpdateSpreadsheetRequest updateCellsBody = new BatchUpdateSpreadsheetRequest()
          .setRequests(requests);
      result = service.spreadsheets().batchUpdate(spreadsheetId, updateCellsBody).execute();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      GoogleJsonError error = e.getDetails();
      if (error.getCode() == 404) {
        System.out.printf("Spreadsheet not found with id '%s'.\n", spreadsheetId);
      } else {
        throw e;
      }
    }
    return result;
  }
}

JavaScript

sheets/snippets/sheets_pivot_tables.js
function pivotTable(spreadsheetId, callback) {
  // Create two sheets for our pivot table
  const requests = [{
    addSheet: {},
  }, {
    addSheet: {},
  }];
  const batchUpdateRequest = {requests: requests};
  try {
    gapi.client.sheets.spreadsheets.batchUpdate({
      spreadsheetId: spreadsheetId,
      resource: batchUpdateRequest,
    }).then((response) => {
      const sourceSheetId = response.result.replies[0].addSheet.properties.sheetId;
      const targetSheetId = response.result.replies[1].addSheet.properties.sheetId;

      const requests = [{
        updateCells: {
          rows: {
            values: [{
              pivotTable: {
                source: {
                  sheetId: sourceSheetId,
                  startRowIndex: 0,
                  startColumnIndex: 0,
                  endRowIndex: 20,
                  endColumnIndex: 7,
                },
                rows: [{
                  sourceColumnOffset: 1,
                  showTotals: true,
                  sortOrder: 'ASCENDING',
                }],
                columns: [{
                  sourceColumnOffset: 4,
                  sortOrder: 'ASCENDING',
                  showTotals: true,
                }],
                values: [{
                  summarizeFunction: 'COUNTA',
                  sourceColumnOffset: 4,
                }],
                valueLayout: 'HORIZONTAL',
              },
            },
            ],
          },
          start: {
            sheetId: targetSheetId,
            rowIndex: 0,
            columnIndex: 0,
          },
          fields: 'pivotTable',
        },
      }];

      const body = {
        requests,
      };
      gapi.client.sheets.spreadsheets.batchUpdate({
        spreadsheetId: spreadsheetId,
        resource: body,
      }).then((response) => {
        if (callback) callback(response);
      });
    });
  } catch (err) {
    document.getElementById('content').innerText = err.message;
    return;
  }
}

Node.js

sheets/snippets/sheets_pivot_table.js
/**
 * Adds a pivot table to a spreadsheet.
 * @param {string} spreadsheetId The Spreadsheet to add the pivot table to.
 * @return {obj} spreadsheet information
 */
async function pivotTable(spreadsheetId) {
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/spreadsheets',
  });

  const service = google.sheets({version: 'v4', auth});
  try {
    // Create two sheets for our pivot table
    let requests = [
      {
        addSheet: {},
      },
      {
        addSheet: {},
      },
    ];
    let resource = {requests};
    let response = await service.spreadsheets.batchUpdate({
      spreadsheetId,
      resource,
    });
    const sourceSheetId = response.data.replies[0].addSheet.properties.sheetId;
    const targetSheetId = response.data.replies[1].addSheet.properties.sheetId;

    requests = [
      {
        updateCells: {
          rows: {
            values: [
              {
                pivotTable: {
                  source: {
                    sheetId: sourceSheetId,
                    startRowIndex: 0,
                    startColumnIndex: 0,
                    endRowIndex: 20,
                    endColumnIndex: 7,
                  },
                  rows: [
                    {
                      sourceColumnOffset: 1,
                      showTotals: true,
                      sortOrder: 'ASCENDING',
                    },
                  ],
                  columns: [
                    {
                      sourceColumnOffset: 4,
                      sortOrder: 'ASCENDING',
                      showTotals: true,
                    },
                  ],
                  values: [
                    {
                      summarizeFunction: 'COUNTA',
                      sourceColumnOffset: 4,
                    },
                  ],
                  valueLayout: 'HORIZONTAL',
                },
              },
            ],
          },
          start: {
            sheetId: targetSheetId,
            rowIndex: 0,
            columnIndex: 0,
          },
          fields: 'pivotTable',
        },
      },
    ];
    resource = {
      requests,
    };
    response = service.spreadsheets.batchUpdate({
      spreadsheetId,
      resource,
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle exception
    throw err;
  }
}

PHP

sheets/snippets/src/SpreadsheetPivotTables.php
use Google\Client;
use Google\Service\Drive;
use Google\Service\Sheets\BatchUpdateSpreadsheetRequest;


function pivotTables($spreadsheetId)
    {
        /* Load pre-authorized user credentials from the environment.
           TODO(developer) - See https://developers.google.com/identity for
            guides on implementing OAuth2 for your application. */
        $client = new Google\Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Google\Service\Drive::DRIVE);
        $service = new Google_Service_Sheets($client);
        try{
            $requests = [
                new Google_Service_Sheets_Request([
                    'addSheet' => [
                        'properties' => [
                            'title' => 'Sheet 1'
                            ]
                ]
            ]),
            new Google_Service_Sheets_Request([
                'addSheet' => [
                    'properties' => [
                        'title' => 'Sheet 2'
                        ]
                        ]
                        ])
                    ];
                    // Create two sheets for our pivot table
                    $batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest([
                        'requests' => $requests
                    ]);
        $batchUpdateResponse = $service->spreadsheets->batchUpdate($spreadsheetId, $batchUpdateRequest);
        $sourceSheetId = $batchUpdateResponse->replies[0]->addSheet->properties->sheetId;
        $targetSheetId = $batchUpdateResponse->replies[1]->addSheet->properties->sheetId;
        $requests = [
            'updateCells' => [
                'rows' => [
                    'values' => [
                        [
                            'pivotTable' => [
                                'source' => [
                                    'sheetId' => $sourceSheetId,
                                    'startRowIndex' => 0,
                                    'startColumnIndex' => 0,
                                    'endRowIndex' => 20,
                                    'endColumnIndex' => 7
                                ],
                                'rows' => [
                                    [
                                        'sourceColumnOffset' => 1,
                                        'showTotals' => true,
                                        'sortOrder' => 'ASCENDING',
                                    ],
                                ],
                                'columns' => [
                                    [
                                        'sourceColumnOffset' => 4,
                                        'sortOrder' => 'ASCENDING',
                                        'showTotals' => true,
                                    ]
                                ],
                                'values' => [
                                    [
                                        'summarizeFunction' => 'COUNTA',
                                        'sourceColumnOffset' => 4
                                        ]
                                    ],
                                'valueLayout' => 'HORIZONTAL'
                            ]
                        ]
                        ]
                ],
                'start' => [
                    'sheetId' => $targetSheetId,
                    'rowIndex' => 0,
                    'columnIndex' => 0
                ],
                'fields' => 'pivotTable'
            ]
        ];
        return $batchUpdateResponse;
    }
        catch(Exception $e) {
            // TODO(developer) - handle error appropriately
            echo 'Message: ' .$e->getMessage();
        }
    }

Python

sheets/snippets/sheets_pivot_tables.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def pivot_tables(spreadsheet_id):
  """
  Creates the batch_update the user has access to.
  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()
  # pylint: disable=maybe-no-member
  try:
    service = build("sheets", "v4", credentials=creds)
    # Create two sheets for our pivot table.
    body = {"requests": [{"addSheet": {}}, {"addSheet": {}}]}
    batch_update_response = (
        service.spreadsheets()
        .batchUpdate(spreadsheetId=spreadsheet_id, body=body)
        .execute()
    )
    source_sheet_id = (
        batch_update_response.get("replies")[0]
        .get("addSheet")
        .get("properties")
        .get("sheetId")
    )
    target_sheet_id = (
        batch_update_response.get("replies")[1]
        .get("addSheet")
        .get("properties")
        .get("sheetId")
    )
    requests = []
    requests.append(
        {
            "updateCells": {
                "rows": {
                    "values": [
                        {
                            "pivotTable": {
                                "source": {
                                    "sheetId": source_sheet_id,
                                    "startRowIndex": 0,
                                    "startColumnIndex": 0,
                                    "endRowIndex": 20,
                                    "endColumnIndex": 7,
                                },
                                "rows": [
                                    {
                                        "sourceColumnOffset": 1,
                                        "showTotals": True,
                                        "sortOrder": "ASCENDING",
                                    },
                                ],
                                "columns": [{
                                    "sourceColumnOffset": 4,
                                    "sortOrder": "ASCENDING",
                                    "showTotals": True,
                                }],
                                "values": [{
                                    "summarizeFunction": "COUNTA",
                                    "sourceColumnOffset": 4,
                                }],
                                "valueLayout": "HORIZONTAL",
                            }
                        }
                    ]
                },
                "start": {
                    "sheetId": target_sheet_id,
                    "rowIndex": 0,
                    "columnIndex": 0,
                },
                "fields": "pivotTable",
            }
        }
    )
    body = {"requests": requests}
    response = (
        service.spreadsheets()
        .batchUpdate(spreadsheetId=spreadsheet_id, body=body)
        .execute()
    )
    return response

  except HttpError as error:
    print(f"An error occurred: {error}")
    return error


if __name__ == "__main__":
  # Pass: spreadsheet_id
  pivot_tables("1CM29gwKIzeXsAppeNwrc8lbYaVMmUclprLuLYuHog4k")

Ruby

sheets/snippets/lib/spreadsheet_snippets.rb
requests = [{
  update_cells: {
    rows:   {
      values: [
        {
          pivot_table: {
            source:       {
              sheet_id:           source_sheet_id,
              start_row_index:    0,
              start_column_index: 0,
              end_row_index:      20,
              end_column_index:   7
            },
            rows:         [
              {
                source_column_offset: 1,
                show_totals:          true,
                sort_order:           'ASCENDING',
              },
            ],
            columns:      [
              {
                source_column_offset: 4,
                sort_order:           'ASCENDING',
                show_totals:          true,
              }
            ],
            values:       [
              {
                summarize_function:   'COUNTA',
                source_column_offset: 4
              }
            ],
            value_layout: 'HORIZONTAL'
          }
        }
      ]
    },
    start:  {
      sheet_id:     target_sheet_id,
      row_index:    0,
      column_index: 0
    },
    fields: 'pivotTable'
  }
}]
result = service.batch_update_spreadsheet(spreadsheet_id, body, {})