Google sheets 强制应用条件格式

Google sheets 强制应用条件格式,google-sheets,gs-conditional-formatting,Google Sheets,Gs Conditional Formatting,我有一个google spreadseet表格,上面有条件背景格式规则。我还有一个功能,可以在用户更改单元格时自动排序(这是一个具有优先级的任务列表)。不幸的是,自动排序可能会以某种方式为单元格设置错误的背景,可以通过选择列,然后单击“背景->重置参数”按钮手动修复。我需要对脚本自动执行相同的操作,以保持单元格的正确背景。如何强制google电子表格使用其条件格式规则重新呈现单元格? 自动排序功能: function onEdit(event){ var sheet = event.sour

我有一个google spreadseet表格,上面有条件背景格式规则。我还有一个功能,可以在用户更改单元格时自动排序(这是一个具有优先级的任务列表)。不幸的是,自动排序可能会以某种方式为单元格设置错误的背景,可以通过选择列,然后单击“背景->重置参数”按钮手动修复。我需要对脚本自动执行相同的操作,以保持单元格的正确背景。如何强制google电子表格使用其条件格式规则重新呈现单元格? 自动排序功能:

function onEdit(event){
  var sheet = event.source.getActiveSheet();
  var editedCell = sheet.getActiveCell();

  var columnToSortBy = 1;
  var tableRange = "A2:Z1000";

  if(editedCell.getColumn() == columnToSortBy){   
    var range = sheet.getRange(tableRange);
    range.sort( { column : columnToSortBy, ascending: false } );
    // code below doesn't help to solve the problem:
    //var statusRange = sheet.getRange("B2:B1000");
    //statusRange.clear({formatOnly: true})
    //statusRange.clearFormat();
    //SpreadsheetApp.flush()
  }
}

可能发生的情况是,您已将条件格式应用于一系列单元格

当工作表按脚本排序时,部分/所有单元格可能会受到影响,因为条件格式应用的范围正在移动

我会尽力回答你的问题,但我认为你可能从错误的角度看待这个问题。考虑到您的表很大,除了标题行之外,整个页面都是吗?您可能不正确地应用了条件格式。如果它作用于整个页面,则重新排序页面不应影响它。在格式化范围内添加或删除行时,我也遇到过类似的问题。所以,如果你想发布你的格式规则,我可能会在那里发现一些东西

回到你的问题上来

var range = sheet.getRange(tableRange); is correct.
我想你用不了

statusRange.clear({formatOnly: true})
statusRange.clearFormat();
range.setBackground("red");
因为.clear和.clearFormat应用于工作表

您的表似乎占用了除标题行之外的整个工作表?如果是这样,那就试试看

sheet.clearFormat(); 
这将清除您的工作表格式,使您现在的背景颜色为白色

现在,我不知道如何使用脚本直接设置条件格式规则。我有两种可能的解决方案,我自己也用过

放弃条件格式,并使用脚本设置所需的格式。 您可以直接设置各种单元格格式,其中一种是背景色。 我不知道你想做什么,你的逻辑,但有几个功能可以用CSS或RGB来做,或者设置不同颜色的范围

选择了可以使用的单元格或区域后

statusRange.clear({formatOnly: true})
statusRange.clearFormat();
range.setBackground("red");
红色可替换为符号,例如“ff0000”

使用隐藏的条件格式模板。 在标题行之后创建另一行。因此,调整您的桌子范围以

var tableRange = "A3:Z1000";
现在,第2行成为您的模板。在第2行中设置所需的条件格式规则并隐藏该行。不要清除格式,而是将格式表单第2行复制到页面上

var sheet  = event.source.getActiveSheet();
var source = sheet.getRange(2,1,1,26); // Gets row 2 

source.copyFormatToRange(sheet, 1, 26, 3, 1000);  // will repeat down rows.