【问题标题】:Google script to color a cell based on another cells valueGoogle脚本根据另一个单元格值为单元格着色
【发布时间】:2019-04-21 23:13:24
【问题描述】:

我正在尝试根据列中单元格的颜色是否大于另一个单元格(在同一行中)

我已经设置了条件格式,但是当我在工作表中复制粘贴时,公式会变得混乱,因此我希望对 gs 做同样的事情。

我发现我需要使用onEdit() (https://developers.google.com/apps-script/guides/triggers/#Simple) 在每次单元格更改时更新更改。

并从此处的其他问题中获得了一些代码,但我在 getRange 中遇到错误。

function onEdit(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Programar');
  var values = sheet.getRange(2, 16, 3).getValues();
  var values_now = sheet.getRange(2, 5, 3).getValues();
  var color = '';  
  var current_row = 2
  for (var i = 0; i < values.length; i++)
  {

    if (values_now[i][0] > values[i][0])
    {
            SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
    .alert(values_now[i][0] + ' ' + values[i][0]);
      color='#FFDD88'
    }
    else if (values_now[i][0] < values[i][0])
    {
      color = '#CC6666'
    }
    sheet.getRange(current_row, 5).setBackgroundColor(color);
    current_row++
  }

}

我在 values 中选择的范围是 P2:P243,在 values_now E2:E243 中,最后一个范围是我喜欢为单元格着色的范围。

  • 所以如果 P2 比 E2 大,E2 应该是蓝色的
  • 如果 P32 小于 E32,则 E32 应为红色。等等……

【问题讨论】:

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


    【解决方案1】:

    这个修改怎么样?修改后的脚本流程如下。请认为这只是几个答案之一。

    1. 从单元格中检索值。
    2. 将红色和蓝色的坐标放入一个数组中。
    3. 将检索到的坐标应用于单元格。

    修改脚本:

    function onEdit(e) {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Programar');
      var values = sheet.getRange("E2:P243").getValues();
      var colorToRed = [];
      var colorToBlue = [];
      for (var i = 0; i < values.length; i++) {
        var e = values[i][0];
        var p = values[i][11];
        if (e > p) {
          colorToRed.push("E" + (i + 2));
        } else if (e < p) {
          colorToBlue.push("E" + (i + 2));
        }
      }
      sheet.getRangeList(colorToRed).setBackground("#FFDD88"); // #FFDD88 is used as red?
      sheet.getRangeList(colorToBlue).setBackground("#CC6666"); // #CC6666 is used as blue?
    }
    

    注意:

    • 在此修改后的脚本中,当列“E”和“P”的值相同时。背景颜色没有改变。

    参考资料:

    如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

    编辑:

    作为其他示例脚本,当使用setBackgrounds()时,脚本如下。

    示例脚本:

    function onEdit(e) {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Programar');
      var values = sheet.getRange("E2:P243").getValues();
      var colors = [];
      for (var i = 0; i < values.length; i++) {
        var e = values[i][0];
        var p = values[i][11];
        if (e > p) {
          colors.push(["#FFDD88"]); // #FFDD88 is used as red?
        } else if (e < p) {
          colors.push(["#CC6666"]); // #CC6666 is used as blue?
        } else {
          colors.push([""]);
        }
      }
      sheet.getRange(2, 5, colors.length, 1).setBackgrounds(colors);
    }
    

    【讨论】:

    • 非常感谢,有什么办法让它更快,它必须改变很多行?
    • @user8459020 感谢您的回复。我很高兴你的问题得到了解决。是的。使用setBackground()getRangeList(),处理速度比setBackground()getRange()快。作为其他示例脚本,我添加了一个使用 setBackgrounds() 的脚本。
    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 2017-06-19
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多