【问题标题】:How do I rename a (work)sheet in a Google Sheets spreadsheet using the API in Python?如何使用 Python 中的 API 重命名 Google Sheets 电子表格中的(工作)表?
【发布时间】: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(例如)
  • 你能把工作表数据复制到另一个名字不同的地方,然后把原来的删掉吗?您正在处理的文件有多大?

标签: python google-sheets google-api google-sheets-api google-api-python-client


【解决方案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);
            }
        

        【讨论】:

          猜你喜欢
          • 2019-04-20
          • 1970-01-01
          • 2018-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-21
          • 1970-01-01
          相关资源
          最近更新 更多