复制和粘贴,将条件格式应用于多个不同的范围和不同的条件
Copy and paste, apply conditional formatting to multiple different ranges and different criteria
我正在尝试将条件格式应用于多个范围。格式始终相同,但包含条件的单元格不同。
例如:
`=OR($B="金",$B="木")` //this custom formula applies to range C5:Q14
'=OR($B="金",$B="木") //this custom formula applies to range C16:Q25
第一个公式检查单元格 B11 的条件
第二个公式检查单元格 B22 的条件
它按预期工作。但是,我必须设置许多这样的范围,如果我复制或粘贴,格式范围只会添加到公式中已有的范围中,并且它们都会检查同一个单元格的条件。如果我手动设置每个范围的条件,我可以实现我需要的,但我想知道如果公式不可行,是否有更好的方法通过 sheets 公式或脚本。
示例请看sheet
https://docs.google.com/spreadsheets/d/1G0eUibjNKlZ1fDm9id5SPFNlF392cuEPzNDMB8E5jyU/edit?usp=sharing
我看到你的问题有 3 个可能的抽象。
1) 按已知长度的行组进行条件格式化。 2) 如何以复制粘贴友好的方式识别部分顶部的行索引如果允许辅助列。 3) 检测特定行上方一列中最顶部的非空白单元格。
当然,3)是最笼统的。但如果你只需要 1) 或 2),最好使用更简单的解决方案。所以我会评论每一个。
按已知长度的行组进行条件格式化
使用 index
和 match
的组合。 (如果需求变得更复杂,也可以考虑使用indirect
。)
比如你需要11个一组的行来引用首行,你可以这样做
=match(index($A:$A,floor(row(B1)/11)*11+1,1),{"金";"木"},0)
在B1:C11;鉴于您每 11 行 A:A 中有工作日字符。
回想一下,在条件格式中,我们指定了一个(固定的)范围和一个引用相对范围的公式。 Google Sheet 然后将在(固定)范围内迭代单元格索引——意思是,从最左上角的单元格开始,当您向下移动 1 行时,公式中的(相对)范围都会有行索引加+1;当您向右移动 1 列时,公式中的(相对)范围都将列索引加 +1。 $ 符号功能正常。
公式中唯一可自由迭代的(相对)范围是 B1
。因此这里发生的是:当你沿着(固定)范围 B1:C11
移动时,例如当你到达 C10
时,公式中的(相对)范围变为 C10
(巧合)因为C10
距离范围 B1:C11
.
中最左上角的单元格向下 9 行,向右 1 列
测试:
Identify/Designate 节顶部的行索引
如果您可以使用辅助列,则有一种简单的方法可以将行索引指定为部分位置的函数。
例如,假设您的部分跨越 B1:D10
。您希望能够将此部分复制粘贴到 B21:D21
,并且希望保留其他所有内容。
如果您可以容忍使用 A:A 来标记部分的顶部,这很简单。
您不需要提前知道每个部分的行数。
在A1
中输入=row(A1)
。在A2
中输入=A1
。现在将公式拖过您的部分,即。至 A10
.
现在您可以在 C1:D10 中添加条件格式,就像
=match(index($B:$B,A1,1),{"金";"木"},0)
当然,您可以使用更简单的公式进行字符串比较。
检测特定行上方一列中最上面的非空白单元格
如果您的部分没有已知行数的固定模板,并且您需要保持 sheet 清洁辅助列,那么唯一的方法是检测最后一个非您有工作日字符的列中给定行上方的空单元格。
此处可以进行多种变体。您可以检测非空单元格。或者您可以从字符串列表中检测字符串的存在。您可以检索单元格的内容,也可以获取行索引。等等。我们将在这里做最简单的事情。
假设您在 A:A
中有工作日字符,并且您需要在 B:C 中设置条件格式。然后,在条件格式选项卡中,将范围设置为B:C,公式如下。
=match(+SORT($A:$A1,$A:$A1<>"",,ROW($A:$A1),),{"金";"木"},0)
这里发生的是 +SORT($A:$A1,$A:$A1<>"",,ROW($A:$A1),)
将挑选出 A 列中与相关行相关的最后一个非空单元格的内容。
下面是 SORT
如何为我们实现结果:
SORT
的第二个输入将评估为布尔值列,TRUE 表示非空。 $A:$A1
relative to B1:C
意思是把上面A1:A
中的单元格挑出来,包括有问题的单元格。将第三个输入留空意味着下降,这反过来意味着 TRUE 在 FALSE 之前。 +
告诉 Google Sheet 输出数组输出中的第一个元素。至此,+SORT($A:$A1,$A:$A1<>"",)
将输出最顶部的非空单元格。在所有非空单元格中,您需要最后一个。因此,行索引的第 4 个输入和降序的第 5 个输入。 A1:A
中行索引最高的非空单元格就是你想要的单元格。
作为提问者,您可以确定手头任务的确切要求。
我想说,重要的是提问者将要求抽象化并在问题中陈述它们——而不是在答案中寻求如何评估手头的任务。
这通常是区分其他人都可以轻松搜索、从而学习和适应外包查询的编程问题的原因。
Apps 脚本解决方案
据我所知,最好的方法是使用 Apps 脚本
使用这样的脚本:
function createRule() {
// Get Ranges
var sheet = SpreadsheetApp.getActiveSheet();
var cellToWatch = sheet.getActiveCell()
var rangeForRule = cellToWatch.offset(-6, 1, 10, 15)
// Create absolute Cell reference
var cellNotation = cellToWatch.getA1Notation()
var patt = /([a-zA-Z]+)([\d]+)/
var result = patt.exec(cellNotation)
var absoluteRef = "$" + result[1] + "$" + result[2]
// Create Conditional Formatting rule
var rule = SpreadsheetApp.newConditionalFormatRule()
.whenFormulaSatisfied('=OR('+ absoluteRef +'="金",'+ absoluteRef +'="木")')
.setBackground("#00FF00")
.setRanges([rangeForRule, cellToWatch])
.build();
var rules = sheet.getConditionalFormatRules();
rules.push(rule);
sheet.setConditionalFormatRules(rules);
}
这个脚本
假设您的 sheet 将始终具有完全相同的格式
需要您 select 符合条件的单元格,如下所示:
目前您需要 运行 来自 script editor
它根据 selected 单元格的位置选择一个范围来应用格式规则。 var rangeForRule = cellToWatch.offset(-6, 1, 10, 15)
它获取 selected 单元格的 A1 表示法并使用 RegEx,生成 A1 表示法的绝对版本。 A1
=> $A
它使用刚刚构建的引用创建条件格式规则。
您需要修改颜色的十六进制值以满足您的需要"#00FF00"
您可以将其设为 custom sidebar 您的传播sheet,这样只需点击几下鼠标即可创建此规则。
参考资料
我正在尝试将条件格式应用于多个范围。格式始终相同,但包含条件的单元格不同。
例如:
`=OR($B="金",$B="木")` //this custom formula applies to range C5:Q14
'=OR($B="金",$B="木") //this custom formula applies to range C16:Q25
第一个公式检查单元格 B11 的条件
第二个公式检查单元格 B22 的条件
它按预期工作。但是,我必须设置许多这样的范围,如果我复制或粘贴,格式范围只会添加到公式中已有的范围中,并且它们都会检查同一个单元格的条件。如果我手动设置每个范围的条件,我可以实现我需要的,但我想知道如果公式不可行,是否有更好的方法通过 sheets 公式或脚本。
示例请看sheet
https://docs.google.com/spreadsheets/d/1G0eUibjNKlZ1fDm9id5SPFNlF392cuEPzNDMB8E5jyU/edit?usp=sharing
我看到你的问题有 3 个可能的抽象。
1) 按已知长度的行组进行条件格式化。 2) 如何以复制粘贴友好的方式识别部分顶部的行索引如果允许辅助列。 3) 检测特定行上方一列中最顶部的非空白单元格。
当然,3)是最笼统的。但如果你只需要 1) 或 2),最好使用更简单的解决方案。所以我会评论每一个。
按已知长度的行组进行条件格式化
使用 index
和 match
的组合。 (如果需求变得更复杂,也可以考虑使用indirect
。)
比如你需要11个一组的行来引用首行,你可以这样做
=match(index($A:$A,floor(row(B1)/11)*11+1,1),{"金";"木"},0)
在B1:C11;鉴于您每 11 行 A:A 中有工作日字符。
回想一下,在条件格式中,我们指定了一个(固定的)范围和一个引用相对范围的公式。 Google Sheet 然后将在(固定)范围内迭代单元格索引——意思是,从最左上角的单元格开始,当您向下移动 1 行时,公式中的(相对)范围都会有行索引加+1;当您向右移动 1 列时,公式中的(相对)范围都将列索引加 +1。 $ 符号功能正常。
公式中唯一可自由迭代的(相对)范围是 B1
。因此这里发生的是:当你沿着(固定)范围 B1:C11
移动时,例如当你到达 C10
时,公式中的(相对)范围变为 C10
(巧合)因为C10
距离范围 B1:C11
.
测试:
Identify/Designate 节顶部的行索引
如果您可以使用辅助列,则有一种简单的方法可以将行索引指定为部分位置的函数。
例如,假设您的部分跨越 B1:D10
。您希望能够将此部分复制粘贴到 B21:D21
,并且希望保留其他所有内容。
如果您可以容忍使用 A:A 来标记部分的顶部,这很简单。
您不需要提前知道每个部分的行数。
在A1
中输入=row(A1)
。在A2
中输入=A1
。现在将公式拖过您的部分,即。至 A10
.
现在您可以在 C1:D10 中添加条件格式,就像
=match(index($B:$B,A1,1),{"金";"木"},0)
当然,您可以使用更简单的公式进行字符串比较。
检测特定行上方一列中最上面的非空白单元格
如果您的部分没有已知行数的固定模板,并且您需要保持 sheet 清洁辅助列,那么唯一的方法是检测最后一个非您有工作日字符的列中给定行上方的空单元格。
此处可以进行多种变体。您可以检测非空单元格。或者您可以从字符串列表中检测字符串的存在。您可以检索单元格的内容,也可以获取行索引。等等。我们将在这里做最简单的事情。
假设您在 A:A
中有工作日字符,并且您需要在 B:C 中设置条件格式。然后,在条件格式选项卡中,将范围设置为B:C,公式如下。
=match(+SORT($A:$A1,$A:$A1<>"",,ROW($A:$A1),),{"金";"木"},0)
这里发生的是 +SORT($A:$A1,$A:$A1<>"",,ROW($A:$A1),)
将挑选出 A 列中与相关行相关的最后一个非空单元格的内容。
下面是 SORT
如何为我们实现结果:
SORT
的第二个输入将评估为布尔值列,TRUE 表示非空。 $A:$A1
relative to B1:C
意思是把上面A1:A
中的单元格挑出来,包括有问题的单元格。将第三个输入留空意味着下降,这反过来意味着 TRUE 在 FALSE 之前。 +
告诉 Google Sheet 输出数组输出中的第一个元素。至此,+SORT($A:$A1,$A:$A1<>"",)
将输出最顶部的非空单元格。在所有非空单元格中,您需要最后一个。因此,行索引的第 4 个输入和降序的第 5 个输入。 A1:A
中行索引最高的非空单元格就是你想要的单元格。
作为提问者,您可以确定手头任务的确切要求。
我想说,重要的是提问者将要求抽象化并在问题中陈述它们——而不是在答案中寻求如何评估手头的任务。
这通常是区分其他人都可以轻松搜索、从而学习和适应外包查询的编程问题的原因。
Apps 脚本解决方案
据我所知,最好的方法是使用 Apps 脚本
使用这样的脚本:
function createRule() {
// Get Ranges
var sheet = SpreadsheetApp.getActiveSheet();
var cellToWatch = sheet.getActiveCell()
var rangeForRule = cellToWatch.offset(-6, 1, 10, 15)
// Create absolute Cell reference
var cellNotation = cellToWatch.getA1Notation()
var patt = /([a-zA-Z]+)([\d]+)/
var result = patt.exec(cellNotation)
var absoluteRef = "$" + result[1] + "$" + result[2]
// Create Conditional Formatting rule
var rule = SpreadsheetApp.newConditionalFormatRule()
.whenFormulaSatisfied('=OR('+ absoluteRef +'="金",'+ absoluteRef +'="木")')
.setBackground("#00FF00")
.setRanges([rangeForRule, cellToWatch])
.build();
var rules = sheet.getConditionalFormatRules();
rules.push(rule);
sheet.setConditionalFormatRules(rules);
}
这个脚本
假设您的 sheet 将始终具有完全相同的格式
需要您 select 符合条件的单元格,如下所示:
目前您需要 运行 来自 script editor
它根据 selected 单元格的位置选择一个范围来应用格式规则。
var rangeForRule = cellToWatch.offset(-6, 1, 10, 15)
它获取 selected 单元格的 A1 表示法并使用 RegEx,生成 A1 表示法的绝对版本。
A1
=>$A
它使用刚刚构建的引用创建条件格式规则。
您需要修改颜色的十六进制值以满足您的需要
"#00FF00"
您可以将其设为 custom sidebar 您的传播sheet,这样只需点击几下鼠标即可创建此规则。