我正在尝试使用API格式化Google表格中的一列数字(特别是Sheets API v.4和Python 3.6.1)。我的一部分非功能代码如下。我知道它正在执行,因为列的背景颜色已设置,但数字仍然显示为文本,而不是数字。
换句话说,我试图获得相当于点击列标题(A,B,C或其他),然后选择格式 - >数字 - > GUI中的数字菜单项。
def sheets_batch_update(SHEET_ID,data):
print ( ("Sheets: Batch update"))
service.spreadsheets().batchUpdate(spreadsheetId=SHEET_ID,body=data).execute() #,valueInputOption='RAW'
data={
"requests": [
{
"repeatCell": {
"range": {
"sheetId": all_sheets['Users'],
"startColumnIndex": 19,
"endColumnIndex": 20
},
"cell": {
"userEnteredFormat": {
"numberFormat": {
"type": "NUMBER",
"pattern": "#,##0",
},
"backgroundColor": {
"red": 0.0,
"green": 0.4,
"blue": 0.4
},
}
},
"fields": "userEnteredFormat(numberFormat,backgroundColor)"
}
},
]
}
sheets_batch_update(SHEET_ID, data)
答案 0 :(得分:1)
问题可能是您的数据当前存储为字符串,因此不受数字格式的影响。
"userEnteredValue": {
"stringValue": "1000"
},
"formattedValue": "1000",
"userEnteredFormat": {
"numberFormat": {
"type": "NUMBER",
"pattern": "#,##0"
}
},
当您通过用户界面设置数字格式(格式>数字> ... )时,它实际上是一次做两件事:
您的API调用仅执行#1,因此当前使用字符串值设置的任何单元格将保持字符串值,因此不受数字格式的影响。如果单元格包含数字,一种解决方案是浏览受影响的值并将stringValue
移动到numberValue
。
答案 1 :(得分:1)
为了更好地充实Eric Koleda的答案,我最终解决了这两种方式,这取决于我如何获取工作表的数据:
首先,如果我将单元格附加到工作表上,我使用了一个函数:
def set_cell_type(cell_contents):
current_cell_contents=str(cell_contents).replace(',', '')
float_cell=re.compile("^\d+\.\d+$")
int_cell=re.compile("^\d+$")
if int_cell.search(current_cell_contents):
data = {"userEnteredValue": {"numberValue": int(current_cell_contents)}}
elif float_cell.search(current_cell_contents):
data = {"userEnteredValue": {"numberValue": float(current_cell_contents)}}
else:
data = {"userEnteredValue": {"stringValue": str(cell_contents)}}
return data
正确格式化单元格。这是实际执行追加的电话:
rows = [{"values": [set_cell_type(cell) for cell in row]} for row in daily_data_output]
data = { "requests": [ { "appendCells": { "sheetId": all_sheets['Daily record'], "rows": rows, "fields": "*", } } ], }
sheets_batch_update(SHEET_ID,data)
第二次,如果我要更换整张纸,我做了:
#convert the ints to ints and floats to floats
float_cell=re.compile("^\d+\.\d+$")
int_cell=re.compile("^\d+$")
row_list=error_message.split("\t")
i=0
while i < len(row_list):
current_cell=row_list[i].replace(',', '') #remove the commas from any numbers
if int_cell.search(current_cell):
row_list[i]=int(current_cell)
elif float_cell.search(current_cell):
row_list[i]=float(current_cell)
i+=1
error_output.append(row_list)
然后以下实际将error_output保存到工作表:
data = {'values': [row for row in error_output]}
sheets_update(SHEET_ID,data,'Errors!A1')
这两种技术,再加上我在最初的问题中已经弄清楚的格式化调用,就可以解决问题了。