将数据发布到 Google 工作表 (Python) 中的新行
Posting data to new row in Google Sheets (Python)
这就是我面临的问题。我创建了一个 python 脚本,它从我的 Google Sheet 的第一列获取数据,将其传递到另一个 API,获取响应,然后添加一些该行的下一列中来自该响应的字段。问题是每次更新字段时,它只会覆盖第一行中的所有内容,而不会实际移动到第二行。
例如,如果 A1 列的值为 x 并且它被解码为 b、c、d。然后它分别在 B1、C1 和 D1 列中写入 b c d。这一切都很好。但是当它移动到 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() 但这显然开始在 table 底部添加结果。
问题出在您的 update()
函数调用的 range
参数中。在您的代码中,范围在 for
循环的每次迭代中都设置为 B:E
,因此它始终写入相同的 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
来定义范围。
这就是我面临的问题。我创建了一个 python 脚本,它从我的 Google Sheet 的第一列获取数据,将其传递到另一个 API,获取响应,然后添加一些该行的下一列中来自该响应的字段。问题是每次更新字段时,它只会覆盖第一行中的所有内容,而不会实际移动到第二行。
例如,如果 A1 列的值为 x 并且它被解码为 b、c、d。然后它分别在 B1、C1 和 D1 列中写入 b c d。这一切都很好。但是当它移动到 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() 但这显然开始在 table 底部添加结果。
问题出在您的 update()
函数调用的 range
参数中。在您的代码中,范围在 for
循环的每次迭代中都设置为 B:E
,因此它始终写入相同的 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
来定义范围。