【问题标题】:Add background color to cell Google sheet (python)将背景颜色添加到单元格 Google 工作表(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

提前致谢!

【问题讨论】:

    标签: python google-sheets background-color google-sheets-api


    【解决方案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 中删除。这样,就使用了一行。

    参考资料:

    添加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"'}]}]"> 处的值无效
    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2022-12-12
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多