我正在编写一个python脚本,用于将数据从csv文件发送到Google电子表格。我已经清楚地了解了这个项目的基本需求,但是我完全忘记了从csv文件到google工作表的格式化/解析数据(我还在学习python!)。
所以这是我的代码的第一部分:
def add_todo():
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
'version=v4')
service = discovery.build('sheets', 'v4', http=http,
discoveryServiceUrl=discoveryUrl)
spreadsheetId = 'spreadsheetidhere'
rangeName = 'A1:A'
# https://developers.google.com/sheets/guides/values#appending_values
values = {'values':[['Hello Saturn',],]}
result = service.spreadsheets().values().append(
spreadsheetId=spreadsheetId, range=rangeName,
valueInputOption='RAW',
body=values).execute()
if __name__ == '__main__':
add_todo()
我自己没有写它并且它工作得很好。
以下是我的代码的第二部分:
test = []
with open('data.csv', 'rb') as f:
reader = csv.reader(f)
for row in reader:
test.append(row)
它也正常工作,即使我真的不知道如何将它与我的代码的第一部分混合在一起。我做到了这一点:
test = []
def add_todo():
with open('snap.csv', 'rb') as f:
reader = csv.reader(f)
for row in reader:
test.append(row)
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
'version=v4')
service = discovery.build('sheets', 'v4', http=http,
discoveryServiceUrl=discoveryUrl)
spreadsheetId = '1UJGs-gJCIUDv5jg5-p0MPEqsokYu5k2MfJ8A5oBkpWs'
rangeName = 'A1:A'
# https://developers.google.com/sheets/guides/values#appending_values
values = {'values':[['Hello Saturn',],]}
result = service.spreadsheets().values().append(
spreadsheetId=spreadsheetId, range=rangeName,
valueInputOption='RAW',
body=values).execute()
if __name__ == '__main__':
add_todo()
您可以猜测我的主要问题是如何继续将test
数组中的数据传递到电子表格值values = {'values':[['Hello Saturn',],]}
我想做这样的事情:values = {'values':[test]}
但显然它不起作用。
总结一下,这是我的csv文件:
data1,data2,data3,data4,...
value1x,value2x,value3x,value4x,...
value1y,value2y,value3y,value4y,...
value1z,value2z,value3z,value4z,...
这就是我在电子表格中想要的内容:
data1 data2 data3 data4 //col name
value1x value2x value3x value4x //row1
value1y value2y value3y value4y //row2
etc...
我在array
,list
,json格式之间完全丢失了。
答案 0 :(得分:1)
您需要在主API调用中指定range
参数和body
。如果您查看API documentation,您会看到body
需要具有以下表单
values = [
[
# Cell values ...
],
# Additional rows ...
]
body = {
'values': values
}
即一个包含一个元素values
的字典,它是一个列表列表。包含CSV数据的test
变量已经显示为列表列表,因此您可以继续使用。您不必在此担心JSON,因为API的Python界面会自动将您的Python词典和列表转换为JSON。
range
参数有点棘手,但根据使用工作表名称的文档,它会将值附加到该工作表的末尾。因此,将上述内容放在一起,您的代码可能看起来像这样(我还没有测试过):
def add_todo():
test = [] # test should be initialized in the function body
with open('snap.csv', 'rb') as f:
reader = csv.reader(f)
for row in reader:
test.append(row)
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
'version=v4')
service = discovery.build('sheets', 'v4', http=http,
discoveryServiceUrl=discoveryUrl)
spreadsheetId = '1UJGs-gJCIUDv5jg5-p0MPEqsokYu5k2MfJ8A5oBkpWs'
# https://developers.google.com/sheets/guides/values#appending_values
values = {'values': test}
result = service.spreadsheets().values().append(
spreadsheetId=spreadsheetId, range=spreadsheetId,
valueInputOption='RAW',
body=values).execute()
if __name__ == '__main__':
add_todo()