2

リスト内の辞書の値を入力したいスプレッドシートがあります。セルごとに更新する for ループを作成しましたが、遅すぎて gspread.httpsession.HTTPError が頻繁に発生します。行ごとに更新するループを作成しようとしています。それは私が持っているものです:

lstdic=[
{'Amount': 583.33, 'Notes': '', 'Name': 'Jone', 'isTrue': False,},
{'Amount': 58.4, 'Notes': '', 'Name': 'Kit', 'isTrue': False,},
{'Amount': 1083.27, 'Notes': 'Nothing', 'Name': 'Jordan', 'isTrue': True,}
]

これが私のセルバイセルループです:

headers = wks.row_values(1)

    for k in range(len(lstdic)):
        for key in headers:
            cell = wks.find(key)
            cell_value = lstdic[k][key]
            wks.update_cell(cell.row + 1 + k, cell.col, cell_value)

それが行うことは、辞書のリスト内のキーに対応するヘッダーを見つけ、その下のセルを更新することです。次の繰り返しでは、行が 1 つ増えるため、同じ列のセルを次の行で更新します。これは遅すぎるので、行単位で更新したいと考えています。私の試み:

headers = wks.row_values(1)

row=2
for k in range(len(lsdic)):
    cell_list=wks.range('B%s:AA%s' % (row,row))
    for key in headers: 
        for cell in cell_list:
            cell.value = lsdic[k][key]
    row+=1
    wks.update_cells(cell_list)

これは各行をすばやく更新しますが、値は同じです。したがって、3 番目のネストされた for ループは、各セルに同じ値を割り当てます。セルに正しい値を割り当てる方法を見つけようとして頭を悩ませています。助けていただければ幸いです。

PS ちなみに、Google スプレッドシートの値を特定の順序で表示する必要があるため、ヘッダーを使用しています。

4

2 に答える 2

4

次のコードは、Koba の回答に似ていますが、行ごとではなく一度にシート全体を書き込みます。これはさらに高速です。

# sheet_data  is a list of lists representing a matrix of data, headers being the first row.
#first make sure the worksheet is the right size
worksheet.resize(len(sheet_data), len(sheet_data[0]))
cell_matrix = []
rownumber = 1

for row in sheet_data:
    # max 24 table width, otherwise a two character selection should be used, I didn't need this.
    cellrange = 'A{row}:{letter}{row}'.format(row=rownumber, letter=chr(len(row) + ord('a') - 1))
    # get the row from the worksheet
    cell_list = worksheet.range(cellrange)
    columnnumber = 0
    for cell in row:
        cell_list[columnnumber].value = row[columnnumber]
        columnnumber += 1
    # add the cell_list, which represents all cells in a row to the full matrix
    cell_matrix = cell_matrix + cell_list
    rownumber += 1
# output the full matrix all at once to the worksheet.
worksheet.update_cells(cell_matrix)
于 2016-06-01T12:27:31.267 に答える
2

私は、驚くほど速くスプレッドシートを行ごとに埋める次のループを書くことになりました。

headers = wks.row_values(1)        
row = 2 # start from the second row because the first row are headers
for k in range(len(lstdic)):
        values=[]
        cell_list=wks.range('B%s:AB%s' % (row,row)) # make sure your row range equals the length of the values list
        for key in headers:
            values.append(lstdic[k][key])   
        for i in range(len(cell_list)):
            cell_list[i].value = values[i]
        wks.update_cells(cell_list)
        print "Updating row " + str(k+2) + '/' + str(len(lstdic) + 1)
        row += 1
于 2014-08-01T17:55:39.967 に答える