将Google表格API(使用Python)中的列设置为数字格式

时间:2018-03-07 22:59:45

标签: python google-sheets-api

我正在尝试使用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)

2 个答案:

答案 0 :(得分:1)

问题可能是您的数据当前存储为字符串,因此不受数字格式的影响。

"userEnteredValue": {
  "stringValue": "1000"
},
"formattedValue": "1000",
"userEnteredFormat": {
  "numberFormat": {
    "type": "NUMBER",
    "pattern": "#,##0"
  }
},

当您通过用户界面设置数字格式(格式>数字> ... )时,它实际上是一次做两件事:

  1. 设置数字格式。
  2. 如果可能,将字符串值转换为数字值。
  3. 您的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')

这两种技术,再加上我在最初的问题中已经弄清楚的格式化调用,就可以解决问题了。