如何使用gspread写一个表(名单列表)的谷歌电子表格

问题描述 投票:2回答:3

我有被作为列表的Python的名单表,我想将它写下来,以使用gspread图书馆借了一些谷歌电子表格。然而,似乎gspread不具备这样的功能,开箱。当然,我可以使用循环和更新特定细胞,但它是非常低效的解决方案,因为它必须执行多个请求(每单元一个请求)。如何做的更好?

python google-sheets gspread
3个回答
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显影剂)


4
投票

您可以使用Worksheet.range选择要更新的范围内,那么你的表的内容写下来,以这个范围内,并使用Worksheet.update_cells在批处理更新它们。

下面的代码段适于从qazxsw POI。

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)

1
投票

您可以使用以下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) 功能有一个更简洁的解决方案之前的过程:

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)
© www.soinside.com 2019 - 2024. All rights reserved.