2013-08-24 84 views
0

我想循環顯示錶格中的一列,並根據活動單元格的值和顏色將值設置爲相鄰單元格。這是我做過嘗試,但我似乎無法得到工作...Google Apps腳本條件循環

function setValue(){ 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var end = SpreadsheetApp.getActiveSheet().getLastRow(); 

    for(var i = 1; i < end + 1; ++i){ 
    var value = sheet.getRange(i, 4).getValue(); 
    var color = sheet.getRange(i, 4).getColor(); 
    if (value == "Authenticated" && color == "#ffffff") { 
     sheet.getRange(i, 5).setValue("True"); 
     } 
    else { 
     sheet.getRange(i, 5).setValue("False"); 
     } 
    } 
} 

UPDATE:

謝謝!我有一個非常大的數據集,所以此功能超時。我正在考慮將它作爲一個時間單元。我試過,但我似乎無法得到inputValue將單元格背景色的顏色...

function setKeep(inValue){ 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var cell = sheet.getActiveCell(); 
    var color = cell.getBackgroundColor(); 
    var outValue = ""; 

    if (inValue == "AUTHENTICATED" && color == "white"){ 
    outValue = "TRUE"; 
    } 
    else{ 
    outValue = "FALSE"; 
    } 
    return outValue; 

} 

回答

1

不知道你爲什麼選擇這個「一步一步」的解決方案,你可以通過很少的修改使初始腳本更加高效。

我敢肯定,如果你提到你有很多數據,Srik會建議他的代碼的另一個版本。

根據GAS中的this article about best practices這裏是一個腳本的快速版本,不應該超時。

的信息,與1000行的表,我得到這樣的結果:

Execution succeeded [0.282 seconds total runtime] 

試試看吧... ;-)

function setValue(){ 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var end = SpreadsheetApp.getActiveSheet().getLastRow(); 
    var range = sheet.getRange(1,4,end,2);// get both columns you need 
    var colors = range.getFontColors();// batch read colors in range 
    var values = range.getValues();// batch read values in range 
    for(var i = 0; i < values.length; ++i){ // loop in the array instead of sheet, it's really faster 
    Logger.log(colors[i][0]); 
    if (values[i][0] == "Authenticated" && colors[i][0] == "#ffffff") { // compare the array values 
     values[i][1]='True';// and write result in the array as well 
    } 
    else { 
     values[i][1]='False';// and write result in the array as well 
    } 
    } 
    range.setValues(values);// batch write back the results in sheet 
} 
+0

謝謝!這很棒。我已經調整了一下,以解決我在做的事情。大幫忙! – Ptrkcon

1

的代碼看,我想你還沒有使用的腳本編輯器或提示提供編輯。那是因爲你使用的一些方法不存在。

function setValue(){ 
    var sheet = SpreadsheetApp.getActiveSheet(); // You want the sheet not the spreadsheet. 
    var end = SpreadsheetApp.getActiveSheet().getLastRow(); 

    for(var i = 1; i < end + 1; ++i){ 
    var value = sheet.getRange(i, 4).getValue(); 
    var color = sheet.getRange(i, 4).getFontColor(); // There is no Range.getColor() 
    Logger.log(color); // Print out the color to see what you're getting. I was getting a 'general-black' as the color 
    if (value == "Authenticated" && color == "#ffffff") { 
     sheet.getRange(i, 5).setValue("True"); 
    } 
    else { 
     sheet.getRange(i, 5).setValue("False"); 
    } 
    } 
} 
+0

謝謝!這幾乎爲我工作。我已經更新了我的問題。我感謝您的幫助! – Ptrkcon

0

您也可以替換if語句一行:

function setValue(){ 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var end = sheet.getLastRow() + 1;    // reuse existing sheet 

    for(var i = 1; i < end; i++) {    // traditional for loop iterates with i++ 
    var value = sheet.getRange(i, 4).getValue(); 
    var color = sheet.getRange(i, 4).getFontColor(); 
    // The ('value == ...') returns true or false 
    sheet.getRange(i, 5).setValue(value == "Authenticated" && color == "#ffffff"); 
    } 
}