Google App脚本-如果它匹配字符串中的条件,则更改单元格的颜色

时间:2019-02-21 00:55:49

标签: google-apps-script google-sheets

我一直在处理我公司google工作表所面临的性能问题,我需要根据2个字符串的内容对特定范围的单元格进行着色,现在我可以通过条件格式来实现但是对于550行要着色的过程来说,速度很慢5m,而且每次我更换过滤器或排序时,条件格式化都会重新计算,因此不理想。

它是这样的: enter image description here

如果标记了颜色分级标志,则它应读取两个促销字符串,即过去,当前和将来,并且在销售的每个星期中,如果该单元格处于两个字符串中的任意范围内,则应为该单元格着色

在示例图像中,该商品在过去有两个促销,而当前字符串都标记为1-6绿色,并用半列分隔(1-6绿色; 1-6绿色),对于每周销售,我检查是否星期nr包含在这些范围之一中,如果颜色是与促销颜色相对应的单元格的颜色。

可能的颜色是蓝色,黄色,绿色和紫色,优先级从蓝色=高优先级一直到紫色=低优先级。

如果sales nr为0,则用鲜红色覆盖。

我发现脚本可以改变颜色,但是我真的不知道如何操纵它们来做这样的事情。

这是我从另一个网站获得的内容,它只是读取一个单元格内容,如果显示“打开”,则会为它着色:

function myColorFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var range = ss.getSheetByName("Form Responses 1").getRange(2,6,ss.getLastRow());
  var cellRange = range.getValues();

  for(i = 0; i<cellRange.length-1; i++){
     if(cellRange[i][0] == "Open")
     {
       ss.getSheetByName("Form Responses 1").getRange(i+2,6).setBackground("red");
       ss.getSheetByName("Form Responses 1").getRange(i+2,6).setFontColor('white');
     }
  }
}

当我标记单元格“ color grading flag”并摆脱条件太慢的条件格式时,我想运行这样的功能。

这里是另一个示例:

enter image description here

带圆圈的销售单元在AO列中,该列属于第48周,如果在BB列中有一个涵盖该周的促销,则用促销颜色对其进行着色。在这种情况下,第6周到第14周为蓝色,因此该行的AY和AZ列应为蓝色。

希望澄清

感谢大家的宝贵帮助

1 个答案:

答案 0 :(得分:0)

我认为这可以完成您的版本,但速度要快得多。我仍然无法解决真正的问题。

function myColorFunction() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sh=ss.getSheetByName("Form Responses 1")
  var rg=sh.getRange(2,6,ss.getLastRow());
  var bA=rg.getBackgrounds();//get all background in the range
  var fA=rg.getFontColors();//get all font colors in the range
  var vA=rg.getValues();//get all values

  for(i=0;i<vA.length-1;i++){
     if(vA[i][0]=="Open")
     {
       bA[i][0]='#ff0000';//i+2 is not necessary inside the array because range starts at column2
       fA[i][0]='#ffffff';
     }
  }
  rg.setFontColors(fA);//sets ones that didn't change and ones that did at the same time.
  rg.setBackgrounds(bA)
}