J'ai une feuille GS qui utilise IMPORTRANGE()
pour importer des données à partir d'une autre feuille. Sur cette feuille de destination, je souhaite colorier chaque ligne en fonction de la valeur de la colonne A.
Étant donné que le jeu de données source peut contenir des centaines ou des milliers de lignes, je ne peux pas facilement utiliser conditional formatting
pour chaque colonne de la ligne. J'utilise donc l'exemple de code ci-dessous:
function formatColor(event) {
var sheet = SpreadsheetApp.openById("ID OF THE SHEET I WANT TO FORMAT");
var sheetCount = sheet.getSheets().length;
// for each sheet
for (var i = 0; i < sheetCount; i++)
{
var sheet = sheet.getSheets()[i];
var maxRows = sheet.getMaxRows();
var maxCols = sheet.getMaxColumns();
var colors = new Array(maxRows);
var values = sheet.getRange(1,1,maxRows).getValues();
//for each row
for (var j = 0; j < maxRows; j++)
{
//get th value of column 1
var range = sheet.getRange(j, 1);
var value = values[j];
// make an array to hold the background color for each column
colors[j] = new Array ()
// pick a color based on the value
if (value == "Red") color = "Red";
else if (value == "Green"){ color = "Green"; }
else if (value == "Blue") { color = "Blue"; }
else color = "#ffffff";
// fill the array (column) with the selected color
for (var c=0; c < maxCols ; c++){
colors[j].Push(color)
}
}
// in one command send the colors for each cell in the grid since
// since setBackgroundColors() is an expensive call
//deprecated, use setBackgroundRGB()
sheet.getRange(1,1,maxRows,maxCols).setBackgroundColors(colors); }
}
Parce que cette fonction ne peut pas être déclenchée par onEdit
sur onChange
(en raison de la IMPORTRANGE()
), j'utilise un événement piloté par le temps toutes les minutes pour exécuter la fonction. Cela fonctionne assez bien, en changeant la couleur d'arrière-plan de chaque ligne toutes les minutes en fonction de la valeur de la première colonne entrée dans une autre feuille.
Cependant, je continue à avoir l'erreur:
Method Range . setBackgroundColors est obsolète.
Il y a quelque temps, j'ai effectué des recherches et je crois qu'il a été recommandé d'utiliser setBackgroundRGB()
.
Le problème avec l'utilisation de cette fonction est qu'il n'y a pas de version plurielle setBackgroundRGBs()
qui permettrait de définir toutes les cellules à la fois. Si vous essayez d'utiliser ceci sur une feuille avec des centaines de cellules à formater, cela prendrait une éternité et probablement une erreur.
Est-ce que je manque quelque chose ou existe-t-il un meilleur moyen de le faire?.
Comme vous le savez (peut-être), le fait qu'une méthode soit "obsolète" ne signifie pas qu'elle ne fonctionne pas, mais simplement qu'elle pourrait être supprimée à l'avenir.
Donc, vous n'obtenez probablement pas une erreur , mais un avertissement , et votre code devrait fonctionner comme prévu.
Cela étant dit, il y a un remplacement: Il semble que setBackgroundColors
vient d'être renommé en setBackgrounds
, qu'il est connu sous le nom documentation .
J'ai essayé ces deux fonctions:
function doesGiveWarning() {
var range = SpreadsheetApp.getActiveSheet().getRange("A2:C2");
range.setBackgroundColors([["red", "white", "blue"]]);
}
function doesNotGiveWarning() {
var range = SpreadsheetApp.getActiveSheet().getRange("A2:C2");
range.setBackgrounds([["red", "white", "blue"]]);
}
Si vous exécutez doesGiveWarning
, l'ampoule de l'éditeur de script s'allume:
... et, cliquer dessus affiche l'avertissement,
tandis que doesNotGiveWarning
s'exécute sans aucun avertissement. Dans les deux cas, les cellules sont remplies avec les couleurs que je spécifie.
Cependant, vous semblez avoir raison, il n'y a pas de version plurielle de setBackgroundRGB
(pour le moment). Si vous êtes prêt à convertissez vos valeurs RVB en hexadécimal , vous pouvez toujours utiliser setBackgrounds
, car il accepte les deux noms de couleur CSS (red
, white
, blue
) et les valeurs hexadécimales (#FF0000
, #FFFFFF
, #0000FF
).