繁体   English   中英

使用 pygsheets 有条件地格式化 google 表格中的单元格

[英]Conditionally format cells in a google sheet using pygsheets

我正在尝试学习如何使用 pygsheets 有条件地格式化工作表中的单元格。 这样做的原因是只允许与 google 表格交互的最终用户只能输入格式正确的值。

例如,我们如何格式化工作表以便:

  • 单元格 A2 到 A5 为 0 到 50 之间的数字。
  • 单元格 B2 到 B5 是一个 email 地址(一个字符串表示有 @gmail.com 或 @yahoo.com)。
  • 单元格 C2 到 C5 是一些对应于日期的字符串。

如果单元格不符合正确的格式,颜色会变为浅红色,表示它的格式不正确。

使用pygsheets 的两个文档,我能够创建工作表并从标题的格式开始。 但是,我无法根据需要使用条件语句来更改颜色,我想我应该使用set_data_validation function 来执行此操作,但我无法让它工作。 该文档让我参考了google sheets API 电子表格条件页面,但我无法很好地理解该文档以设置这些条件。

我已经为第一点添加了我的示例和解决方案,但没有按照我的想法去做。

工作示例

整数 细绳 日期
import pygsheets
import pandas as pd

# get credentials from the json file
service = pygsheets.authorize(service_file='key.json') 
spread_sheet_id = ".... insert id here ...." # id to get example worksheet

spreadsheet = pygsheets.Spreadsheet(client=service,id=spread_sheet_id)

# open work sheet
worksheet = spreadsheet.worksheet(0)

header_list = ["number int","string","date"]
for index, element in enumerate(header_list):
    # get the cell A1,B1 and C1 and set elements to header_list elements
    header_cell = wksheet.cell( str(chr(65+index)+"1"))
    header_cell.value = element
    
    # format colour and make bold
    header_cell.text_format['bold'] = True # make the header bold
    header_cell.color = (0.9529412, 0.9529412, 0.9529412, 0) # set background color of this cell as a tuple (red, green, blue, alpha)
    # update
    header_cell.update()

# format A2 to A5 to be an integer between 0 and 53 (DIDN'T WORK)
for index in ["A2","A3","A4","A5"]:
    model_cell = pygsheets.Cell(index)
    print(index)
    model_cell.set_number_format(format_type = pygsheets.FormatType.NUMBER, pattern = "^(?:[1-9]|[1-4][0-9]|5[0-3])$") # This pattern will match any integer between 0 and 53, inclusive
    header_cell.update()

# (TRY OTHER WAY as a number between 0 and 53)  (DIDN'T WORK)

cells = worksheet.range('B2:B5') # select the cells to be formatted
# create the data validation rule
# rule = pygsheets.data_validation.RangeRule(minimum=0, maximum=53)
# model_cell = pygsheets.Cell("A1")
# model_cell.set_number_format(format_type = pygsheets.FormatType.NUMBER,pattern = "0")
# worksheet.add_conditional_formatting('C2', 'C6', 'NUMBER_BETWEEN', {'backgroundColor':{'red':1}}, ['0','53'])

# ... format B2 to B5 to be a string less than 30 characters
# ... format C2 to C5 to be a string that is a relevent email address less than 50 characters

从 google sheets API 文档中,我认为每个规则都可以设置为:

|# create pygsheets conditional formatting rule using 
# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#conditiontype

rule = {
  "type": enum (NUMBER_BETWEEN),
  "values": [
    {
      object (ConditionValue)
    }
  ]
}

为此,您需要将数据验证规则(当用户不遵守规则或阻止输入值时显示警告)与条件格式规则(根据规则更改单元格格式)结合使用。

您似乎在使用数据格式函数,但根据pygsheets文档,您可以使用Worksheet.add_conditional_formatting()Worksheet.set_data_validation()来应用这两种类型的规则。 如果您在设置标头后将其添加到代码中,那么这里有一个示例可以满足您的需求:

0 到 53 之间:

worksheet.add_conditional_formatting(start='A2',
                                    end='A5', 
                                    condition_type='NUMBER_NOT_BETWEEN', 
                                    format={'backgroundColor':{'red':0.9, 'green':0.6, 'blue':0.6, 'alpha':0}}, 
                                    condition_values=['0','53'])
worksheet.set_data_validation(start='A2', 
                              end='A5', 
                              condition_type='NUMBER_BETWEEN', 
                              condition_values=['0','53'], 
                              inputMessage="Value must be between 0 and 53", 
                              strict=False)

是email:

worksheet.add_conditional_formatting(start='B2', 
                                     end='B5', 
                                     condition_type='CUSTOM_FORMULA', 
                                     format={'backgroundColor':{'red':0.9, 'green':0.6, 'blue':0.6, 'alpha':0}}, 
                                     condition_values=['=NOT(ISEMAIL(B2))'])
worksheet.add_conditional_formatting(start='B2', 
                                     end='B5', 
                                     condition_type='CUSTOM_FORMULA', 
                                     format={'backgroundColor':{'red':1, 'green':1, 'blue':1, 'alpha':0}}, 
                                     condition_values=['=ISBLANK(B2)'])
worksheet.set_data_validation(start='B2', 
                              end='B5', 
                              condition_type='TEXT_IS_EMAIL', 
                              inputMessage="Value must be an email", 
                              strict=False)

是日期:

worksheet.add_conditional_formatting(start='C2', 
                                     end='C5', 
                                     condition_type='CUSTOM_FORMULA', 
                                     format={'backgroundColor':{'red':0.9, 'green':0.6, 'blue':0.6, 'alpha':0}}, 
                                     condition_values=['=NOT(ISDATE(C2))'])
worksheet.add_conditional_formatting(start='C2', 
                                     end='C5', 
                                     condition_type='CUSTOM_FORMULA', 
                                     format={'backgroundColor':{'red':1, 'green':1, 'blue':1, 'alpha':0}}, 
                                     condition_values=['=ISBLANK(C2)'])
worksheet.set_data_validation(start='C2', 
                              end='C5', 
                              condition_type='DATE_IS_VALID', 
                              inputMessage="Value must be a date", 
                              strict=False)

根据我上面链接的文档,您使用startend参数定义单元格范围。 condition_type是一个字符串,您可以从Google 文档中获取。 您可以在那里看到有效的类型以及它们的作用。 条件格式规则还采用CellFormat object 来保存单元格格式。 condition_values参数定义一个或多个值,这取决于条件类型。 您会注意到NUMBER_BETWEEN需要两个值, CUSTOM_FORMULA采用一个值,而DATE_IS_VALID不采用任何值。 文档是您解决这些问题的好帮手。

您会注意到我还为其中一些使用了自定义公式。 这是因为条件格式不支持某些条件,所以我不得不使用公式作为解决方法。

这是应用规则后工作表的样子:

在此处输入图像描述

我建议您首先熟悉 pygsheets 文档,以了解每个 function 所需的参数。Google 文档可以帮助找出这些参数可以取哪些值。

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM