我有一个表格,显示为Python的列表列表,我想使用gspread
库将其写入一些Google电子表格。但是,gspread
似乎没有开箱即用的功能。当然,我可以使用循环并更新特定的单元格,但它是非常低效的解决方案,因为它必须执行多个请求(每个单元一个请求)。怎么做得更好?
答案 0 :(得分:3)
您可以使用Worksheet.range
选择要更新的范围,然后将表格内容写入此范围,并使用Worksheet.update_cells
批量更新。
以下代码剪辑改编自this tutorial。
def numberToLetters(q):
"""
Helper function to convert number of column to its index, like 10 -> 'A'
"""
q = q - 1
result = ''
while q >= 0:
remain = q % 26
result = chr(remain+65) + result;
q = q//26 - 1
return result
def colrow_to_A1(col, row):
return numberToLetters(col)+str(row)
def update_sheet(ws, rows, left=1, top=1):
"""
updates the google spreadsheet with given table
- ws is gspread.models.Worksheet object
- rows is a table (list of lists)
- left is the number of the first column in the target document (beginning with 1)
- top is the number of first row in the target document (beginning with 1)
"""
# number of rows and columns
num_lines, num_columns = len(rows), len(rows[0])
# selection of the range that will be updated
cell_list = ws.range(
colrow_to_A1(left,top)+':'+colrow_to_A1(left+num_columns-1, top+num_lines-1)
)
# modifying the values in the range
for cell in cell_list:
val = rows[cell.row-top][cell.col-left]
cell.value = val
# update in batch
ws.update_cells(cell_list)
您可以通过以下方式使用它:
import gspread
from oauth2client.service_account import ServiceAccountCredentials
# your auth here
scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
gc = gspread.authorize(credentials)
# your spreadsheet have to be shared with 'client_email' from credentials.json
gc = gspread.authorize(credentials)
# end of auth
spreadsheet = gc.open_by_url(my_url) # url to your spreadsheet here
ws = spreadsheet.sheet1 # or select any other sheet
table = [['one', 'two', 'three'], [4, 5, 6]]
# you may need to resize your worksheet so it have the neccessary cells
# ws.resize(len(table),len(table[0]))
update_sheet(ws, table)
答案 1 :(得分:1)
This recent answer到一个类似的问题似乎要简单得多:
my_list = [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h']]
sh.values_update(
'Sheet1!A1',
params={'valueInputOption': 'RAW'},
body={'values': my_list}
)
顺便说一句,该代码由@Burnash(gspread开发人员)提供
答案 2 :(得分:0)
您可以在上一过程中使用以下update_sheet
功能,以获得更简洁的解决方案:
def update_sheet(ws, table, rangeStart='A', rangeEnd='C')
for index, row in enumerate(table):
range = '{start}{i}:{end}{i}'.format(
start=rangeStart, end=rangeEnd, i=index+1
)
cell_list = worksheet.range(range)
for i, cell in enumerate(cell_list):
cell.value = row[i]
ws.update_cells(cell_list)
然后:
import gspread
from oauth2client.service_account import ServiceAccountCredentials
# your auth here
scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
gc = gspread.authorize(credentials)
# your spreadsheet have to be shared with 'client_email' from credentials.json
gc = gspread.authorize(credentials)
# end of auth
spreadsheet = gc.open_by_url(my_url) # url to your spreadsheet here
ws = spreadsheet.sheet1 # or select any other sheet
table = [['one', 'two', 'three'], [4, 5, 6]]
# you may need to resize your worksheet so it have the neccessary cells
# ws.resize(len(table),len(table[0]))
update_sheet(ws, table)