Google apps script 复制和粘贴,将条件格式应用于多个不同的范围和不同的条件

Google apps script 复制和粘贴,将条件格式应用于多个不同的范围和不同的条件,google-apps-script,google-sheets,google-sheets-formula,conditional-formatting,Google Apps Script,Google Sheets,Google Sheets Formula,Conditional Formatting,我正在尝试将条件格式应用于多个范围。格式始终相同,但包含条件的单元格不相同 例如: `=OR($B$11="金",$B$11="木")` //this custom formula applies to range C5:Q14 '=OR($B$22="金",$B$22="木") //this custom formula applies to range C16:Q25 第一个公式检查电池B11的状况 第二

我正在尝试将条件格式应用于多个范围。格式始终相同,但包含条件的单元格不相同

例如:

`=OR($B$11="金",$B$11="木")` //this custom formula applies to range C5:Q14  
'=OR($B$22="金",$B$22="木")  //this custom formula applies to range C16:Q25
第一个公式检查电池B11的状况
第二个公式检查单元B22的状况

它按预期工作。但是,我必须设置许多这样的范围,如果复制或粘贴,格式范围只会添加到公式中已经存在的范围中,并且它们都会检查相同单元格的条件。如果我手动设置每个范围的条件,我可以实现我所需要的,但我想知道,如果公式不可行,是否有更好的方法通过表单公式或脚本

请参见表格中的示例


我看到你的问题有3种可能的抽象形式

1) 按已知长度的行组进行条件格式设置。2) 如果允许使用辅助列,如何以复制粘贴友好的方式标识节顶部的行索引。3) 检测特定行上方列中最顶端的非空白单元格

当然,3)是最普遍的。但如果您只需要1)或2),最好使用更简单的解决方案。因此,我将对每一项进行评论


按已知长度的行组进行条件格式设置 结合使用
索引
匹配
。(如果需求越来越复杂,也要考虑使用<代码>间接< /代码>)

例如,如果您需要11个一组的行来引用标题行,您可以这样做

=match(index($A:$A,floor(row(B1)/11)*11+1,1),{"金";"木"},0)
B1:C11;假设每11行有一个:A中的工作日字符

回想一下,在条件格式中,我们指定了一个(固定)范围和一个引用相对范围的公式。Google Sheet将在(固定)范围内迭代单元格索引——这意味着,从最左上角的单元格开始,向下移动1行时,公式中的(相对)范围都将有行索引加+1;当您向右移动1列时,公式中的(相对)范围都将有列索引加+1。$符号功能正常

公式中唯一可以自由迭代的(相对)范围是
B1
。因此,这里发生的情况是:当您沿着(固定)范围
B1:C11
移动时,例如,当您到达
C10
时,公式中的(相对)范围变为
C10
(巧合地),因为
C10
从范围
B1:C11
中最左上角的单元格向下移动9行,向右移动1列

测试:

标识/指定节顶部的行索引 如果可以使用helper列,那么有一种简单的方法可以将行索引指定为节位置的函数

例如,假设您的部分跨越
B1:D10
。您希望能够将此部分复制粘贴到
B21:D21
,并希望保留所有其他内容

如果你能容忍使用A:A来标记部分的顶部,这很简单

您不需要提前知道每个节的行数

A1
中,输入
=行(A1)
。在
A2
中,输入
=A1
。现在将公式拖过您的区域,即拖到
A10

现在,您可以在C1:D10中简单地使用条件格式

=match(index($B:$B,A1,1),{"金";"木"},0)
当然,您可以使用更简单的公式进行字符串比较

检测特定行上方列中最顶端的非空白单元格 如果没有一个固定的模板用于包含已知行数的分区,并且需要保持工作表中没有辅助列,那么唯一的方法是检测包含工作日字符的列中给定行上方的最后一个非空单元格

这里可能有许多变化。您可以检测非空单元格。或者,您可以从字符串列表中检测是否存在字符串。您可以检索单元格的内容,也可以获取行索引。等等,我们将在这里做最简单的事情

假设您的工作日字符位于
A:A
中,并且需要在B:C中设置条件格式。然后,在条件格式选项卡中,将范围设置为B:C,公式如下

=match(+SORT($A$1:$A1,$A$1:$A1<>"",,ROW($A$1:$A1),),{"金";"木"},0)
=match(+SORT($A$1:$A1,$A$1:$A1)”,ROW($A$1:$A1),,{”金";"木"},0)
这里发生的情况是,
+SORT($1:$A1,$1:$A1“),ROW($1:$A1),)
将选择列A中最后一个非空单元格相对于所讨论行的内容

以下是如何为我们实现结果:

的第二个输入将计算为一列真正意义上的非空布尔值。
$a$1:$A1
相对于
B1:C
意味着选择上面
A1:a
中的单元格,并包括有问题的单元格。将第三个输入留空意味着降序,这反过来意味着真在假之前。
+
告诉Google Sheet输出数组输出中的第一个元素。到目前为止,
+排序($A$1:$A1,$A$1:$A1“”)
将输出最上面的非空单元格。在所有非空单元格中,您需要最后一个。因此,第四个输入用于行索引,第五个输入用于降序。在
A1:A中,行索引最高的非空单元格就是您需要的单元格


作为询问者,您需要确定手头任务的确切要求

我想说的是,提问者抽象出需求并在问题中陈述它们是很重要的,而不是寻求如何在回答中评估手头的任务

这就是通常区别于其他人可以轻松搜索的编程问题的地方,从而从外包查询中学习和适应。

Apps脚本解决方案 AFAIK最好的方法是使用应用程序脚本

用这样的脚本:

函数createRule(){
//获取范围
var sheet=SpreadsheetApp.getActiveSheet();
var cellToWatch=sheet.getActiveCell()
var rangeForRule=cellToWatch.offset(-6,1,10,1