谷歌电子表格自动着色

我正在寻找一种方法来自动更改在谷歌文档电子表格中的行中的最小单元格的颜色。

所以,像一个表

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

它会把所有的单元格都打上“1”。

在下拉菜单中,格式 – >条件格式…

然后设定你的规则和你的颜色。 您可以select多个单元格,也可以这样做。

编辑:

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

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

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

这是完整的脚本(testing和工作):

 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中的事件处理程序虽然有点棘手。 由于文档可以处理由多个用户进行的多个同时编辑,所以事件处理程序在服务器端处理。 这种结构的主要问题是,当事件触发器脚本失败时,它在服务器上失败。 如果您想查看debugging信息,则需要在触发器菜单下设置显式触发器,当事件失败时将debugging信息通过电子邮件发送给您,否则将自动失败。

取行号:

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

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

抓数列数:

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

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

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

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

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

然后我们caching结果以testing值:

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

由于Google Docs脚本事件callback的性质,在服务器端运行,所以为了防止滥用,Google对脚本执行时间进行了限制。 通过caching这些值,您可以节省服务器进行大量不必要的往返操作以从电子表格中获取值。

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

首先,我们通过行的所有单元格来查找最小值。

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

为了简单起见,我设置了999的默认上限。 这可能会变成更合适的价值 。 诀窍是testing值与当前的低点。 如果它较低,则标记新的低值。

你可以通过标记最低值的单元格编号并明确地设置它,但我想覆盖多个单元格具有最低值的情况。

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

 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无法做到这一点。

我已经build立了一个公开的链接到我用来编写/testing这个代码的电子表格。 随意尝试一下。