pythongspread将文本和格式从一个google工作表复制到另一个工作表

2024-04-25 22:58:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个文件在谷歌驱动器(两个谷歌表),我需要从一个文件到另一个文件的数据和格式在一个常规模式

如下图所示,我需要维护不同的文本格式(粗体、文本颜色等):

enter image description here

我的第一次尝试是: 使用IMPORTRANGE仅使用google驱动表函数。它可以很好地复制数据,但我不想在目标文件中保留格式

我的第二个尝试是: 使用Python和gspread包将数据和格式从源googlesheet复制到目标googlesheet。我有以下代码:

import gspread
from oauth2client.service_account import ServiceAccountCredentials
   
source_file_sheet = 'https://docs.google.com/spreadsheets/X'
destination_file_sheet = 'https://docs.google.com/spreadsheets/Y'
service_key = "file.json"
scope = ["https://spreadsheets.google.com/feeds", 'https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive']

creds_file = ServiceAccountCredentials.from_json_keyfile_name(service_key, scope)
sourceSheetName = cod_source_system_file_operational 
destinationSheetName = cod_source_system_file_billing 

client = gspread.authorize(creds_file)
spreadsheet_source = client.open_by_url(source_file_sheet)
spreadsheet_destination = client.open_by_url(destination_file_sheet)
sourceSheetId = spreadsheet_source.worksheet('Sheet1')
destinationSheetId = spreadsheet_destination.worksheet('Sheet2')
body = {
    "requests": [
        {
            "copyPaste": {
                "source": {
                    "sheetId": sourceSheetId,
                    "startRowIndex": 3,
                    "endRowIndex": 10,
                    "startColumnIndex": 0,
                    "endColumnIndex": 5
                },
                "destination": {
                    "sheetId": destinationSheetId,
                    "startRowIndex": 0,
                    "endRowIndex": 10,
                    "startColumnIndex": 0,
                    "endColumnIndex": 5
                },
                "pasteType": "PASTE_NORMAL"
            }
        }
    ]
}
res = destinationSheetId.batch_update(body)
print(res)

但当我运行此程序时,它会给我以下错误:

回溯(最近一次呼叫最后一次):

dict(vr, range=absolute_range_name(self.title, vr['range']))
TypeError: string indices must be integers

我怎样才能解决我的问题

谢谢你的帮助


Tags: 文件数据httpscomsourcewww格式service
1条回答
网友
1楼 · 发布于 2024-04-25 22:58:45

我相信你的目标和现状如下

  • 您希望将Google电子表格“A”中特定工作表的值复制到Google电子表格“B”中的特定工作表
  • 不仅要复制值,还要复制单元格格式
  • 您希望使用gspread for python实现这一点
  • 您已经能够使用Sheets API获取和输入Google电子表格的值

修改点:

  • 不幸的是,batchUpdate方法的“CopyPasteRequest”无法从Google电子表格复制到其他Google电子表格。这似乎是当前的规范

  • 为了将值以及单元格格式从Google电子表格“A”复制到Google电子表格“B”,我想提出以下流程

    1. 将源电子表格中的源工作表复制到目标电子表格
    2. 将格式为的值从复制的图纸复制到目标图纸。然后,删除复制的工作表

当上述各点反映到脚本中时,它将变成如下所示

示例脚本:

在这个示例脚本中,我准备了下面的脚本client = gspread.authorize(credentials),如下所示。在使用之前,请设置变量

client = gspread.authorize(credentials)

sourceSpreadsheetId = "###" # Please set the source Spreadsheet ID.
sourceSheetName = "Sheet1" # Please set the source sheet name.
destinationSpreadsheetId = "###" # Please set the destination Spreadsheet ID.
destinationSheetName = "Sheet2" # Please set the destination sheet name.

srcSpreadsheet = client.open_by_key(sourceSpreadsheetId)
srcSheet = srcSpreadsheet.worksheet(sourceSheetName)
dstSpreadsheet = client.open_by_key(destinationSpreadsheetId)
dstSheet = dstSpreadsheet.worksheet(destinationSheetName)

# 1. Copy the source sheet in the source Spreadsheet to the destination Spreadsheet.
copiedSheet = srcSheet.copy_to(destinationSpreadsheetId)
copiedSheetId = copiedSheet["sheetId"]

# 2. Copy the values with the format from the copied sheet to the destination sheet. And, delete the copied sheet.
body = {
    "requests": [
        {
            "copyPaste": {
                "source": {
                    "sheetId": copiedSheetId,
                    "startRowIndex": 3,
                    "endRowIndex": 10,
                    "startColumnIndex": 0,
                    "endColumnIndex": 5
                },
                "destination": {
                    "sheetId": dstSheet.id,
                    "startRowIndex": 0,
                    "endRowIndex": 10,
                    "startColumnIndex": 0,
                    "endColumnIndex": 5
                },
                "pasteType": "PASTE_NORMAL"
            }
        },
        {
            "deleteSheet": {
                "sheetId": copiedSheetId
            }
        }
    ]
}
res = dstSpreadsheet.batch_update(body)
print(res)

参考文献:

相关问题 更多 >

    热门问题