条件格式化电子表格单元格

时间:2013-11-19 19:52:17

标签: google-apps-script google-sheets gs-conditional-formatting

我正在尝试创建一个Google Apps脚本,这样我就可以通过更改单元格的颜色来快速确定是否需要采取进一步措施。目前我正在执行审核流程,我会查看产品的5%是否存在错误。如果发现太多错误,我需要查看100%的产品。

我一直在尝试创建一个脚本,在满足错误阈值时将更改单元格的颜色,并且需要满足以下条件。我会使用条件格式,但选择一个脚本,以便升级方法不那么明显,因此,如果需要,未来的扩展可以操纵文本格式。

  • 如果a1小于或等于50且b1小于那么四个颜色单元c1绿色
  • 如果a1小于或等于50且b1大于那么四个颜色单元c1红色
  • 如果a1大于或等于50且b1小于a1的4%,则颜色单元格c1为绿色
  • 如果a1大于或等于50且b1大于a1的4%,则颜色单元格c1为红色

非常感谢任何和所有帮助!


function onEdit(e) { 
  var ss = e.source.getActiveSheet(); 
  var r = e.source.getActiveRange(); 
  if (r.getRow() != 1 && ss.getName() == "Entry Form") { 
    Error_Count = ss.getRange(r.getRow(),3).getValue(); 
    rowRange = ss.getRange(r.getRow(),1,1,3);

    if (Error_Count < 3.8) {
      rowRange.setBackgroundColor("#FF0000"); }
    else if (Error_Count == 'N/A') {
      rowRange.setBackgroundColor("#ffffff"); }
    else if (Error_Count > 3.9) {
      rowRange.setBackgroundColor("#ffffff");
    }

1 个答案:

答案 0 :(得分:0)

你提到“未来的扩张”,但具体而言“a1”,“b1”和“c1”并不是很容易扩展。

我的建议如下:

  1. 使用Sheet class获取“a1:c100”(a-c列为100行)。或者也许使用Sheet classgetLastRow(),然后使用getRange(1, 1, lastRow, 3),这样就会有列a-c,其中所有行都包含数据(我认为最好)。
  2. 使用getValues函数获取该范围的值。这将返回一个矩阵。
  3. 由于您的值位于矩阵中, a1 基本上为values[0][0] b1 values[0][1] c1 values[0][2]
  4. 您可以轻松遍历值的每个“行”,如:

    for (var i = 0; i < values.length; i ++) {
    // do your comparisons for each row.
    // row[0] is "a_rowNumber", row[1] is "b_rowNumber", etc.
    var row = values[i];
    
  5. 现在你可以进行比较(纯粹是数学的,我想我会留给你)

  6. 如果比较如:

    if (row[0] > 50 && row[1] < 4)
    

    评估为true,您可以再次使用getRange()函数,如:

    getRange(i + 1, 3)
    

    请记住 i 是行,3是列c:因为您的数组从索引0开始,但是数组中的实际行号(由getRange()使用从1开始。

  7. 获得该范围(此时为一个单元格)后,您想要在列c中着色,请使用Range.setBackgroundColor()。事实上,有许多方法可以设置背景颜色,使用RGB,十六进制颜色值或简单的颜色值,如“红色”。随便挑选!

  8. 修改:以下是您可以访问所需数据以及如何使用数据的示例:

    function onEdit(e) {
      // Get the variable "sheet" so that we can get more ranges and set colors later
      var sheet = e.source.getActiveSheet();
      // Get the edited cell so we can look at the current row
      var cell = e.source.getActiveRange();
      // Get the current row (which is the same row where the cell was edited)
      var editedRow = cell.getRow();
    
      if (cell.getRow() != 1 && sheet.getName() == "Entry Form") {
        // Get the actual values in that row (the ones we want to use, which are columns A-C)
        var rowValues = sheet.getRange(editedRow, 1, 1, 3).getValues();
    
        // Your first condition is met: get the current row, column 3 (current row, C), set background color
        if (rowValues[0] <= 50 && rowValues[1] < 4) sheet.getRange(editedRow, 3).setBackgroundColor("green");
        // Your second condition is met: get the current row, column 3 (current row, C), set background color
        else if (rowValues[0] <= 50 && rowValues[1] > 4) sheet.getRange(editedRow, 3).setBackgroundColor("green");
        // Your third condition is met: get the current row, column 3 (current row, C), set background color
        else if (rowValues[0] >= 50 && (rowValues[1] < .04 * rowValues[0])) sheet.getRange(editedRow, 3).setBackgroundColor("green");
        // Your fourth condition is met: get the current row, column 3 (current row, C), set background color
        else if (rowValues[0] >= 50 && (rowValues[1] >= .04 * rowValues[0])) sheet.getRange(editedRow, 3).setBackgroundColor("green");
      }
    }