首页 > 解决方案 > 更新谷歌电子表格中的多个工作表

问题描述

我有一些看起来像这样的代码:

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

service = build('sheets', 'v4', credentials=creds)

spreadsheet = {
    'properties': {
        'title': 'Data Integrity Report Completed on {}'.format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    }
}
spreadsheet = service.spreadsheets().create(body=spreadsheet,
                                            fields='spreadsheetId').execute()
gsheet_id = spreadsheet.get('spreadsheetId')

response_date = service.spreadsheets().values().append(
        spreadsheetId=gsheet_id,
        valueInputOption='RAW',
        range='A1:Z100',
        body=dict(
            majorDimension='ROWS',
            values=miss_occ_df.T.reset_index().T.values.tolist())
    ).execute()

这段代码基本上创建了一个谷歌电子表格并将我的数据框附加到第一个工作表中。我想要的是有一个包含 3 个工作表的电子表格。我还需要命名每个工作表并将 3 个不同的数据框上传到每个工作表。我怎样才能做到这一点?

标签: python-3.xpandasgoogle-api

解决方案


  • 您想要实现以下目标。
    • 创建新的电子表格。
    • 您需要创建的电子表格中的 3 张工作表。
      • 您要重命名工作表。
    • 将值放到每张纸上。
  • 您想使用 google-api-python-client 和 Python 来实现它们。

如果我的理解是正确的,那么这个修改呢?我认为您的目标可以通过一个 API 调用来实现。但在您的情况下,似乎需要使用请求正文的二维数组。因此,在这个答案中,我想提出通过 2 个 API 调用来实现您的目标的方法。因此,请将此视为几个答案之一。

该方法的流程如下。

流动:

  1. 创建新的电子表格。
    • 那时,通过给出名称来创建 3 个工作表(工作表)。在这种情况下,使用 的方法create()
  2. 使用 的方法将值放入 3 张纸values().batchUpdate()
    • 在您的情况下,这些值被放入新的电子表格中。因此可以使用此方法放置值。

修改后的脚本:

请修改下面的脚本service = build('sheets', 'v4', credentials=creds)如下。并请设置工作表名称和值的变量。

# Please set worksheet names.
sheetNameForWorksheet1 = "sample1"
sheetNameForWorksheet2 = "sample2"
sheetNameForWorksheet3 = "sample3"

# Please set values for each worksheet. Values are 2 dimensional array.
valuesForWorksheet1 = miss_occ_df.T.reset_index().T.values.tolist()
valuesForWorksheet2 = miss_occ_df.T.reset_index().T.values.tolist()
valuesForWorksheet3 = miss_occ_df.T.reset_index().T.values.tolist()

spreadsheet = {
    'properties': {
        'title': 'Data Integrity Report Completed on {}'.format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    },
    "sheets": [
        {
            "properties": {
                "title": sheetNameForWorksheet1
            }
        },
        {
            "properties": {
                "title": sheetNameForWorksheet2
            }
        },
        {
            "properties": {
                "title": sheetNameForWorksheet3
            }
        }
    ]
}
spreadsheet = service.spreadsheets().create(body=spreadsheet, fields='spreadsheetId').execute()
gsheet_id = spreadsheet.get('spreadsheetId')

batch_update_values_request_body = {
    "data": [
        {
            "values": valuesForWorksheet1,
            "range": sheetNameForWorksheet1,
        },
        {
            "values": valuesForWorksheet2,
            "range": sheetNameForWorksheet2,
        },
        {
            "values": valuesForWorksheet3,
            "range": sheetNameForWorksheet3,
        }
    ],
    "valueInputOption": "USER_ENTERED"
}

response = service.spreadsheets().values().batchUpdate(spreadsheetId=gsheet_id, body=batch_update_values_request_body).execute()

笔记:

  • 此修改后的脚本假定您已经能够使用 Sheets API 向电子表格输入和获取值。

参考:

首先,请确认我对您的问题的理解是否正确。如果我误解了您的问题并且这不是您想要的方向,我深表歉意。


推荐阅读