2013-08-24 60 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"); 
    } 
}