3

gspread我有一个表格,它显示为 Python 的列表列表,我想使用库将它写到一些 Google 电子表格中。但是,gspread开箱即用似乎没有这样的功能。当然,我可以使用循环并更新特定的单元格,但这是非常低效的解决方案,因为它必须执行多个请求(每个单元格一个请求)。如何做得更好?

4

3 回答 3

4

您可以使用Worksheet.range选择要更新的范围,然后将表格的内容写到此范围并用于Worksheet.update_cells批量更新它们。

以下代码片段改编自本教程

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)
于 2015-12-21T16:51:41.277 回答
1

最近对类似问题的回答似乎要简单得多:

my_list = [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h']]

sh.values_update(
    'Sheet1!A1', 
    params={'valueInputOption': 'RAW'}, 
    body={'values': my_list}
)

顺便说一句,代码由@Burnash(gspread开发人员)提供

于 2019-02-03T19:29:24.260 回答
1

您可以在前面的过程中使用以下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)
于 2018-05-17T10:30:07.103 回答