【问题标题】:How do you modify an existing protected range in Google sheets with a python script如何使用 python 脚本修改 Google 表格中现有的受保护范围
【发布时间】:2020-01-26 06:10:28
【问题描述】:

我目前正在使用 gspread 访问谷歌表格,我想使用 python 保护一定范围,但我不知道如何去做。例如,受保护范围现在是 'Form Responses 1'!3:500,我想将其更新为 'Form Responses 1'!3:800。

我在使用 google API 方面还是新手,并尝试阅读此处的文档,但我不完全了解如何实现它。 https://developers.google.com/sheets/api/samples/ranges

【问题讨论】:

  • 您要保护哪些范围?你的3:5003:800 是行还是列?您需要为列和行指定开始和结束。

标签: python google-sheets-api protected gspread


【解决方案1】:

答案:

为了更新受保护的范围,您需要发出batchUpdate 请求并指定namedRangeIdprotectedRangeId

使用表格 API:

构建您的请求:

request = {
            "requests": [
              {
                "updateNamedRange": {
                  "namedRange": {
                    "name" : "New name", #optional, only if you want to change the name
                    "namedRangeId": "<named-range-id>",
                    "range": {
                      "sheetId": "<sheet-id>",
                      "startRowIndex": int,
                      "endRowIndex": int,
                      "startColumnIndex": int,
                      "endColumnIndex": int,
                    },
                  },
                 "fields": "*"
                }
              },
              {
                "updateProtectedRange": {
                  "protectedRange": {
                    "protectedRangeId": <protected-range-id>,
                    "namedRangeId": "<named-range-id>",
                    "warningOnly": False,
                    "editors": {
                      "users": [
                        "user1@email.com",
                        "user2@email.com",
                      ],
                    }
                  },
                  "fields": "*"
                }
              }
            ]
          }

然后使用发现库发送您的请求:

from googleapiclient import discovery

def main():
    # authentication code goes here
    service = discovery.build('sheets', 'v4', credentials = <your-#credentials>)

    spreadsheetID = '<your-spreadsheet-ID>'
    request = {dictionary-object-built-above}

    req = service.spreadsheet().batchUpdate(spreadsheetId = spreadsheetID, body = request)
    response = req.execute()    

或者使用 gspread 库:

启用 API 并获得服务帐户密钥 as per the gspread documentation 后,您可以像上面那样构建您的请求,但 您需要确保将服务帐户电子邮件添加给可以编辑受保护的用户范围

request = {
            "requests": [
              {
                "updateNamedRange": {
                  "namedRange": {
                    "name" : "New name", #optional, only if you want to change the name
                    "namedRangeId": "<named-range-id>",
                    "range": {
                      "sheetId": "<sheet-id>",
                      "startRowIndex": int,
                      "endRowIndex": int,
                      "startColumnIndex": int,
                      "endColumnIndex": int,
                    },
                  },
                 "fields": "*"
                }
              },
              {
                "updateProtectedRange": {
                  "protectedRange": {
                    "protectedRangeId": <protected-range-id>,
                    "namedRangeId": "<named-range-id>",
                    "warningOnly": False,
                    "editors": {
                      "users": [
                        "user1@email.com",
                        "serviceacc@projectname-XXXXXXXXXXXXX.iam.gserviceaccount.com",
                      ],
                    }
                  },
                  "fields": "*"
                }
              }
            ]
          }

然后使用 gspread 发出请求:

import gspread
from oauth2client.service_account import ServiceAccountCredentials

def main():
    scope = ['https://www.googleapis.com/auth/spreadsheets']
    credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)

    gc = gspread.authorize(credentials)
    response = gc.open_by_key('<spreadsheet-id>').batch_update(request)

    print(response)

参考资料:

【讨论】:

  • 看来 OP 可能希望通过 gspread 来实现这一点。添加使用 gspread 的示例脚本后,它可能对 OP 更有用。如果我误解了 OP 的目标,我深表歉意。
  • @Tanaike gspread 没有编辑受保护范围的功能,这需要通过 API 完成。
  • 感谢您的回复。 “编辑保护范围”是通过 Sheets 的电子表格.batchUpdate 方法实现的。在您的脚本中,google-api-python-client 使用 Sheets API 的电子表格.batchUpdate 方法。在这种情况下,gspread 可以使用 Sheets API 的 batchUpdate 方法。 Ref 所以我认为,当不仅提出您的带有 google-api-python-client 的示例脚本,还提出带有 gspread 的示例脚本时,它们可能对 OP 和其他用户更有用。
  • @Tanaike 感谢您提供文档链接,我现在将使用 gspread 用法更新我的答案。
  • 感谢您回复并添加更多信息。我认为这是一个很好的答案,将对 OP 和其他用户有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多