Python gpsread批量更新多张工作表

Python gpsread批量更新多张工作表,python,python-3.x,google-sheets,google-sheets-api,gspread,Python,Python 3.x,Google Sheets,Google Sheets Api,Gspread,有没有办法一次批量更新多张工作表?我正在努力保护工作簿中的每个工作表,我正在做: def protectSheet(sheet): body = { "requests": [ { "addProtectedRange": { "protectedRange": { &q

有没有办法一次批量更新多张工作表?我正在努力保护工作簿中的每个工作表,我正在做:

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)
但是有没有一种方法可以通过一次调用来保护工作簿中的每一张工作表呢


编辑:或者,是否有办法判断工作表是否受到保护?

我相信您的目标如下

  • 在你的问题中,有以下两个问题。
  • 有没有一种方法可以通过一次调用来保护工作簿中的每张工作表?
  • 是否有办法判断工作表是否受保护?
  • 您希望通过python使用gspread实现上述功能
对问题1的答复: 以下示例脚本通过一个API调用保护电子表格中的所有工作表。但是,例如,电子表格中的一张工作表已被保护,则会发生错误。所以请小心这个

示例脚本: 对问题2的答复: 以下示例脚本通过一个API调用检索电子表格中所有受保护的工作表。为了通过一次API调用检索所有受保护的工作表和范围,需要使用“spreadsheets.get”方法。不幸的是,在gspread中似乎没有“电子表格.获取”的方法。因此,我将
credentials
中的访问令牌用于gspread

运行脚本时,将检索受保护工作表的工作表ID

示例脚本: 其他模式: 与其他模式一样,以下示例脚本检索电子表格中所有未受保护的工作表

示例脚本: 参考:
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)
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)
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)