2013-08-24 4 views
0

J'essaie de boucler sur une colonne de ma feuille et de définir la valeur d'une cellule adjacente en fonction de la valeur et de la couleur de la cellule active. ce que je l'ai essayé, mais je ne peux pas sembler faire fonctionner ...Google Apps Script boucle conditionnelle

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

MISE À JOUR:

Merci! J'ai un très grand ensemble de données donc cette fonction expire. Je pensais à en faire une cellule unique à la fois. Je l'ai essayé, mais je ne peux pas sembler obtenir la couleur de la couleur de fond de la cellule 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; 

} 

Répondre

1

Je ne sais pas pourquoi vous choisissez cette solution « étape par étape », vous pouvez faire le script initial beaucoup plus efficace avec très peu de modifications.

Je suis sûr que si vous aviez mentionné que vous aviez beaucoup de données, Srik aurait suggéré une autre version de son code.

Basé sur this article about best practices dans GAS voici une version rapide de votre script qui ne devrait pas expirer.

pour plus d'informations, sur une feuille avec 1000 lignes que je reçois ce résultat:

Execution succeeded [0.282 seconds total runtime] 

Lui donner un essai ... ;-)

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

Merci! C'est bien. Je l'ai un peu modifié pour corriger ce que je faisais. grande aide! – Ptrkcon

1

En regardant le code, je pense que vous ne l'avez pas utilisé l'éditeur de script ou les invites disponibles l'éditeur. C'est parce que certaines des méthodes que vous avez utilisées n'existent pas.

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

Merci! Cela a presque fonctionné pour moi. J'ai mis à jour ma question. J'apprécie ton aide! – Ptrkcon

0

Vous pouvez également remplacer l'instruction if avec un one-liner:

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