我正在尝试从模板创建一个谷歌电子表格,然后编辑它的值(单元格)。手动,我只是访问原始电子表格,然后单击 文件 菜单中单击 复制一份 。我还没有找到使用 Python3 和 gspread 做到这一点的方法。所以,我试图找到一种解决方法。

因此,我正在使用 Python 脚本来创建新的谷歌工作表,如代码段所示(我在此处仅将其用作此问题的查看器):

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'], '[email protected]', perm_type='user', role='owner')
gc.insert_permission(response['spreadsheetId'], '[email protected]', perm_type='user', role='owner')


新电子表格如我所料(脚本)被称为 xxGoogleAPIMasterTemplatexx 。现在,我正在尝试将工作表从一个电子表格(原始模板)复制到新创建的电子表格。

我现在的步骤是首先测试特定 ID 的 copy_to_spreadsheet works 是否。我使用了以下脚本:

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)

它仍然无法正常工作。

请注意,出于测试目的,我将文件的权限更改为全局:
python - 使用 Python 使用 Google API 将电子表格工作表复制到另一个工作表-LMLPHP

最佳答案

下面的修改怎么样?

我认为错误意味着"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 共享,则脚本可以正常工作。

  • 从上面的结果,您能否再次确认您要复制的电子表格的权限?

    关于python - 使用 Python 使用 Google API 将电子表格工作表复制到另一个工作表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46792942/

    10-12 21:03