如何使用 python 脚本修改 Google 表格中现有的受保护范围

Posted

技术标签:

【中文标题】如何使用 python 脚本修改 Google 表格中现有的受保护范围【英文标题】:How do you modify an existing protected range in Google sheets with a python script 【发布时间】: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 是行还是列?您需要为列和行指定开始和结束。 【参考方案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)

参考资料:

Google Sheets API v4 Reference Documentation REST Resource: spreadsheets.values spreadsheets.values.batchUpdate method gspread Documentation gspread batch_update() method

【讨论】:

看来 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 和其他用户有用。

以上是关于如何使用 python 脚本修改 Google 表格中现有的受保护范围的主要内容,如果未能解决你的问题,请参考以下文章

如何使用GAE收听Google表格,然后运行一组python代码?

如何使用 Google Apps 脚本将来自 Google 电子表格和 ScriptDB 的数据插入 BigQuery 表

从工作表中的 Google Apps 脚本访问 BigQuery 时需要登录错误

仅通过 Google Apps 脚本值修改 Google 电子表格

如何使用 AppScript 在 BigQuery 中将 Google 工作表持久化为表格

使用 Google Apps 脚本在 Google 表格中创建新表格