将谷歌电子表格另存为新表格



UPDATE显示在我问题的末尾。

我能够使用Python和gspread:创建一个新的谷歌电子表格

import gspread
from oauth2client.service_account import ServiceAccountCredentials
from pprint import pprint
from googleapiclient import discovery
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
gc = gspread.authorize(credentials)
service = discovery.build('sheets', 'v4', credentials=credentials)
spreadsheet_body = {
"properties": {
"title": "xxGoogleAPIMasterTemplatexx"
}
}
request = service.spreadsheets().create(body=spreadsheet_body)
response = request.execute()
gc.insert_permission(response['spreadsheetId'], 'xxxxx@zzzz-yyyyyy.iam.gserviceaccount.com', perm_type='user', role='owner')
gc.insert_permission(response['spreadsheetId'], 'xxxx.xxxx@gmail.com', perm_type='user', role='owner')

这很好用。

我的目标是使用模板谷歌电子表格,复制它,然后编辑副本(一些单元格-->,这很容易,我可以确认我已经完成了这一部分)并重命名它。

我想做的是:

  • 复制现有的电子表格。然后我只需要知道复制的电子表格的名称或id
  • 打开现有电子表格并另存为新电子表格
  • 在上面的脚本中添加电子表格正文。更具体地说,编辑这个部分:

    spreadsheet_body={"属性":{"title":"xxGoogleAPIMasterTemplatexx"}}

以使其包含单元格中的所有标头和值。这可能吗?如何从现有的电子表格中查看属性?

我还没有找到有效的东西。我只找到了如何将表格(选项卡)从一个谷歌电子表格复制到另一个。

附言:我正在使用API V4。

更新:

我遵循了这个问题的第一个答案。因此,我创建了一个脚本,可以将一张表格复制到另一个电子表格中。

import gspread
from oauth2client.service_account import ServiceAccountCredentials
from pprint import pprint
from googleapiclient import discovery
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
gc = gspread.authorize(credentials)
service = discovery.build('sheets', 'v4', credentials=credentials)
# The ID of the spreadsheet containing the sheet to copy.
spreadsheet_id = 'xxxxxx'   
# The ID of the sheet to copy.
sheet_id = 730266781  # TODO: Update placeholder value.
copy_sheet_to_another_spreadsheet_request_body = {
# The ID of the spreadsheet to copy the sheet to.
'destination_spreadsheet_id': 'yyyy',  
# TODO: Add desired entries to the request body.
}
request = service.spreadsheets().sheets().copyTo(spreadsheetId=spreadsheet_id, sheetId=sheet_id, body=copy_sheet_to_another_spreadsheet_request_body)
response = request.execute()
# TODO: Change code below to process the `response` dict:
pprint(response)

但我得到了这个错误:

https://sheets.googleapis.com/v4/spreadsheets/xxxxxx/sheets/730266781:copyTo?alt=jsonreturn"调用者没有权限">

因此,我首先尝试授予credentials.json文件中提到的用户访问权限(xxxx-yyyy@bbbbb-182311.iam.gserviceaccount.com)

然后我也尝试使用这条线:

gc.insert_permission(response['spreadsheetId'], 'xxxx-yyyy@bbbbb-182311.iam.gserviceaccount.com', perm_type='user', role='owner')

我没能找到解决方案,所以我跳过了这一部分。我公开了模板。

下面的解决方法如何?我认为有两种模式。

模式1:

  1. 使用service.spreadsheets().create()使用{ "properties": { "title": "xxGoogleAPIMasterTemplatexx" } }创建新的电子表格。
    • 可以返回文件ID和文件名
  2. 使用service.spreadsheets().sheets().copyTo()将模板电子表格复制到新的电子表格中

在这种情况下,只使用活页API。

模式2:

  1. 使用service.files().copy()复制标题为{"name": "xxGoogleAPIMasterTemplatexx"}的模板电子表格。
    • 可以返回文件ID和文件名

在这种情况下,只使用驱动器API。

关于其他问题:

  1. Q:,以便使其包含单元格中的所有标头和值。这可能吗?
    • A:这可以通过复制模板表来实现。这对于两种模式都是可能的。如果要将数据从其他电子表格复制到复制的电子表格,可以使用values.get和values.update
  2. Q:如何从现有电子表格中查看属性?
    • A:您可以使用service.spreadsheets().get()作为fields=properties检索属性

参考文献:

您可以在这些引用中看到示例脚本。

  • service.spreadsheets().sheets().copyTo()
  • service.files().copy()
  • service.spreadsheets().get()

如果我误解了你的问题,我很抱歉。

编辑:

为了删除带有id=0的工作表,您可以使用以下脚本。

batch_update_spreadsheet_request_body = {
"requests": [{
"deleteSheet": {
"sheetId": 0
}
}]
}
service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body=batch_update_spreadsheet_request_body)

参考:

  • https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate

最新更新