gpsread批量更新多个工作表

时间:2020-08-21 18:24:58

标签: python python-3.x google-sheets google-sheets-api gspread

有没有一种方法可以一次批量更新多张纸?我正在尝试保护工作簿中的每个工作表,并且正在这样做:

npm install --save redux-offline

但是有没有办法打个电话保护工作簿中的每张纸呢?

编辑:另外,还有一种方法可以判断工作表是否受到保护?

1 个答案:

答案 0 :(得分:1)

我相信您的目标如下。

  • 在您的问题中,有以下两个问题。
    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?
  • 您想通过将gspread与python结合使用来实现以上目标。

问题1的答案:

以下示例脚本通过一个API调用来保护电子表格中的所有工作表。但是,例如,电子表格中的一个工作表已经受到保护,则会发生错误。所以请注意这一点。

示例脚本:

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调用来检索电子表格中所有受保护的工作表。为了通过一个API调用检索所有受保护的工作表和范围,需要使用“ spreadsheets.get”方法。不幸的是,gspread中似乎没有“ spreadsheets.get”的方法。因此,我将credentials中的访问令牌用于gspread。

运行脚本时,将检索受保护工作表的工作表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)

其他模式:

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

示例脚本:

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)

参考: