2009-06-05 121 views
36

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

所以,对于像

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

表它将所有颜色在他们“1”的细胞。

+0

不一定编程相关.. – JasonV 2009-06-05 22:13:11

+2

条件格式化,即使这是通过用户界面完成的,它与编程相关,因为它需要分析问题以便以计算机可以执行的方式定义一组规则任务。考虑到这一点,我认为这个问题应该重新开放。 – 2016-10-06 03:20:27

+0

选择所有单元格并应用自定义公式:'=和(not(isblank(A1)),A1 = min(1:1))' – pnuts 2017-06-05 22:47:06

回答

57

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

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

编辑:

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

+1

如果您无法使用条件格式来实现所需内容,则始终可以使用脚本编辑器修改onEdit事件来检查单元格,并根据您想象的任何条件更改着色。不需要(或使用)Excel。 – 2011-12-29 09:57:48

+0

自2015年以来这已经发生了变化,但它确实让我得到了我需要的东西!你现在可以点击'Format' - >'Conditional formatting ...' - >'Color Scale'。 – PubNub 2015-12-03 22:54:37

+0

@Kekoa酷,感谢您的更新。 – 2016-04-15 00:26:48

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); 

运行服务器端的话,防止滥用,谷歌把时间限制在脚本执行。通过缓存值,可以节省服务器进行大量不必要的往返操作以从电子表格中获取值。

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

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

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

为简单起见,我设置了999的默认上限。 This could be change to a more appropriate value。诀窍是测试值与当前的低点。如果它较低,则标记新的低值。

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

处理含有最小多个小区需要第二遍:

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无法做到这一点。我使用public link来编写/测试这段代码。随时尝试一下。

相关问题