如何使用 Python 中的 API 重命名 Google Sheets 电子表格中的(工作)表?
Posted
技术标签:
【中文标题】如何使用 Python 中的 API 重命名 Google Sheets 电子表格中的(工作)表?【英文标题】:How do I rename a (work)sheet in a Google Sheets spreadsheet using the API in Python? 【发布时间】:2016-10-30 15:42:40 【问题描述】:长期以来,我一直在尝试/寻求解决这个问题。 我已阅读 gspread 的文档,但找不到重命名工作表的方法。 你们有谁知道怎么做?我将不胜感激! 确实有 worksheet.title 给出了工作表的名称,但我找不到重命名实际工作表的方法。
提前谢谢你!
【问题讨论】:
您可以在 Google Apps 脚本的帮助下实现这一点。您可以使用 rename(newName) 重命名文档。 var ss = SpreadsheetApp.getActiveSpreadsheet(); ss.rename("这是新名字");如果要将当前活动工作表重命名为给定的新名称,可以调用 renameActiveSheet(newName)。 // 下面的代码会将活动工作表重命名为“Hello world” SpreadsheetApp.getActiveSpreadsheet().renameActiveSheet("Hello world");欲了解更多信息。检查这个documentation @KENdi 但同样,如何在 python 中做到这一点? 它似乎与以下请求有关:“updateSheetProperties”: object(UpdateSheetPropertiesRequest),其中 UpdateSheetPropertiesRequest 被描述为:“使用指定的 sheetId 更新工作表的属性。” ...除了我发现无法设置 sheetId developers.google.com/sheets/reference/rest/v4/spreadsheets/… @Christophe I tihk 在 Google Sheet API Doc 中最难理解的部分,关于UpdateSheetPropertiesRequest
是 fields
参数,它告诉 API 请求在请求期间应该编辑什么。在下面的示例中,sheetId
仅用于更新标题。我不知道,将fields
参数更改为“sheetId”,该请求是否能够更新 sheetId(例如)
你能把工作表数据复制到另一个名字不同的地方,然后把原来的删掉吗?您正在处理的文件有多大?
【参考方案1】:
这是我个人编写的库的摘录:
def _batch(self, requests):
body =
'requests': requests
return self._service.spreadsheets().batchUpdate(spreadsheetId=self.spreadsheetId, body=body).execute()
def renameSheet(self, sheetId, newName):
return self._batch(
"updateSheetProperties":
"properties":
"sheetId": sheetId,
"title": newName,
,
"fields": "title",
)
我认为只要稍加努力,您就可以将其实现到您的代码中并获得您想要的东西。
为了进行batchUpdate
调用,您将需要电子表格ID 以及初始化的service
,如Python QUickstart - Google Sheet API 中所述
【讨论】:
这个答案只是超级简化了“FieldMasks”。为什么它必须如此复杂但很好的答案。 我同意你的看法,我能想到的唯一答案是 Google 采用这种方法是为了从任何类型的功能中抽象出来,并通过单一方法支持几乎任何类型的操作 提示:如果你想重命名第一张工作表并且你没有 sheetId,你可以省略 sheetId 属性 如果您想通过batchupdate UpdateSheetProperties
api 调用一次修改多个属性,请查看JSON request structure:添加您的“属性”和逗号-在“字段”字符串内容中分离他们的名字。 FieldMasks 格式很复杂,但我找到了一个很好的解释 here【参考方案2】:
您的答案可以通过来自 Python 的 HTTP 请求来解决。
链接是here
您需要通过 HTTP 为工作表发送某种元数据。
例如,使用 Python 获取工作表的 ID,并发送以下信息:
<entry>
<id>
https://spreadsheets.google.com/feeds/worksheets/key/private/full/worksheetId
</id>
<updated>2007-07-30T18:51:30.666Z</updated>
<category scheme="http://schemas.google.com/spreadsheets/2006"
term="http://schemas.google.com/spreadsheets/2006#worksheet"/>
<title type="text">Income</title>
<content type="text">Expenses</content>
<link rel="http://schemas.google.com/spreadsheets/2006#listfeed"
type="application/atom+xml" href="https://spreadsheets.google.com/feeds/list/key/worksheetId/private/full"/>
<link rel="http://schemas.google.com/spreadsheets/2006#cellsfeed"
type="application/atom+xml" href="https://spreadsheets.google.com/feeds/cells/key/worksheetId/private/full"/>
<link rel="self" type="application/atom+xml"
href="https://spreadsheets.google.com/feeds/worksheets/key/private/full/worksheetId"/>
<link rel="edit" type="application/atom+xml"
href="https://spreadsheets.google.com/feeds/worksheets/key/private/full/worksheetId/version"/>
<gs:rowCount>45</gs:rowCount>
<gs:colCount>15</gs:colCount>
</entry>
该网站也有 Java 和 .NET 解决方案。 (这是针对旧版 3)
对于较新的版本,您也可以通过 Python 的 POST http 请求使用批量更新。
链接是here
请求的数据是
"requests": [
"updateSpreadsheetProperties":
"properties": "title": "My New Title",
"fields": "title"
]
通过 POST 发送到https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId:batchUpdate
在这两个请求中,将 URL 中的电子表格 ID 替换为您正在编辑的 Google 表格的 ID。
注意 URL 中从 v3 到 v4 的变化。
如果您使用的是版本 3 应用程序并想要迁移,则指向该应用程序的链接是 here
编辑
一位评论员指出,第二个请求不会更改工作表的名称。我添加的链接显示了更改工作表复杂属性的方法,我将很快更新我的答案。
【讨论】:
请注意,您发布的请求与更改电子表格有关(因此您的请求将重命名整个电子表格),但用户明确要求如何重命名工作表. 啊,是的,我意识到第二个请求并没有这样做,但是,我链接到的页面显示了电子表格的更复杂的属性,这些属性也可以编辑。但是,已弃用(但仍然有效)的 API 请求也应该更改工作表的名称,因为 OP 可以从他们的代码中获取工作表的 ID(他们提到他们可以获得标题,所以他们也可以 ID) 为了更新特定工作表需要添加的只是指定一个工作表ID,例如 "requests": [ "updateSheetProperties": "properties": "sheetId": "My Sheet ID", "title": "My New Title" , "fields": "title" ]
; http地址是一样的。【参考方案3】:
您可以使用 api v4 的 gspread 端口实现同样的效果:pygsheets(作者在此处)。
使用 pygsheets 的相应代码是:
import pygsheets
gc = pygsheets.authorize()
# open spreadsheet and then worksheet
sh = gc.open('my new spreadsheet')
wks = sh.sheet1
wks.title = 'new title'
【讨论】:
【参考方案4】:虽然标题说使用 API,但问题详情 OP 想使用 gspread API(而不是直接调用 Google Spreadsheets API)。
我很惊讶这个问题还没有答案。也许 gspread 在发布问题时没有这种方法,但现在 it is as simple 使用 update_title
方法:
import gspread
# authenticate:
gc = gspread.service_account()
# choose a gspread method to open your spreadsheet and your worksheet:
wsh = gc.open_by_key(spreadsheetId).worksheet("old_WorkSheetName")
# update your worksheet name:
wsh.update_title("new_WorksheetName")
就是这样。
【讨论】:
这是最好的答案【参考方案5】:如果您使用的是 Node,这对我有用:
import google from 'googleapis';
const auth = new google.auth.OAuth2(...)
const sheetsService = google.sheets(version: 'v4', auth)
const requests = [
updateSheetProperties:
properties:
sheetId: 'id-of-the-sheet-that-you-want-to-rename',
title: 'new-title',
,
fields: 'title'
];
sheetsService.spreadsheets.batchUpdate(
spreadsheetId: 'some-spreasheet-id',
requestBody:
requests,
,
);
【讨论】:
【参考方案6】:这也可以仅使用 Google API 方法实现。
这是一个无 json 的解决方案。
sheetsService = getSheetsService();
// create a SheetProperty object and put there all your parameters (new title, sheet id, something else)
SheetProperties title = new SheetProperties().setSheetId(0).setTitle("Main");
// make a request with this properties
UpdateSheetPropertiesRequest rename = new UpdateSheetPropertiesRequest().setProperties(title);
// set fields you want to update
rename.setFields("title");
// as requestBody.setRequests gets a list, you need to compose an list from your request
List<Request> requests = new ArrayList<>();
// convert to Request
Request request = new Request().setUpdateSheetProperties(rename);
requests.add(request);
BatchUpdateSpreadsheetRequest requestBody = new BatchUpdateSpreadsheetRequest();
requestBody.setRequests(requests);
// now you can execute batchUpdate with your sheetsService and SHEET_ID
sheetsService.spreadsheets().batchUpdate(SHEET_ID, requestBody).execute();
Here 你可以在 sheetProperties 上找到更多信息
【讨论】:
这确实是 Java 的完美解决方案。像魅力一样工作。谢谢!【参考方案7】:对于那些使用 NodeJS 解决此重命名问题的人。只需使用 batchRequest API。在 sheetID 中指明您正在编辑的工作表 ID,并在标题字段中指明新标题。然后在字段中注明“标题”。
【讨论】:
【参考方案8】:在 php 中
public function updateSheetTitle(string $fileId, string $title, ?int $sheetId = NULL): void
if (!$sheetId)
// rename first sheet
$file = $this->get($fileId);
if (!$file->getSheets())
throw new NoSheetsException();
$sheetId = $file->getSheets()[0]->getProperties()->getSheetId();
$titleProp = new Google_Service_Sheets_SheetProperties();
$titleProp->setSheetId($sheetId);
$titleProp->setTitle($title);
$renameReq = new Google_Service_Sheets_UpdateSheetPropertiesRequest();
$renameReq->setProperties($titleProp);
$renameReq->setFields('title');
$request = new Google_Service_Sheets_Request();
$request->setUpdateSheetProperties($renameReq);
$batchUpdateRequest = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest();
$batchUpdateRequest->setRequests([$request]);
$this->spreadsheets->batchUpdate($fileId, $batchUpdateRequest);
【讨论】:
以上是关于如何使用 Python 中的 API 重命名 Google Sheets 电子表格中的(工作)表?的主要内容,如果未能解决你的问题,请参考以下文章