Question

J'ai une feuille de calcul dont je veux remplir les valeurs avec des valeurs à partir de dictionnaires dans une liste. J'ai écrit une boucle pour la boucle qui met à jour la cellule par cellule, mais elle est trop lente et je reçois le gspread.httpsession.httpror souvent. J'essaie d'écrire une boucle pour mettre à jour la rangée à la ligne. C'est ce que j'ai:

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,}
]

Voici ma cellule par boucle de cellule:

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)

Ce qu'il fait, c'est qu'il trouve un en-tête qui correspond à la clé de la liste des dictionnaires et met à jour la cellule sous celle-ci. L'itération suivante La ligne est augmentée d'une part. Il met donc à jour les cellules dans les mêmes colonnes, mais la ligne suivante. Ceci est trop lent et je veux mettre à jour par ligne. Ma tentative:

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)

Celui-ci met à jour chaque ligne rapidement, mais avec la même valeur. Donc, la troisième liaison pour la boucle attribue la même valeur pour chaque cellule. Je me brise la tête en essayant de comprendre comment attribuer des valeurs correctes aux cellules. Aide appréciée.

P.s. Au fait, j'utilise des en-têtes parce que je veux un certain ordre dans lequel les valeurs de la feuille de calcul Google doivent apparaître.

Était-ce utile?

La solution

Le code suivant est similaire à la réponse de Koba, mais écrit la feuille complète à la fois au lieu de par ligne.C'est encore plus rapide:

# 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)

Autres conseils

J'ai fini par écrire la boucle suivante qui remplit une feuille de calcul par rangée incroyablement rapide.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top