【问题标题】:create google sheet with multiple worksheets使用多个工作表创建 Google 工作表
【发布时间】:2020-03-10 03:02:16
【问题描述】:

我尝试使用 google drive api 在指定文件夹中创建一个 google 表格。我的以下代码工作正常,除了我想创建一个包含多个工作表的文件。我试过properties。但是,它仍然显示为Sheet1

file_metadata = {'properties': {'title': 'test title'}, 'name': 'google sheets filename', 'parents': [google_folder_id], 'mimeType': 'application/vnd.google-apps.spreadsheet', }
google_sheets_metadata = self.__service.files().create(body=file_metadata).execute()

【问题讨论】:

    标签: python-3.x google-sheets google-drive-api


    【解决方案1】:
    • 您想为特定文件夹创建新的电子表格。
    • 您想通过创建多个工作表来创建新的电子表格。
    • 您希望使用 googleapis 和 python 来实现此目的。
    • 您已经能够使用 Drive API。

    如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

    问题和解决方法:

    Drive API 可以直接创建电子表格。但在这种情况下,无法使用多个工作表创建电子表格。所以在这种情况下,还需要使用 Sheets API。

    在使用以下脚本之前,请启用 Sheets API。并将https://www.googleapis.com/auth/spreadsheets 添加到范围。在这种情况下,请删除包含访问令牌和刷新令牌的凭证文件(token.pickle)并重新授权。这样,新的作用域就体现出来了。请注意这一点。

    模式一:

    在此模式中,使用Drive API的create方法将Spreadsheet创建到特定文件夹后,使用Sheets API的batchUpdate方法将2个工作表添加到创建的Spreadsheet中。

    示例脚本:

    sheets = build('sheets', 'v4', credentials=creds)
    drive = build('drive', 'v3', credentials=creds)
    
    google_folder_id = '###'
    file_metadata = {'properties': {'title': 'test title'}, 'name': 'google sheets filename', 'parents': [google_folder_id], 'mimeType': 'application/vnd.google-apps.spreadsheet'}
    google_sheets_metadata = drive.files().create(body=file_metadata).execute()
    fileId = google_sheets_metadata['id']
    body = {"requests": [{"addSheet": {}}, {"addSheet": {"properties": {"title": "sampleSheet"}}}]}
    res = sheets.spreadsheets().batchUpdate(spreadsheetId=fileId, body=body).execute()
    print(res)
    
    • 在这种情况下,第三张工作表名称为 sampleSheet 作为示例。

    模式 2:

    在此模式中,使用 Sheets API 的 create 方法将 Spreadsheet 创建到具有 3 个工作表的根文件夹后,使用 Drive API 的 update 方法将创建的 Spreadsheet 移动到特定文件夹。

    示例脚本:

    sheets = build('sheets', 'v4', credentials=creds)
    drive = build('drive', 'v3', credentials=creds)
    
    google_folder_id = '###'
    body = {"properties": {"title": "sampleSpreadsheet"}, "sheets": [{}, {}, {"properties": {"title": "sampleSheet"}}]}
    res = sheets.spreadsheets().create(body=body).execute()
    spreadsheetId = res['spreadsheetId']
    google_sheets_metadata = drive.files().update(fileId=spreadsheetId, removeParents='root', addParents=google_folder_id).execute()
    
    • 在这种情况下,第三张工作表名称为 sampleSheet 作为示例。

    注意:

    • 在上述脚本中,假设您的授权脚本有效。

    参考资料:

    如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    补充:

    当你想使用模式 1 并且你想给第 1 和第 2 个选项卡的工作表名称“a”和“b”时,脚本如下。

    使用 Drive API 创建新的电子表格时,创建的电子表格有第一个选项卡。因此,在您的情况下,需要将第一张工作表重命名为“a”并添加一张名为“b”的工作表。

    sheets = build('sheets', 'v4', credentials=creds)
    drive = build('drive', 'v3', credentials=creds)
    
    google_folder_id = '###'
    file_metadata = {'properties': {'title': 'test title'}, 'name': 'google sheets filename', 'parents': [google_folder_id], 'mimeType': 'application/vnd.google-apps.spreadsheet'}
    google_sheets_metadata = drive.files().create(body=file_metadata).execute()
    fileId = google_sheets_metadata['id']
    
    title = [{"addSheet": {"properties": {"title": name}}} for name in set(['b'])]
    title.append({"updateSheetProperties": {"fields": "title", "properties": {"title": "a", "index": 0}}})
    body = {"requests": title}
    res = sheets.spreadsheets().batchUpdate(spreadsheetId=fileId, body=body).execute()
    print(res)
    

    【讨论】:

    • 这是一个很好的答案,但是,我使用以下代码,title = [{"addSheet": {"properties": {"title": name}}} for name in set(['a', 'b'])] body = {"requests": title} response = self.__service.spreadsheets().batchUpdate(spreadsheetId=google_sheets_file_id, body=body).execute() 我创建了 3 张纸和“Sheet1”和“a”和“b”..但我只想要“a”和“ b"
    • @jacobcan118 感谢您的回复。我带来的不便表示歉意。根据您的回复,我又添加了一个示例脚本。你能确认一下吗?如果这不是您想要的结果,我再次道歉。
    • @jacobcan118 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,我深表歉意。到时候,可以问一下你现在的情况吗?我想学习解决你的问题。
    • 我有另一个 google api 问题,但与此问题无关,我可以离线问你吗? @田池
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2016-12-04
    相关资源
    最近更新 更多