python - 将背景颜色添加到单元格 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
提前致谢!
解决方案
我相信你的目标如下。
- 您想使用 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,
.
推荐阅读
- angular - 使用地图向可观察对象添加值
- c++ - c++内存分配和重写vector类
- java - Android:创建意图后,我无法从 MainActivity 打开 UI
- python - Python Tkinter Scrollbar 只是调整它所在的框架的大小,而不是使画布可滚动
- flask - 渲染静态文件时出现Flask内部服务器错误
- python - 如何创建请求对象以获取令牌
- string - 将字符串转换为标题大小写 - Emacs Lisp
- java - 服务器发送请求 firebase java.net.protocolexception 在读取响应后无法写入请求正文
- apache-kafka - LoggingMessageFormatter 与 kafka-avro-console-consumer
- javascript - 通过Angular 2获取本机元素相对于视口的位置