简体   繁体   English

如何使用gspread将表格(列表列表)写入Google Spreadsheet

[英]How to write a table (list of lists) to Google Spreadsheet using gspread

I have a table which is presented as Python's list of lists and I'd like to write it down to some Google Spreadsheet using gspread library. 我有一个表格,显示为Python的列表列表,我想使用gspread库将其写入一些Google电子表格。 However, it seems that gspread does not have such function out of the box. 然而,似乎gspread没有开箱即用的功能。 Of course I can use loop and update particular cells but it is very inefficient solution because it have to perform multiple requests (one request per cell). 当然,我可以使用循环并更新特定的单元格,但它是非常低效的解决方案,因为它必须执行多个请求(每个单元一个请求)。 How to do it better? 怎么做得更好?

You can use Worksheet.range to select the range you want to update, then write down the contents of your table to this range and use Worksheet.update_cells to update them in a batch. 您可以使用Worksheet.range选择要更新的范围,然后将表的内容写入此范围,并使用Worksheet.update_cells批量更新它们。

The following code snipped is adapted from 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)

You can use it in the following way: 您可以通过以下方式使用它:

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)

You may use the following update_sheet function with the previous process for a more concise solution: 您可以将以下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)

Then: 然后:

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)

This recent answer to a similar question seems much simpler: 最近对类似问题的回答似乎更简单:

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

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

BTW, the code was provided by @Burnash ( gspread developer) BTW,代码由@Burnash( gspread开发人员)提供

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM