如何对 Python 中的整个 Google Sheet 格式进行批量请求?
How can I make a batch request for an entire Google Sheet's formatting in Python?
使用 Python,我试图检查 Google Sheet 中的每个单元格是否有删除线,return 行没有删除线。我 运行 遇到的问题是达到当前分钟的配额限制,因为我正在检查 150 多行。另外,我需要检查 11 张纸,每张纸有 50-200 行。
有没有一种方法可以“batchGet()”格式化,而不仅仅是值,这样我就不会达到我的配额限制?
我不确定真正需要什么示例代码,所以这是我的工作“此单元格是否使用删除线格式化”定义:
def row_has_strikethrough(sheet, i):
return 'strikethrough=True' in str(get_user_entered_format(sheet, 'A' + str(i)))
这在我的 while 循环中有效,但我再次达到配额:
last_row = int(sheet.acell('C1').value) # 166
i = 3
while i <= last_row:
if not row_has_strikethrough(sheet, i):
records += get_record(sheet, MAPPING, i)
i += 1
如有任何帮助,我们将不胜感激!
我相信你的目标如下。
- 关于
I'm trying to check each cell in a Google Sheet for a strikethrough and return the rows without a strikethrough.
,从您 return 'strikethrough=True' in str(get_user_entered_format(sheet, 'A' + str(i)))
的脚本来看,我认为您可能想检查“A”列的单元格值是否有删除线。
- 而且,从您的展示脚本来看,我认为您可能正在为 python 使用 gspread。
- 您想降低脚本的处理成本。
如果我的理解是正确的,下面的示例脚本怎么样?
示例脚本:
spreadsheetId = '###' # Please set your Spreadsheet ID.
client = gspread.authorize(credentials) # Here, please use your credentials and client
sheetNames = ['Sheet1', 'Sheet2'] # Please set the sheet names you want to retrieve the values.
# 1. Retrieve textFormat from each sheet using one API call.
access_token = credentials.access_token
ranges = '&'.join(['ranges=' + e for e in sheetNames])
url = 'https://sheets.googleapis.com/v4/spreadsheets/' + spreadsheetId + '?fields=sheets(data(rowData(values(userEnteredFormat(textFormat(strikethrough))))))&' + ranges
res1 = requests.get(url, headers={'Authorization': 'Bearer ' + access_token})
obj = res1.json()
rowNumbers = {}
for i, d in enumerate(obj['sheets']):
sheet = []
for j, r in enumerate(d['data'][0].get('rowData')):
if 'values' not in r:
sheet.append(j)
rowNumbers[sheetNames[i]] = sheet
# 2. Retrieve values from each sheet using one API call.
spreadsheet = client.open_by_key(spreadsheetId)
res2 = spreadsheet.values_batch_get(sheetNames)['valueRanges']
# 3. Retrieve the rows from each sheet by checking the rows without the strikethrough at the column "A".
values = {}
for i, s in enumerate(res2):
temp = []
for j, r in enumerate(s['values']):
sheet = sheetNames[i]
if j in rowNumbers[sheet]:
temp.append(r)
values[sheet] = temp
print(values) # Here, you can see the result value.
在此脚本中,使用了 2 API 次工作表 API 调用。
测试:
当此脚本用于示例 Spreadsheet 时,会得到以下结果。
{
'Sheet1': [['a2', 'b2', 'c2'], ['a5', 'b5', 'c5'], ['a6', 'b6', 'c6']],
'Sheet2': [['a3', 'b3', 'c3'], ['a5', 'b5', 'c5'], ['a6', 'b6', 'c6']]
}
此输出值具有每个 sheet 的行。这些行是在“A”列没有删除线的行。
参考文献:
使用 Python,我试图检查 Google Sheet 中的每个单元格是否有删除线,return 行没有删除线。我 运行 遇到的问题是达到当前分钟的配额限制,因为我正在检查 150 多行。另外,我需要检查 11 张纸,每张纸有 50-200 行。
有没有一种方法可以“batchGet()”格式化,而不仅仅是值,这样我就不会达到我的配额限制?
我不确定真正需要什么示例代码,所以这是我的工作“此单元格是否使用删除线格式化”定义:
def row_has_strikethrough(sheet, i):
return 'strikethrough=True' in str(get_user_entered_format(sheet, 'A' + str(i)))
这在我的 while 循环中有效,但我再次达到配额:
last_row = int(sheet.acell('C1').value) # 166
i = 3
while i <= last_row:
if not row_has_strikethrough(sheet, i):
records += get_record(sheet, MAPPING, i)
i += 1
如有任何帮助,我们将不胜感激!
我相信你的目标如下。
- 关于
I'm trying to check each cell in a Google Sheet for a strikethrough and return the rows without a strikethrough.
,从您return 'strikethrough=True' in str(get_user_entered_format(sheet, 'A' + str(i)))
的脚本来看,我认为您可能想检查“A”列的单元格值是否有删除线。 - 而且,从您的展示脚本来看,我认为您可能正在为 python 使用 gspread。
- 您想降低脚本的处理成本。
如果我的理解是正确的,下面的示例脚本怎么样?
示例脚本:
spreadsheetId = '###' # Please set your Spreadsheet ID.
client = gspread.authorize(credentials) # Here, please use your credentials and client
sheetNames = ['Sheet1', 'Sheet2'] # Please set the sheet names you want to retrieve the values.
# 1. Retrieve textFormat from each sheet using one API call.
access_token = credentials.access_token
ranges = '&'.join(['ranges=' + e for e in sheetNames])
url = 'https://sheets.googleapis.com/v4/spreadsheets/' + spreadsheetId + '?fields=sheets(data(rowData(values(userEnteredFormat(textFormat(strikethrough))))))&' + ranges
res1 = requests.get(url, headers={'Authorization': 'Bearer ' + access_token})
obj = res1.json()
rowNumbers = {}
for i, d in enumerate(obj['sheets']):
sheet = []
for j, r in enumerate(d['data'][0].get('rowData')):
if 'values' not in r:
sheet.append(j)
rowNumbers[sheetNames[i]] = sheet
# 2. Retrieve values from each sheet using one API call.
spreadsheet = client.open_by_key(spreadsheetId)
res2 = spreadsheet.values_batch_get(sheetNames)['valueRanges']
# 3. Retrieve the rows from each sheet by checking the rows without the strikethrough at the column "A".
values = {}
for i, s in enumerate(res2):
temp = []
for j, r in enumerate(s['values']):
sheet = sheetNames[i]
if j in rowNumbers[sheet]:
temp.append(r)
values[sheet] = temp
print(values) # Here, you can see the result value.
在此脚本中,使用了 2 API 次工作表 API 调用。
测试:
当此脚本用于示例 Spreadsheet 时,会得到以下结果。
{
'Sheet1': [['a2', 'b2', 'c2'], ['a5', 'b5', 'c5'], ['a6', 'b6', 'c6']],
'Sheet2': [['a3', 'b3', 'c3'], ['a5', 'b5', 'c5'], ['a6', 'b6', 'c6']]
}
此输出值具有每个 sheet 的行。这些行是在“A”列没有删除线的行。