答案:
为了更新受保护的范围,您需要发出batchUpdate 请求并指定namedRangeId 和protectedRangeId。
使用表格 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)
参考资料: