gspread 批量更新多张纸
gpsread Batch Update Multiple Sheets
有没有办法一次批量更新多个 sheet?我正在尝试保护工作簿中的每项工作sheet,并且我正在做:
def protectSheet(sheet):
body = {
"requests": [
{
"addProtectedRange": {
"protectedRange": {
"range": {
"sheetId": sheet._properties['sheetId'],
},
"warningOnly": True
}
}
}
]
}
try:
workbook.batch_update(body)
except gspread.exceptions.APIError:
logger.warning("%s is already protected" % sheet._properties['title'])
for worksheet in workbook.worksheets():
protectSheet(worksheet)
但是有没有办法通过一次调用来保护工作簿中的每个 sheet?
编辑:或者有没有办法判断作品sheet是否受保护?
我相信你的目标如下。
- 在你的问题中,有以下2个问题。
is there a way to make a single call to protect every sheet in a workbook?
is there a way to tell if a worksheet is protected?
.
- 您想通过 python.
使用 gspread 实现上述目标
问题 1 的答案:
以下示例脚本通过一次 API 调用保护 Spreadsheet 中的所有 sheet。但是比如Spreadsheet中的一个sheet已经被保护了,就会出现错误。所以请注意这一点。
示例脚本:
spreadsheetId = "###" # Please set the Spreadsheet ID.
client = gspread.authorize(credentials)
ss = client.open_by_key(spreadsheetId)
worksheets = ss.worksheets()
requests = [
{
"addProtectedRange": {
"protectedRange": {
"range": {
"sheetId": e.id,
},
"warningOnly": True
}
}
} for e in worksheets]
request_body = {"requests": requests}
res = ss.batch_update(request_body)
print(res)
问题 2 的答案:
以下示例脚本通过一次 API 调用检索 Spreadsheet 中所有受保护的 sheet。为了通过一次API调用检索所有受保护的sheet和范围,需要使用“spreadsheets.get”方法。可惜gspread里面好像没有“spreadsheets.get”的方法。所以我使用了来自 credentials
的访问令牌来获取 gspread。
当您 运行 脚本时,将检索受保护 sheet 的 sheets ID。
示例脚本:
import requests # This is used.
spreadsheetId = "###" # Please set the Spreadsheet ID.
# client = gspread.authorize(credentials)
access_token = credentials.access_token
endpoint = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "?fields=sheets.protectedRanges.range"
headers = {'Authorization': 'Bearer ' + access_token}
res = requests.get(endpoint, headers=headers)
obj = res.json()
sheetIds = []
for e in obj['sheets']:
if 'protectedRanges' in e:
for f in e.get('protectedRanges'):
if 'range' in f and 'startRowIndex' not in f.get('range') and 'endRowIndex' not in f.get('range') and 'startColumnIndex' not in f.get('range') and 'endColumnIndex' not in f.get('range'):
if 'sheetId' not in f.get('range'):
sheetIds.append(0)
else:
sheetIds.append(f.get('range')['sheetId'])
print(sheetIds)
其他图案:
作为其他模式,以下示例脚本检索 Spreadsheet 中所有未受保护的 sheet。
示例脚本:
import requests # This is used.
spreadsheetId = "###" # Please set the Spreadsheet ID.
# client = gspread.authorize(credentials)
access_token = credentials.access_token
endpoint = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "?fields=sheets.properties%2Csheets.protectedRanges.range"
headers = {'Authorization': 'Bearer ' + access_token}
res = requests.get(endpoint, headers=headers)
obj = res.json()
sheetIds = []
for e in obj['sheets']:
if 'protectedRanges' in e:
for f in e.get('protectedRanges'):
if 'range' not in f or ('range' in f and (
'startRowIndex' in f.get('range') or
'endRowIndex' in f.get('range') or
'startColumnIndex' in f.get('range') or
'endColumnIndex' in f.get('range'))):
sheetIds.append(f.get('range')['sheetId'])
else:
sheetIds.append(e['properties']['sheetId'])
print(sheetIds)
参考:
有没有办法一次批量更新多个 sheet?我正在尝试保护工作簿中的每项工作sheet,并且我正在做:
def protectSheet(sheet):
body = {
"requests": [
{
"addProtectedRange": {
"protectedRange": {
"range": {
"sheetId": sheet._properties['sheetId'],
},
"warningOnly": True
}
}
}
]
}
try:
workbook.batch_update(body)
except gspread.exceptions.APIError:
logger.warning("%s is already protected" % sheet._properties['title'])
for worksheet in workbook.worksheets():
protectSheet(worksheet)
但是有没有办法通过一次调用来保护工作簿中的每个 sheet?
编辑:或者有没有办法判断作品sheet是否受保护?
我相信你的目标如下。
- 在你的问题中,有以下2个问题。
is there a way to make a single call to protect every sheet in a workbook?
is there a way to tell if a worksheet is protected?
.
- 您想通过 python. 使用 gspread 实现上述目标
问题 1 的答案:
以下示例脚本通过一次 API 调用保护 Spreadsheet 中的所有 sheet。但是比如Spreadsheet中的一个sheet已经被保护了,就会出现错误。所以请注意这一点。
示例脚本:
spreadsheetId = "###" # Please set the Spreadsheet ID.
client = gspread.authorize(credentials)
ss = client.open_by_key(spreadsheetId)
worksheets = ss.worksheets()
requests = [
{
"addProtectedRange": {
"protectedRange": {
"range": {
"sheetId": e.id,
},
"warningOnly": True
}
}
} for e in worksheets]
request_body = {"requests": requests}
res = ss.batch_update(request_body)
print(res)
问题 2 的答案:
以下示例脚本通过一次 API 调用检索 Spreadsheet 中所有受保护的 sheet。为了通过一次API调用检索所有受保护的sheet和范围,需要使用“spreadsheets.get”方法。可惜gspread里面好像没有“spreadsheets.get”的方法。所以我使用了来自 credentials
的访问令牌来获取 gspread。
当您 运行 脚本时,将检索受保护 sheet 的 sheets ID。
示例脚本:
import requests # This is used.
spreadsheetId = "###" # Please set the Spreadsheet ID.
# client = gspread.authorize(credentials)
access_token = credentials.access_token
endpoint = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "?fields=sheets.protectedRanges.range"
headers = {'Authorization': 'Bearer ' + access_token}
res = requests.get(endpoint, headers=headers)
obj = res.json()
sheetIds = []
for e in obj['sheets']:
if 'protectedRanges' in e:
for f in e.get('protectedRanges'):
if 'range' in f and 'startRowIndex' not in f.get('range') and 'endRowIndex' not in f.get('range') and 'startColumnIndex' not in f.get('range') and 'endColumnIndex' not in f.get('range'):
if 'sheetId' not in f.get('range'):
sheetIds.append(0)
else:
sheetIds.append(f.get('range')['sheetId'])
print(sheetIds)
其他图案:
作为其他模式,以下示例脚本检索 Spreadsheet 中所有未受保护的 sheet。
示例脚本:
import requests # This is used.
spreadsheetId = "###" # Please set the Spreadsheet ID.
# client = gspread.authorize(credentials)
access_token = credentials.access_token
endpoint = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "?fields=sheets.properties%2Csheets.protectedRanges.range"
headers = {'Authorization': 'Bearer ' + access_token}
res = requests.get(endpoint, headers=headers)
obj = res.json()
sheetIds = []
for e in obj['sheets']:
if 'protectedRanges' in e:
for f in e.get('protectedRanges'):
if 'range' not in f or ('range' in f and (
'startRowIndex' in f.get('range') or
'endRowIndex' in f.get('range') or
'startColumnIndex' in f.get('range') or
'endColumnIndex' in f.get('range'))):
sheetIds.append(f.get('range')['sheetId'])
else:
sheetIds.append(e['properties']['sheetId'])
print(sheetIds)