セルではなく、Googleスプレッドシートの行を行に移入します
質問
私はリスト内の辞書から値を設定したいスプレッドシートを持っています。私はセルでセルを更新するループを書いたが、遅すぎて、gspread.httpsession.httprerrorが頻繁に取得されます。行ごとに行を更新するためのループを作成しようとしています。それは私が持っているものです:
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)
.
これは各行を素早く更新しますが、同じ値です。したがって、最初のネストされたループはセルごとに同じ値を割り当てます。私は細胞に正しい値を割り当てる方法を見つけようとしている私の頭を壊しています。
を助けます。p.S。ところで、Googleスプレッドシートの値が表示されるべき特定の注文が必要なので、ヘッダーを使用しています。
解決
次のコードは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)
. 他のヒント
スプレッドシートを驚くほど速く充填する次のループを書き込みました。
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
. 所属していません StackOverflow