【问题标题】:Python - GSPREAD - Copy text and format from one google sheet to another onePython - GSPREAD - 将文本和格式从一张谷歌表格复制到另一张
【发布时间】:2021-04-11 08:27:41
【问题描述】:

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

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

我的第一次尝试是: 使用 IMPORTRANGE 仅使用谷歌驱动表功能。它很好地复制了数据,但我丢失了我想在目标文件中保留的格式。

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

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)

但是当我运行它时,它给了我以下错误:

Traceback(最近一次调用最后一次):

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

我该如何解决我的问题?

感谢您的帮助!

【问题讨论】:

    标签: python google-sheets request google-sheets-api gspread


    【解决方案1】:

    我相信你的目标和你目前的情况如下。

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

    修改点:

    • 很遗憾,batchUpdate 方法的“CopyPasteRequest”无法从 Google 电子表格复制到其他 Google 电子表格。看来这是目前的规范。

    • 为了不仅将值,而且将单元格​​格式从谷歌电子表格“A”复制到谷歌电子表格“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)
    

    参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-03
      • 2023-03-12
      • 2017-01-21
      • 1970-01-01
      • 2014-08-21
      • 2022-01-07
      • 2019-08-22
      • 1970-01-01
      相关资源
      最近更新 更多