将数据发布到Google表格中的新行(Python)

时间:2018-09-20 20:37:04

标签: python-3.x google-sheets-api

所以这是我面临的问题。我创建了一个python脚本,该脚本从Google表格的第一列获取数据,将其传递到另一个API中,获取响应,然后在该行的下一列中添加响应中的某些字段。问题在于,每次更新字段时,它只会覆盖第一行中的所有内容,而实际上不会移至第二行。

例如,如果列A1的值为x,并且将其解码为b,c,d。然后,它将b c d分别写入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 :(得分:0)

问题出在range函数调用的update()参数中。在您的代码中,范围在B:E循环的每次迭代中都设置为for,因此它始终写入相同的4个单元格:B1:E1

相反,每次调用update()时,范围应增加一行。假设您要开始在第2行中进行书写:B2:E2B3: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()

请注意,我正在使用从2开始的循环索引i来定义范围。