Python 将google电子表格另存为新

Python 将google电子表格另存为新,python,google-apps-script,google-api,gspread,Python,Google Apps Script,Google Api,Gspread,更新显示在我的问题的末尾 我能够使用Python和gspread创建一个新的google电子表格: import gspread from oauth2client.service_account import ServiceAccountCredentials from pprint import pprint from googleapiclient import discovery scope = ['https://spreadsheets.google.com/feeds',

更新显示在我的问题的末尾

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

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
  • 打开现有电子表格并另存为新表格
  • 在上面的脚本中添加电子表格主体。更具体地说,编辑此部分:

    电子表格\u正文={ “财产”:{ “标题”:“xxGoogleAPIMasterTemplatexx” } }

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

我还没有找到有效的方法。我只知道如何将一张表格(标签)从一个谷歌电子表格复制到另一个

PS:我使用的是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=json 返回“呼叫方没有权限”>

因此,我首先尝试向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:
  • 使用
    service.spreadsheets().Create()
    使用
    service.spreadsheets()。
    
    • 可以返回文件ID和文件名
  • 使用
    service.spreadsheets().sheets().copyTo()
    将模板电子表格复制到新电子表格
  • 在这种情况下,仅使用Sheets API

    模式2:
  • 使用
    service.files().Copy()
    复制标题为
    {“name”:“xxGoogleAPIMasterTemplatexx”}
    的模板电子表格。
    • 可以返回文件ID和文件名
  • 在这种情况下,只使用驱动器API

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

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

    编辑: 要删除id为0的工作表,可以使用以下脚本

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

    我正在研究这个问题。到目前为止,我有两个问题。权限错误以及我无法将电子表格ID动态放置在花括号部分(将表格复制到另一个电子表格请求正文)。我很快会更新这个问题。第一个选项有效。下一步是删除第一张图纸(id=0)。谢谢:)@Apolo Radomer欢迎您。也谢谢你。我更新了我的答案。请确认。这是我尝试过的,但失败了,因为我还在请求中添加了sheetId。我把它取了下来,效果很好。结果与您的代码相同:)@Apolo Radomer谢谢您提供更多信息。