所以这是我面临的问题。我创建了一个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(),但这显然开始在表的底部添加结果。
答案 0 :(得分:0)
问题出在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()
请注意,我正在使用从2开始的循环索引i
来定义范围。