首页 > 解决方案 > 将受保护范围添加到现有 NamedRange

问题描述

我有一个现有的工作表,NamedRange并且我想调用batch_updateAPI 的方法来保护该范围不被除了进行batch_update调用的用户之外的任何人编辑。

我已经看到了一个关于如何通过新的范围定义添加受保护范围的示例,而不是从现有的NamedRange.

我知道我需要发送addProtectedRangeResponse请求。我可以用Sheetname!NamedRange符号定义请求正文吗?

this_range = worksheet_name + "!" + nrange
batch_update_spreadsheet_request_body = {
    'requests': [
        {
            "addProtectedRange": {
                "protectedRange": {
                "range": {
                    "name": this_range,
                },
                    "description": "Protecting xyz",
                    "warningOnly": False
                }
            }
        }
    ],  
}

编辑:鉴于@Tanaike 的反馈,我将调用调整为:

        body = {
            "requests": [
                {
                    "addProtectedRange": {
                        "protectedRange": {
                            "namedRangeId": namedRangeId,
                            "description": "Protecting via gsheets_manager",
                            "warningOnly": False,
                            "requestingUserCanEdit": False
                        }
                    }
                }
            ]
        }
        res2 = service.spreadsheets().batchUpdate(spreadsheetId=ssId, body=body).execute()
        print(res2)

但是尽管它列出了新的保护措施,它仍然列出了 5 个不同的用户(全部)作为编辑。如果我尝试手动编辑我的 gsheets_manager 脚本添加的保护,它会抱怨范围无效:

在此处输入图像描述

有趣的是,根据返回的消息,它似乎忽略了 requestUserCanEdit 标志:

{u'spreadsheetId': u'NNNNNNNNNNNNNNNNNNNNNNNNNNNN', u'replies': [{u'addProtectedRange': {u'protectedRange': {u'requestingUserCanEdit': True, u'description': u'Protecting via gsheets_manager', u'namedRangeId': u'1793914032', u'editors': {}, u'protectedRangeId': 2012740267, u'range': {u'endColumnIndex': 1, u'sheetId': 1196959832, u'startColumnIndex': 0}}}}]}

有任何想法吗?

标签: pythongoogle-sheetsgoogle-sheets-apigoogle-api-python-client

解决方案


namedRangeId根据您的情况使用怎么样?示例脚本的流程如下。

  1. namedRangeId使用spreadsheets().getSheets API检索。
  2. namedRangeId使用spreadsheets().batchUpdateSheets API设置受保护的范围。

示例脚本:

nrange = "### name ###"
ssId = "### spreadsheetId ###"

res1 = service.spreadsheets().get(spreadsheetId=ssId, fields="namedRanges").execute()
namedRangeId = ""
for e in res1['namedRanges']:
    if e['name'] == nrange:
        namedRangeId = e['namedRangeId']
        break
body = {
    "requests": [
        {
            "addProtectedRange": {
                "protectedRange": {
                    "namedRangeId": namedRangeId,
                    "description": "Protecting xyz",
                    "warningOnly": False
                }
            }
        }
    ]
}
res2 = service.spreadsheets().batchUpdate(spreadsheetId=ssId, body=body).execute()
print(res2)

笔记:

  • 此脚本假定 Sheets API 可用于您的环境。
  • 这是一个简单的示例脚本。所以请根据您的情况进行修改。

参考:

如果这不是你想要的,我很抱歉。

编辑:

在我上面的答案中,我使用您的设置修改了您的脚本。如果要保护命名范围,请body进行如下修改。

修改的body
body = {
    "requests": [
        {
            "addProtectedRange": {
                "protectedRange": {
                    "namedRangeId": namedRangeId,
                    "description": "Protecting xyz",
                    "warningOnly": False,
                    "editors": {"users": ["### your email address ###"]}, # Added
                }
            }
        }
    ]
}

这样,命名范围只能由您修改。我正在使用此类设置,并确认它在我的环境中有效。但是,如果在您的情况下,这不起作用,我很抱歉。


推荐阅读