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个问题。
    1. is there a way to make a single call to protect every sheet in a workbook?
    2. 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)

参考: