2013-07-09 208 views
3

如何根據onEdit()函數中單元格的內容更改單元格背景顏色?根據值更改單元格背景顏色onEdit

我有很多版本的代碼,我測試了這個 - 一些工作幾乎正確,有些根本不工作。 但我還沒有得到這個工作方式,我需要它。

請原諒這樣寫的方式缺乏優雅,但我實際上需要保持代碼儘可能直接,因爲會有許多單元格更改,許多條件和許多不同數量的單元格根據工作表上發生的變化而改變。

好了,所以這裏去...

function onEdit(event) 
{ 
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); 
var changedCell= event.source.getActiveRange().getA1Notation(); 

if (changedCell == 'B3') { 
var c = ss.getRange("B3").getValue(); 
    if (c < 2); { 
    ss.getRange("B3").setBackgroundColor('#ff0000'); 
    ss.getRange("B12").setBackgroundColor('#ff0000'); 
    } 
    if (c > 1); { 
    ss.getRange("B3").setBackgroundColor('#000000'); 
    ss.getRange("B12").setBackgroundColor('#000000'); 
    } 
} 
} 

回答

6

有幾件事情需要注意

1,方法的名稱是setBackground而不是setBackgroundColor

2.How是小區B3格式化。只有格式化爲整數時,該比較纔有效。在大多數情況下,Google Spreadsheet會根據數據類型自動格式化單元格,但如果我正在編寫代碼,那麼我會仔細檢查。所以使用類似

var c = parseInt(ss.getRange("B3").getValue()) ; 

3.在if條件後不需要分號。這將立即終止if條件。因此,使用

if (c < 2) { 

if (c > 1) { 

4.最後,我不知道數據如何進入B3,但如果你在B3 1.5,那麼無論是if條件爲真和你的背景顏色被覆蓋。所以,我建議你使用一個if..elseif

爲了更好的可讀性,我會使用setBackground('red')setBackground('white')爲常見的顏色。

+1

重1 - 雖然它不再在文檔或自動完成,'setBackgroundColor'仍然有效。 – Mogsdad

+0

哇。感謝您讓我直接使用分號。我想我可能會加上他們只是爲了看看這是否有幫助,但我承認我的目的並不是很清楚,所以我正在抓。順便說一句,我只是最近才意識到,搜索氣體解決方案往往很少返回有用的信息的方式。恰當的例子是「parseInt」。谷歌搜索「谷歌應用程序腳本和parseInt」返回沒有用,除了1(!)鏈接到JavaScript的w3schools引用。很明顯,我需要花更多時間來搜索JavaScript資源。感謝斯里克! – 5th4x4

+0

@Mogsdad - 我在某處找到了「setBackgroundColor」,它確實爲我工作。但我不知道它現在在GAS中流行了。順便說一下,我收到了googlecode關於驗證問題的一封電子郵件:「數據驗證仍然是我們正在實施的一項開放功能請求,在功能的工作仍在進行中時,這些方法被意外公佈,因此,我們建議不要針對這個預先發布的API進行編碼,因爲它可能會改變「。現在你看到了,現在你不......我想。 – 5th4x4

3

除了從斯里克的建議,你應該考慮你的onEdit()功能的效率。總體思路是確定是否應儘快並儘可能便宜地進行救助,然後根據Best Practices(主要將服務呼叫最小化)優化其餘代碼。

它看起來像你想的onEdit()對「Sheet2的」僅執行,但你寫的方式,這將觸發對改變任何片,但勾搭上「Sheet2的」色彩。 (這不是一個明顯的問題,因爲「Sheet2」上的條件是用於決定着色的條件,但是您將無謂地耗費腳本執行時間。)通過使用event信息來確定哪些表已更新,如果不是「Sheet2」,則退出,onEdit()的成本下降。

我同意斯利克關於if陳述......我只是不能告訴你想要什麼。不過,我認爲else if的建議不會解決它,因爲它會把c > 1當作c > 2 ......如果你想這麼做,爲什麼不寫下它呢?也許你想要1 < c < 2沒有顏色,紅色爲c < 1,黑色爲c > 2?你應該理清那部分的邏輯。

下面是一個優化的onEdit()看起來,最大限度地利用event信息的:

function onEdit(event) 
{ 
    var ss = event.range.getSheet(); 
    if (ss.getName() !== "Sheet2") return; // Get out quickly 
    var changedCell = event.source.getActiveRange(); 
    var changedCellA1 = changedCell.getA1Notation(); 
    if (changedCellA1 !== 'B3') return; 

    var c = event.value; // We know we edited cell B3, just get the value 
    var background = 'white'; // Assume 1 <= c <= 2 
    if (c > 2) { 
    background = 'red'; 
    } 
    else if (c < 1) { 
    background = 'black'; 
    } 
    changedCell.setBackground(background); 
    ss.getRange("B12").setBackground(background); 
} 
+0

我不得不承認,我從某個地方將OnEdit拆除了。和往常一樣,我沒有找到基本的簡明信息;我實際上不得不從一個遠遠超出我理解的複雜過程中解析出來。我知道你喜歡討論谷歌開發者的文檔,但是我發現它很大程度上令人失望和想要。我似乎並沒有從這個資源中學到很多 - 這與vba資源的極性相反,我似乎很容易找到。幸運的是,我在這裏學到了很多...雖然我通常不會問,直到我已經爲追求無盡的死衚衕而燒死自己。不管怎樣,謝謝! – 5th4x4

相關問題