Google 电子表格 API - 基于范围和相邻值的条件格式
Google Spreadsheets API - Conditional Formatting based on range and adjacent values
我有如下一个非常精简的传播版本sheet:
Sect | Lbl | A | B | C | D | E
==========================================================
Sec1 | Lbl1 | 1 | 8 | 6 | 10 |
----------------------------------------------------------
Sec2 | Lbl2 | 2 | 1 | 1 | >100 |
----------------------------------------------------------
etc...
我想对所有值应用 rule/rules 表示:
Bg 颜色 = 绿色如果:
- 右侧单元格不为空且高于此值
Bg 颜色 = 红色,如果:
- 右侧单元格不为空且小于此值
Bg 颜色 = 白色(无操作)如果:
- 右边的单元格具有相同的值
此外,如果该值设置为非数字“>100”,我需要将其转换为 100 作为此格式的一部分。
我正在使用 C# 通过 Spreadsheets v4 API 来执行此操作。
到目前为止,我有下面的代码,但我不确定如何将多个条件应用于格式化规则。
更新
请注意上面更新的 table 示例,然后再阅读下面的内容
多亏了 TheMaster,我已经准备好了,运行 但还不完全正确。我有一个额外的因素:
- 第一行应从条件格式中排除
- 前两列是标签,也应该是ignored/excluded
- 所有其他数据列和行都需要与其右侧的列(如果可用)进行比较并相应地着色。
到目前为止,这是我的 Red
规则 (where cell value > cell value to the right
) 代码。
除此之外,我还有一个 Green
规则 (where cell value < cell value to the right
) 和一个 White
规则 (where cell value = cell value to the right
)
它们在批量更新请求中的索引如下:
0 = 红色
1 = 绿色
2 = 白色
Red
规则的代码:
formatRequest.Requests.Add(new Google.Apis.Sheets.v4.Data.Request()
{
AddConditionalFormatRule = new AddConditionalFormatRuleRequest()
{
Rule = new ConditionalFormatRule()
{
BooleanRule = new BooleanRule()
{
Condition = new BooleanCondition()
{
Type = "CUSTOM_FORMULA",
Values = new List<ConditionValue>() {
new ConditionValue()
{
UserEnteredValue = "=AND(NOT(ISBLANK(A2)),(1*REGEXEXTRACT(A2,\"\d+\"))>(1*REGEXEXTRACT(B2,\"\d+\")))"
}
}
},
Format = new CellFormat()
{
BackgroundColor = new Color()
{
Red = 0.8f,
Green = 0f,
Blue = 0f,
Alpha = 1f
}
}
},
Ranges = new List<GridRange>()
{
new GridRange()
{
SheetId = Convert.ToInt32(sheetId)
,StartRowIndex = 1
},
}
},
Index = 0
}
});
问题是它没有将条件格式应用于整个 sheet...仅第一列数据。
- 您应该使用
CUSTOM_FORMULA
作为布尔条件类型
- 您需要添加两个条件格式规则
index
0 和 1
- 范围将是开放式的并涵盖整个 sheet。
代码段(对于 A1:Z;Bg:red):
- 布尔条件JSON:
{
"type": "CUSTOM_FORMULA",
"values": [
{
userEnteredValue: "=AND(NOT(ISBLANK(A1)),A1>(IF(ISNUMBER(B1),B1,1*REGEXEXTRACT(B1,\"\d+\"))))"
}
]
}
- BooleanRule/Format/BackgroundColor JSON:
{
"red": 1,
"green": 0,
"blue": 0,
"alpha": 1
}
我有如下一个非常精简的传播版本sheet:
Sect | Lbl | A | B | C | D | E
==========================================================
Sec1 | Lbl1 | 1 | 8 | 6 | 10 |
----------------------------------------------------------
Sec2 | Lbl2 | 2 | 1 | 1 | >100 |
----------------------------------------------------------
etc...
我想对所有值应用 rule/rules 表示:
Bg 颜色 = 绿色如果: - 右侧单元格不为空且高于此值
Bg 颜色 = 红色,如果: - 右侧单元格不为空且小于此值
Bg 颜色 = 白色(无操作)如果: - 右边的单元格具有相同的值
此外,如果该值设置为非数字“>100”,我需要将其转换为 100 作为此格式的一部分。
我正在使用 C# 通过 Spreadsheets v4 API 来执行此操作。 到目前为止,我有下面的代码,但我不确定如何将多个条件应用于格式化规则。
更新
请注意上面更新的 table 示例,然后再阅读下面的内容
多亏了 TheMaster,我已经准备好了,运行 但还不完全正确。我有一个额外的因素:
- 第一行应从条件格式中排除
- 前两列是标签,也应该是ignored/excluded
- 所有其他数据列和行都需要与其右侧的列(如果可用)进行比较并相应地着色。
到目前为止,这是我的 Red
规则 (where cell value > cell value to the right
) 代码。
除此之外,我还有一个 Green
规则 (where cell value < cell value to the right
) 和一个 White
规则 (where cell value = cell value to the right
)
它们在批量更新请求中的索引如下: 0 = 红色 1 = 绿色 2 = 白色
Red
规则的代码:
formatRequest.Requests.Add(new Google.Apis.Sheets.v4.Data.Request()
{
AddConditionalFormatRule = new AddConditionalFormatRuleRequest()
{
Rule = new ConditionalFormatRule()
{
BooleanRule = new BooleanRule()
{
Condition = new BooleanCondition()
{
Type = "CUSTOM_FORMULA",
Values = new List<ConditionValue>() {
new ConditionValue()
{
UserEnteredValue = "=AND(NOT(ISBLANK(A2)),(1*REGEXEXTRACT(A2,\"\d+\"))>(1*REGEXEXTRACT(B2,\"\d+\")))"
}
}
},
Format = new CellFormat()
{
BackgroundColor = new Color()
{
Red = 0.8f,
Green = 0f,
Blue = 0f,
Alpha = 1f
}
}
},
Ranges = new List<GridRange>()
{
new GridRange()
{
SheetId = Convert.ToInt32(sheetId)
,StartRowIndex = 1
},
}
},
Index = 0
}
});
问题是它没有将条件格式应用于整个 sheet...仅第一列数据。
- 您应该使用
CUSTOM_FORMULA
作为布尔条件类型 - 您需要添加两个条件格式规则
index
0 和 1 - 范围将是开放式的并涵盖整个 sheet。
代码段(对于 A1:Z;Bg:red):
- 布尔条件JSON:
{
"type": "CUSTOM_FORMULA",
"values": [
{
userEnteredValue: "=AND(NOT(ISBLANK(A1)),A1>(IF(ISNUMBER(B1),B1,1*REGEXEXTRACT(B1,\"\d+\"))))"
}
]
}
- BooleanRule/Format/BackgroundColor JSON:
{
"red": 1,
"green": 0,
"blue": 0,
"alpha": 1
}