2009-06-05 162 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來編寫/測試這段代碼。隨時嘗試一下。

相關問題