首页 > 解决方案 > 将背景颜色添加到单元格 Google 工作表(python)

问题描述

与这个问题(更新谷歌电子表格单元格(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

提前致谢!

标签: pythongoogle-sheetsbackground-colorgoogle-sheets-api

解决方案


我相信你的目标如下。

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

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

模式一:

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

示例脚本:

在此示例脚本中,工作表的单元格“A1”的背景颜色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,
                    "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()

模式二:

在此模式中,行的背景颜色被修改。

示例脚本:

在这个示例脚本中,工作表第一行的背景颜色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 中删除。由此,使用一行。

参考:

补充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.

  • repeatCell,WORKSHEET_NAME用于工作表 ID。请修改为"sheetId": sheet_id,.


推荐阅读