Публикация данных в новой строке в Google Sheets (Python) - PullRequest
0 голосов
/ 20 сентября 2018

Итак, вот проблема, с которой я сталкиваюсь.Я создал скрипт Python, который берет данные из первого столбца моего Google Sheet, передает их в другой API, получает ответ, а затем добавляет некоторые поля из этого ответа в следующие столбцы этой строки.Проблема в том, что каждый раз, когда он обновляет поля, он перезаписывает все только в первом ряду и фактически не перемещается во второй ряд.

Например, если столбец A1 имеет значение x и он декодируется в b, c, d.Затем он записывает bcd в столбцы B1, C1 и D1 соответственно.Это все хорошо.Но когда он перемещается в A2, он записывает декодированные значения для этого в B1, C1 и D1, а не перемещается в B2, C2, D2.Поэтому он перезаписывает последние добавленные значения.

    # I've called the Sheets API here
SPREADSHEET_ID = 'ID HERE'
RANGE_NAME = 'A2:A'
result = service.spreadsheets().values().get(spreadsheetId=SPREADSHEET_ID,
                                            range=RANGE_NAME).execute()
values = result.get('values', [])
i=1

if not values:
    print('No data found.')
else:
#values 
    for row in values:
        try:
        # Print column A, which corresponds to indice 0 in the VIN Sheet.
            print('%s' % (row[0]))
            URL = "http://vpic.nhtsa.dot.gov/api/vehicles/DecodeVinValues/"
            VIN=row[0]
            PARAMS={VIN:'format=json'}
            r=requests.get(url=URL + VIN, params={'format': 'json'})
            result=r.json()
            #print (result)
            print ("Make: ", result['Results'][0]['Make'])
            print ("Model: ", result['Results'][0]['Model'])
            print ("Year: ", result['Results'][0]['ModelYear'])
            print ("Engine Manufacturer: ", result['Results'][0]['EngineManufacturer'])
            i=i+1
            text=r.text
            values = [
                [ result['Results'][0]['Make'],result['Results'][0]['Model'],result['Results'][0]['ModelYear'],result['Results'][0]['EngineManufacturer']
                ]
                ]
            body = {
                'values' : values
                }
            result1 = service.spreadsheets().values().update(spreadsheetId=SPREADSHEET_ID, range='B:E',valueInputOption='RAW', body=body).execute()
        except IndexError, e:
            print("Row has no index")

Может кто-нибудь сказать, пожалуйста, что я делаю неправильно?Я попытался использовать функцию append () вместо update (), но это, очевидно, начинает добавлять результаты в нижней части таблицы.

1 Ответ

0 голосов
/ 28 марта 2019

Проблема в параметре range вызова функции update().В вашем коде диапазон установлен на B:E на каждой итерации цикла for, поэтому он всегда записывает в одни и те же 4 ячейки: B1:E1.

Вместо этого вы должны увеличивать диапазон на одну строку каждый раз, когда вызывается update().Предполагая, что вы хотите начать запись в строке 2: B2:E2, B3:E3 и т. Д.

Вот рабочее доказательство концепции, основанной на вашем коде, которая считывает значения из столбца A (диапазон A2:A)и записывает каждое значение в столбцы с B по E в соответствующей строке:

for i, row in enumerate(values, start=2):
    # Print column A, which corresponds to indice 0 in the VIN Sheet.
    print('Input value: %s' % (row[0]))
    values = [[row[0], row[0], row[0], row[0]]]
    body = {
        'values': values
        }

    # range of cells to be updated (eg. B2:E2 on first iteration)
    destrange = 'B' + str(i) + ':E' + str(i)
    print("Writing to " + destrange)

    result1 = service.spreadsheets().values().update(
        spreadsheetId=SPREADSHEET_ID,
        range=destrange,
        valueInputOption='RAW',
        body=body).execute()

Обратите внимание, что я использую индекс цикла i, начинающийся с 2, чтобы определить диапазон.

...