Google sheets api 使用gspread和googlesheetsapi将工作表复制到多个工作簿

Google sheets api 使用gspread和googlesheetsapi将工作表复制到多个工作簿,google-sheets-api,gspread,Google Sheets Api,Gspread,我有一个名为“模板”的谷歌表单文件。它有两张工作表。我有100个其他文件,称为“Instance01”、“Instance02”等,其中有2个工作表,与“模板”中的工作表同名 我在“模板”中创建了一个新的工作表,名为“sheet3”。我想将它复制到100个“实例”文档中的每一个,并在每个实例中保留名称“sheet3” 我能用gspread实现这一点吗?怎么做?如果没有,是否有其他方法可以通过编程(或在合理的时间和精力范围内)实现此目的?@Tanaike comment为我们指明了方向。我在下面记

我有一个名为“模板”的谷歌表单文件。它有两张工作表。我有100个其他文件,称为“Instance01”、“Instance02”等,其中有2个工作表,与“模板”中的工作表同名

我在“模板”中创建了一个新的工作表,名为“sheet3”。我想将它复制到100个“实例”文档中的每一个,并在每个实例中保留名称“sheet3”


我能用gspread实现这一点吗?怎么做?如果没有,是否有其他方法可以通过编程(或在合理的时间和精力范围内)实现此目的?

@Tanaike comment为我们指明了方向。我在下面记录了我使用的代码

# Build the service and gspread agent
sheets_service = build('sheets', 'v4', credentials=credentials)
gc = gspread.authorize(credentials)

# Create functions to rename the sheet after copying
# For renaming sheets
# https://stackoverflow.com/questions/38074069/how-do-i-rename-a-worksheet-in-a-google-sheets-spreadsheet-using-the-api-in-py
def batch(requests, spreadsheetId, service):
    body = {
        'requests': requests
    }
    return service.spreadsheets().batchUpdate(spreadsheetId=spreadsheetId, body=body).execute()

def renameSheet(spreadsheetId, sheetId, newName, service):
    return batch({
        "updateSheetProperties": {
            "properties": {
                "sheetId": sheetId,
                "title": newName,
            },
            "fields": "title",
        }
    },
        spreadsheetId,
        service)

# Now execute the copies

# The ID of the spreadsheet containing the sheet to copy. Everybody has access!!!
spreadsheet_id = ORIGINAL_spreadsheet_id # template workbook

# The ID of the sheet to copy. Everybody has access!!!
sheet_id = original_sheet_id # template sheet id

for workbook_id in COPY_TO: #COPY_TO is a list of workbooks ids
    print(workbook_id)
    destiny_spreadsheet_id = workbook_id
    copy_sheet_to_another_spreadsheet_request_body = {
      "destinationSpreadsheetId": destiny_spreadsheet_id
    }

    request = sheets_service.spreadsheets().sheets().copyTo(spreadsheetId=spreadsheet_id, sheetId=sheet_id, body=copy_sheet_to_another_spreadsheet_request_body)
    response = request.execute()

    # Rename it
    copied_to_sheet = gc.open_by_key(destiny_spreadsheet_id) #template.worksheet(destiny)
    sheet = copied_to_sheet.worksheet('Copy of ' + NAME_OF_SHEET_TO_BE_COPIED)
    renameSheet(destiny_spreadsheet_id, sheet.id, NAME_OF_SHEET_TO_BE_COPIED, sheets_service)

作为复制工作表的方法,在sheets API中有“spreadsheets.sheets.copyTo”方法

您可以在中看到一个示例脚本。我认为,因为凭证对象可以用于gspread和GoogleAppClient,所以它可能有助于实现这一点

参考:

例如,如何使用
电子表格().sheets().copyTo()
?这可能对您的情况有用。请选择要讨论的问题:包括重复问题的问题。寻求调试帮助的问题(“为什么这段代码没有按我想要的方式工作?”)必须包括:(1)所需的行为,(2)特定的问题或错误,(3)在问题本身中重现它所需的最短代码。另请参见:,和@Mr.Rebot,我的描述是否非最小、不完整或不可验证?问题中描述了所需的行为。没有(2)个错误或(3)个代码,因为这就是我要寻找的。我还没有测试塔奈克的答案,但它似乎很有希望。@塔奈克,你的答案做到了。我将在这里记录它作为一个答案,但如果您希望添加您的评论作为答案,我将选择它作为正确的答案,以给予适当的评分。@pedrovgp首先,感谢您的回复。我很高兴你的问题解决了。也谢谢你的关心。我贴出了答案。你能确认一下吗?如果你需要更多的信息,请告诉我。我想修改它。