将 spreadsheet sheet 复制到另一个 Google API 使用 Python
Copy spreadsheet sheet to a another one with Google API using Python
我正在尝试从模板创建 google 传播sheet,然后编辑其值(单元格)。手动地,我只是访问原始的 spreadsheet 并从 File 菜单中单击 Make a copy。我还没有找到使用 Python3 和 gspread 来做到这一点的方法。所以,我正在尝试寻找解决方法。
所以,我正在使用 Python 脚本来创建新的 google sheets,如代码片段所示(我在这里仅将其用作此问题的查看器):
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()
#Changing permissions for the user (from the credentials.json) and then the real user (me)
gc.insert_permission(response['spreadsheetId'], 'xxx@xxx-182311.iam.gserviceaccount.com', perm_type='user', role='owner')
gc.insert_permission(response['spreadsheetId'], 'xxx.xxx@gmail.com', perm_type='user', role='owner')
新传播sheet如我所料(脚本)被称为xxGoogleAPIMasterTemplatexx。现在,我正在尝试将一个 sheet 从一个 spreadsheet(原始模板)复制到新创建的 spreadsheets。
我现在的步骤是首先测试copy_to_spreadsheet works
是否针对特定的ID。我使用了以下脚本:
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)
# The ID of the spreadsheet containing the sheet to copy. Everybody has access!!!
spreadsheet_id = '1lw6FVG_gSDseDdseS54jOyXph74k_XfTvnyU2Wqd7yo'
#sheet = gc.open_by_key(response['spreadsheet_id']).Sheet1
# The ID of the sheet to copy. Everybody has access!!!
sheet_id = 0
copy_sheet_to_another_spreadsheet_request_body = {
{
"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
}
}
request = service.spreadsheets().sheets().copyTo(spreadsheetId=spreadsheet_id, sheetId=sheet_id, body=copy_sheet_to_another_spreadsheet_request_body)
response = request.execute()
我得到了这个错误:
"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
TypeError: unhashable type: 'dict'
我猜 ID 必须是可哈希的。添加此行后:
key = frozenset(dict_key.spreadsheet_id)
还是不行。
请注意,出于测试目的,我将文件的权限更改为全局权限:
下面的修改怎么样?
我认为错误的意思是"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
的结构不对。当它看到 the document of spreadsheets.sheets.copyTo 的右侧时,请求正文是 {"destinationSpreadsheetId": ""}
。所以请尝试以下修改。
发件人:
copy_sheet_to_another_spreadsheet_request_body = {
{
"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
}
}
收件人:
copy_sheet_to_another_spreadsheet_request_body = {
"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
}
如果我误解了你的问题,我很抱歉。
编辑:
对于下一个错误,我确认了以下模式。
- 当使用此脚本的用户是您要复制的电子表格的所有者时,当然,脚本可以正常工作。
- 如果使用此脚本的用户不是您要复制的电子表格的所有者,
- 如果未共享电子表格,则出现
"The caller does not have permission"
错误。此错误可能与您的情况相同。
- 如果将电子表格共享为
On - Anyone with the link
,脚本可以正常工作。
根据以上结果,您能否再次确认要复制的电子表格的权限?
我正在尝试从模板创建 google 传播sheet,然后编辑其值(单元格)。手动地,我只是访问原始的 spreadsheet 并从 File 菜单中单击 Make a copy。我还没有找到使用 Python3 和 gspread 来做到这一点的方法。所以,我正在尝试寻找解决方法。
所以,我正在使用 Python 脚本来创建新的 google sheets,如代码片段所示(我在这里仅将其用作此问题的查看器):
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()
#Changing permissions for the user (from the credentials.json) and then the real user (me)
gc.insert_permission(response['spreadsheetId'], 'xxx@xxx-182311.iam.gserviceaccount.com', perm_type='user', role='owner')
gc.insert_permission(response['spreadsheetId'], 'xxx.xxx@gmail.com', perm_type='user', role='owner')
新传播sheet如我所料(脚本)被称为xxGoogleAPIMasterTemplatexx。现在,我正在尝试将一个 sheet 从一个 spreadsheet(原始模板)复制到新创建的 spreadsheets。
我现在的步骤是首先测试copy_to_spreadsheet works
是否针对特定的ID。我使用了以下脚本:
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)
# The ID of the spreadsheet containing the sheet to copy. Everybody has access!!!
spreadsheet_id = '1lw6FVG_gSDseDdseS54jOyXph74k_XfTvnyU2Wqd7yo'
#sheet = gc.open_by_key(response['spreadsheet_id']).Sheet1
# The ID of the sheet to copy. Everybody has access!!!
sheet_id = 0
copy_sheet_to_another_spreadsheet_request_body = {
{
"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
}
}
request = service.spreadsheets().sheets().copyTo(spreadsheetId=spreadsheet_id, sheetId=sheet_id, body=copy_sheet_to_another_spreadsheet_request_body)
response = request.execute()
我得到了这个错误:
"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
TypeError: unhashable type: 'dict'
我猜 ID 必须是可哈希的。添加此行后:
key = frozenset(dict_key.spreadsheet_id)
还是不行。
请注意,出于测试目的,我将文件的权限更改为全局权限:
下面的修改怎么样?
我认为错误的意思是"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
的结构不对。当它看到 the document of spreadsheets.sheets.copyTo 的右侧时,请求正文是 {"destinationSpreadsheetId": ""}
。所以请尝试以下修改。
发件人:
copy_sheet_to_another_spreadsheet_request_body = {
{
"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
}
}
收件人:
copy_sheet_to_another_spreadsheet_request_body = {
"destinationSpreadsheetId": "1d8CeUxukBIOUpADE6eBlaksS2ptBjI0vIRpVm8ufEbs"
}
如果我误解了你的问题,我很抱歉。
编辑:
对于下一个错误,我确认了以下模式。
- 当使用此脚本的用户是您要复制的电子表格的所有者时,当然,脚本可以正常工作。
- 如果使用此脚本的用户不是您要复制的电子表格的所有者,
- 如果未共享电子表格,则出现
"The caller does not have permission"
错误。此错误可能与您的情况相同。 - 如果将电子表格共享为
On - Anyone with the link
,脚本可以正常工作。
- 如果未共享电子表格,则出现
根据以上结果,您能否再次确认要复制的电子表格的权限?