37

我正在寻找一种方法来自动更改 Google 表格中连续最小单元格的颜色。所以,对于像这样的表:

1 | 2 | 3
4 | 2 | 1
2 | 1 | 6

它会为其中的所有单元格着色1

4

2 回答 2

57

在下拉菜单中,格式->条件格式...

然后设置你的规则和你的颜色。您可以选择多个单元格并执行此操作。

编辑:

这就是你可以用着色做的程度。您也许可以找到一个复杂的公式来找到最小的单元格,然后如果它与单元格中的内容匹配,然后为它着色,但是如果这对您来说很重要,您可能想要使用 Excel 而不是 Google 文档。

于 2009-06-05T22:24:36.000 回答
26

诀窍是利用 onEdit 事件触发器并添加一些智能

乍一看,我认为条件格式可以工作,但是对于标准条件格式来说,每行的最小值有点太复杂了。这有点棘手,但可以做到。

这是完整的脚本(经过测试和工作):

function onEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  var r = s.getActiveRange();
  var row = r.getRow();
  var cols = s.getDataRange().getNumColumns();

  // crate a range for the row using getRange(row, column, numRows, numColumns)
  var rowRange = s.getRange(row, 1, 1, cols);
  var rowValues = rowRange.getValues();

  // check all the values in the row
  var val = 999;
  for(var i = 0; i < cols; i++) {
    if(val > rowValues[0][i] && rowValues[0][i] !== "") {
      val = rowValues[0][i];
    }
  }
  for(var j = 0; j < cols; j++) {
    if(rowValues[0][j] === val) {
      s.getRange(row,(j + 1)).setFontColor("blue");
    } else {
      s.getRange(row,(j + 1)).setFontColor("black");
    }
  }
}

首先,您点击 onEdit 事件处理程序以触发带有电子表格更改的脚本。

function onEdit()

通过将函数命名为 onEdit,它会自动知道您要覆盖 onEdit 操作。

注意:Docs 中的事件处理程序有点棘手。因为文档可以处理多个用户同时进行的多个编辑,所以事件处理程序是在服务器端处理的。这种结构的主要问题是,当事件触发脚本失败时,它会在服务器上失败。如果您想查看调试信息,您需要在触发器菜单下设置一个显式触发器,当事件失败时通过电子邮件向您发送调试信息,否则它将静默失败。

获取行号:

var r = s.getActiveRange();
  var row = r.getRow();

这里很不言自明。活动范围是正在编辑的单元格。

获取列数:

var cols = s.getDataRange().getNumColumns();

为此,您需要检查整个电子表格的数据范围。

接下来,您需要构建一个包含相关行数据的数据范围:

var rowRange = s.getRange(row, 1, 1, cols);

阅读代码中的注释以查看值应该是什么。

然后我们缓存结果以测试值:

var rowRange = s.getRange(row, 1, 1, cols);

由于 Google Docs 脚本事件回调在服务器端运行的性质,为了防止滥用,Google 对脚本执行设置了时间限制。通过缓存这些值,您可以避免服务器进行大量不必要的往返以从电子表格中获取值。

接下来的两部分是所有魔术发生的地方。

首先,我们遍历该行的所有单元格以找到最小值。

  var val = 999;
  for(var i = 0; i < cols; i++) {
    if(val > rowValues[0][i] && rowValues[0][i] !== "") {
      val = rowValues[0][i];
    }
  }

为了简单起见,我将默认上限设置为 999。这可以更改为更合适的值。诀窍是测试该值与当前低点。如果它较低,则标记新的低值。

您可以通过标记具有最低值的单元格编号并明确设置它来轻松下车,但我想涵盖多个单元格具有最低值的情况。

处理包含最小值的多个单元格需要第二遍:

for(var j = 0; j < cols; j++) {
  if(rowValues[0][j] === val) {
    s.getRange(row,(j + 1)).setFontColor("blue");
  } else {
    s.getRange(row,(j + 1)).setFontColor("black");
  }
}

遍历行中所有单元格的循环保持不变。这次我们只是检查单元格值是否与选择的最小值匹配。如果匹配,字体颜色将变为蓝色。否则,字体颜色将更改为黑色。


大概就是这样总结。习惯 Google Apps 脚本处理引用电子表格和数据单元格的方式有点棘手,但 Docs 并没有什么不能做的。

我已经创建了一个指向我用来编写/测试此代码的电子表格的公共链接。随意尝试一下。

于 2012-01-02T14:42:55.357 回答