如何使用 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 中最难理解的部分,关于UpdateSheetPropertiesRequestfields 参数,它告诉 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 电子表格中的(工作)表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用apache poi重命名excel中的名称

使用 Python 重命名目录中的多个文件

如何在 python 中提取之前重命名压缩文件的内容?

BIM 360 重命名文件夹 API

python重命名多个文件

如何使用 python 重命名 Windows 上的链接文件?