在表格中找到的特定值的自动着色

Ver*_*gen 37 google-sheets gs-conditional-formatting

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

1 | 2 | 3
4 | 2 | 1
2 | 1 | 6
Run Code Online (Sandbox Code Playgroud)

它会为所有细胞着色1.

Kek*_*koa 57

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

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

编辑:

这就是你可以用着色做的程度.您可以找到一个复杂的公式来查找单元格的最小值,然后如果它与单元格中的单元格匹配,然后对其进行着色,但如果这对您来说很重要,则可能需要使用Excel而不是Google文档.


Eva*_*ice 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");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

function onEdit()
Run Code Online (Sandbox Code Playgroud)

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

注意:Docs中的事件处理程序虽然有点棘手.由于文档可以处理多个用户的多个同时编辑,因此事件处理程序在服务器端处理.此结构的主要问题是,当事件触发器脚本失败时,它在服务器上失败.如果要查看调试信息,您需要在触发器菜单下设置显式触发器,当事件失败时通过电子邮件向您发送调试信息,否则它将无声地失败.

获取行号:

var r = s.getActiveRange();
  var row = r.getRow();
Run Code Online (Sandbox Code Playgroud)

这里很自我解释.活动范围是正在编辑的单元格.

获取列数:

var cols = s.getDataRange().getNumColumns();
Run Code Online (Sandbox Code Playgroud)

您需要检查整个电子表格的数据范围.

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

var rowRange = s.getRange(row, 1, 1, cols);
Run Code Online (Sandbox Code Playgroud)

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

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

var rowRange = s.getRange(row, 1, 1, cols);
Run Code Online (Sandbox Code Playgroud)

由于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];
    }
  }
Run Code Online (Sandbox Code Playgroud)

为简单起见,我将默认上限设置为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");
  }
}
Run Code Online (Sandbox Code Playgroud)

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


这总结了一下.熟悉Google Apps Scripting处理引用电子表格和数据单元格的方式有点棘手,但Docs无法做到这一点.

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