将背景颜色添加到单元格 Google 工作表(python)

Posted

技术标签:

【中文标题】将背景颜色添加到单元格 Google 工作表(python)【英文标题】:Add background color to cell Google sheet (python) 【发布时间】:2020-10-19 06:47:56 【问题描述】:

与这个问题(Update Google spreadsheet cell (python))相关,我想知道如何更改链接示例中单元格(或整行)的背景颜色。

这是我更新工作表的代码部分。我通过服务和行。当我只在一个带有 'values' 变量的单元格中写 'OK' 时,它起作用了,而不是对行背景的修改:

SPREADSHEET_ID = '###'
WORKSHEET_NAME = 'Name of the sheet'

async def escribirEnSheet(service, row):
    # print('voy a escribir en celda ' + str(range_))
    # range_ = 'M'+str(row)  # TODO: Update placeholder value.
    row += 1
    range_ = WORKSHEET_NAME + "!M" + str(row)
    print('voy a escribir en celda: ' + str(range_))

#values = [['OK']]

sheetObj = service.spreadsheets().get(spreadsheetId=SPREADSHEET_ID, fields='sheets(properties(sheetId,title))').execute()
sheet_id = ""
for sheet in sheetObj['sheets']:
    if sheet['properties']['title'] == WORKSHEET_NAME:
        sheet_id = sheet['properties']['sheetId']
        break


batch_update_spreadsheet_request_body = 
    "requests": [
        
            "updateCells": 
                "range": 
                    "sheetId": sheet_id,
                    "startRowIndex": row,
                    "endRowIndex": row+1,
                    "startColumnIndex": 12,
                    "endColumnIndex": 12
                ,
                "rows": [
                    
                        "values": [
                            
                                "userEnteredValue": 
                                    "stringValue": "OK"
                                
                            
                        ]
                    
                ],
                "fields": "userEnteredValue"
            
        ,
        
            "repeatCell": 
                "range": 
                    "sheetId": WORKSHEET_NAME,
                    "startRowIndex": row,
                    "endRowIndex": row+1,
                    "startColumnIndex": 0,
                ,
                "cell": 
                    "userEnteredFormat": 
                        "backgroundColor": 
                            "red": 0,
                            "green": 1,
                            "blue": 0
                        
                    
                ,
                "fields": "userEnteredFormat.backgroundColor"
            
        
    ]


value_input_option = 'RAW'  # TODO: Update placeholder value.


try:
    print('voy a hacer la request para escribir')
    
    request = service.spreadsheets().batchUpdate(spreadsheetId=SPREADSHEET_ID, body=batch_update_spreadsheet_request_body)
    response = request.execute()
    time.sleep(1)
    print('ya he escrito')
    
    print(response)
except:
    print('algo ha ocurrido al escribir en la sheet')
    traceback.print_exc()
    pass

提前致谢!

【问题讨论】:

【参考方案1】:

我相信你的目标如下。

您想使用 googleapis 和 python 修改单元格或行的背景颜色。

对于这个,这个答案怎么样?在这个答案中,使用了 Sheets API 中的“spreadsheets.batchUpdate”方法。在 batchUpdate 方法中,GridRange 用作范围。 Ref

模式一:

在这种模式中,单元格的背景颜色会被修改。

示例脚本:

在此示例脚本中,sheet_id 工作表的单元格“A1”的背景颜色被修改为红色。

SPREADSHEET_ID = '###'  # Please set the Spreadsheet ID.
sheet_id = '###'  # Please set the sheet ID.

service = build('sheets', 'v4', credentials=creds)
batch_update_spreadsheet_request_body = 
    "requests": [
        
            "repeatCell": 
                "range": 
                    "sheetId": sheet_id,
                    "startRowIndex": 0,
                    "endRowIndex": 1,
                    "startColumnIndex": 0,
                    "endColumnIndex": 1
                ,
                "cell": 
                    "userEnteredFormat": 
                        "backgroundColor": 
                            "red": 1,
                            "green": 0,
                            "blue": 0
                        
                    
                ,
                "fields": "userEnteredFormat.backgroundColor"
            
        
    ]


request = service.spreadsheets().batchUpdate(spreadsheetId=SPREADSHEET_ID, body=batch_update_spreadsheet_request_body)
res = request.execute()

模式 2:

在这个模式中,一行的背景颜色被修改了。

示例脚本:

在此示例脚本中,sheet_id 工作表第一行的背景颜色被修改为红色。

SPREADSHEET_ID = '###'  # Please set the Spreadsheet ID.
sheet_id = '###'  # Please set the sheet ID.

service = build('sheets', 'v4', credentials=creds)
batch_update_spreadsheet_request_body = 
    "requests": [
        
            "repeatCell": 
                "range": 
                    "sheetId": sheet_id,
                    "startRowIndex": 0,
                    "endRowIndex": 1,
                    "startColumnIndex": 0,
                ,
                "cell": 
                    "userEnteredFormat": 
                        "backgroundColor": 
                            "red": 1,
                            "green": 0,
                            "blue": 0
                        
                    
                ,
                "fields": "userEnteredFormat.backgroundColor"
            
        
    ]


request = service.spreadsheets().batchUpdate(spreadsheetId=SPREADSHEET_ID, body=batch_update_spreadsheet_request_body)
res = request.execute()
在这种情况下,endColumnIndex 已从模式 1 中删除。这样,就使用了一行。

参考资料:

Method: spreadsheets.batchUpdate RepeatCellRequest

添加1:

当你想给一个单元格赋值并修改行的背景颜色时,下面的示例脚本怎么样?在这种情况下,将值的请求添加到批处理更新的请求中。

此外,您还想从工作表名称中检索工作表 ID。关于这一点,我添加了以下脚本。

示例脚本:

在此示例脚本中,将值“sample”放入单元格“A1”,并将第一行的背景颜色修改为红色。

SPREADSHEET_ID = '###'  # Please set the Spreadsheet ID.
sheet_name = 'Sheet1'  # Please set the sheet name.

service = build('sheets', 'v4', credentials=creds)
sheetObj = service.spreadsheets().get(spreadsheetId=SPREADSHEET_ID, fields='sheets(properties(sheetId,title))').execute()
sheet_id = ""
for sheet in sheetObj['sheets']:
    if sheet['properties']['title'] == sheet_name:
        sheet_id = sheet['properties']['sheetId']
        break

batch_update_spreadsheet_request_body = 
    "requests": [
        
            "updateCells": 
                "range": 
                    "sheetId": sheet_id,
                    "startRowIndex": 0,
                    "endRowIndex": 1,
                    "startColumnIndex": 0,
                    "endColumnIndex": 1
                ,
                "rows": [
                    
                        "values": [
                            
                                "userEnteredValue": 
                                    "stringValue": "sample"
                                
                            
                        ]
                    
                ],
                "fields": "userEnteredValue"
            
        ,
        
            "repeatCell": 
                "range": 
                    "sheetId": sheet_id,
                    "startRowIndex": 0,
                    "endRowIndex": 1,
                    "startColumnIndex": 0,
                ,
                "cell": 
                    "userEnteredFormat": 
                        "backgroundColor": 
                            "red": 1,
                            "green": 0,
                            "blue": 0
                        
                    
                ,
                "fields": "userEnteredFormat.backgroundColor"
            
        
    ]


request = service.spreadsheets().batchUpdate(spreadsheetId=SPREADSHEET_ID, body=batch_update_spreadsheet_request_body)
res = request.execute()

添加2:

您的脚本有几个修改点:

修改点:

updateCells处,如果要将OK的值放到“L”列,请修改如下。

来自

  "startColumnIndex": 12,
  "endColumnIndex": 12

  "startColumnIndex": 11,
  "endColumnIndex": 12

要放到“M”列时,请修改"startColumnIndex": 12,endColumnIndex": 13

repeatCellWORKSHEET_NAME 用于工作表 ID。请修改为"sheetId": sheet_id,

【讨论】:

谢谢@Tanaike。如果我想在单个单元格中写入并更改整行的背景怎么办? @dtamab 感谢您的回复。对于您的额外要求,我又添加了一个示例脚本。你能确认一下吗?如果我误解了您的附加要求,我深表歉意。 我的 sheet_id 出现错误,我给出了工作表的名称,但它似乎必须是整数,对吗?是否可以传递名称而不是索引? @dtamab 感谢您的回复。我带来的不便表示歉意。我更新了用于从工作表名称中检索工作表 ID 的附加脚本。你能确认一下吗? 我收到此错误:googleapiclient.errors.HttpError: sheets.googleapis.com/v4/spreadsheets/… returned "Invalid value at 'requests[1].repeat_cell.range.sheet_id' (TYPE_INT32), "PRUEBAS DAVID cambio estado TAS""。详细信息:“['@type': 'type.googleapis.com/google.rpc.BadRequest', 'fieldViolations': ['field': 'requests[1].repeat_cell.range.sheet_id', 'description' : '\'requests[1].repeat_cell.range.sheet_id\' (TYPE_INT32), "PRUEBAS DAVID cambio estado TAS"']]"> 处的值无效

以上是关于将背景颜色添加到单元格 Google 工作表(python)的主要内容,如果未能解决你的问题,请参考以下文章

excel如何设置背景颜色

基于Excel工作表中的单元格颜色和文本颜色子集数据框

如何将添加到Google表格单元格中的图像保存到Google云端硬盘?

Python读取具有一些背景颜色的Excel工作表(xlsx)中的单元格

使用 Google 表格下拉菜单更改单元格背景颜色而不是文本

如何设置单元格的背景颜色?