J'ai un tableau des résultats des tournois de mon bass club dans Google Sheets (voir l'onglet Résumé TX dans https://docs.google.com/spreadsheets/d/1hPH2lKDtDqdjnghbYS3kWtXb3IGmunXao1JuWdi5SgM/edit?usp=sharing). Le tableau est le résultat d'une fonction QUERY regroupée par membre et pivotée par numéro d'événement. Lorsqu'un membre du club ne participe pas à un tournoi particulier, la cellule correspondante dans le tableau est vide.
Cliquez ici pour une image de l'état de table souhaité
J'ai un script Google (voir ci-dessous) que j'ai copié et modifié, qui change les bordures et les couleurs des cellules sur la feuille active. Cela fonctionne très bien si le résultat QUERY a des valeurs renseignées dans toutes les cellules. Je peux changer les cellules vides en dehors du tableau en # 0066cc sans bordures. Je suis capable de changer les cellules contenant une valeur dans la zone du tableau en #dbdbdb avec des bordures de tous les côtés.
Ce qui me pose problème, c'est lorsque le résultat QUERY contient des cellules BLANK. Pour ces situations, je souhaite ajouter des bordures et changer la couleur en #aaaaaa. Actuellement, le script colore les cellules vides dans le tableau # 0066cc et n'ajoute pas de bordures (passant par l'instruction else). Je me retrouve avec une table qui semble avoir joué à BREAKOUT (vous vous souvenez de celle-là?). J'ai essayé plusieurs variantes de comparaisons dans la seconde instruction if (je pensais que == "" ou === "" le ferait) pour tenter de modifier ces cellules, mais je n'arrive tout simplement pas à la faire fonctionner . Je sais que je manque probablement quelque chose de vraiment, de vraiment simple, mais après avoir regardé cela jusqu'à ce que mes yeux saignent, je ne peux pas voir la forêt pour les arbres. Toute aide serait grandement appréciée.
Merci,
Duc Bevard
function summaryBorders() {
var doc = SpreadsheetApp.getActiveSheet()
var range = SpreadsheetApp.getActiveSheet().getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns());
var cells = doc.getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns()).getBackgrounds();
range.setBorder(false, false, false, false, false, false);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
for (var j = 0; j < values[i].length; j++) {
if (values[i][j] !== "") {
range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#dbdbdb";
if (values[i][j] == "" && j >=2 && j<15) {
range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#aaaaaa";
}
} else {
cells[i][j] = "#0066cc";
}
}
}
doc.getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns()).setBackgrounds(cells);
}
3 réponses
La raison pour laquelle vous ne parvenez pas à faire apparaître les cellules vides dans votre plage de données en gris est que le code suivant présente un bogue:
if (values[i][j] !== "") { // This block doesn't run when you have a blank cell
range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#dbdbdb";
if (values[i][j] == "" && j >=2 && j<15) { // this if statement is never called I.e. this block is skipped over when the cell is empty
range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#aaaaaa";
}
} else {
cells[i][j] = "#0066cc";
}
La seconde instruction if n'est jamais exécutée. Parce qu'il est à l'intérieur du premier bloc, qui n'est jamais exécuté lorsqu'une cellule vide est rencontrée. Pour que cela fonctionne correctement, vous devrez faire quelque chose comme ça
if (values[i][j] !== "") {
range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#dbdbdb";
} else if (values[i][j] == "" && j >=2 && j<15) {
range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#aaaaaa";
} else {
cells[i][j] = "#0066cc";
}
Pour plus de détails sur le cas échéant, consultez le tutoriel ici
Cela semble fonctionner - La raison pour laquelle cela ne fonctionnait pas est qu'il y a une différence entre les cellules vides et zéro. vide signifiant qu'une cellule qui a un "espace dedans" zéro cellules sont comme inactives. Donc je l'ai changé pour chercher 0 ou vide, j'ai également supprimé la petite partie "&& j> = 2 && j <15" pour le test - vous voudrez le rajouter.
function summaryBorders() {
var doc = SpreadsheetApp.getActiveSheet()
var range = SpreadsheetApp.getActiveSheet().getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns());
var cells = doc.getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns()).getBackgrounds();
range.setBorder(false, false, false, false, false, false);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
for (var j = 0; j < values[i].length; j++) {
if (values[i][j] !== "") {
range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#dbdbdb"; }
if (values[i][j] = 0 || values[i][j] == "") {
range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#aaaaaa";
}
else {
cells[i][j] = "#0066cc";
}
}
}
doc.getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns()).setBackgrounds(cells);
}
Essayez de limiter votre portée.
J'ai utilisé ce code:
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
// Returns the active range
var range = sheet.getRange(3,3,3,4);
Logger.log(range.getLastRow())
var cells = sheet.getRange(3,3,3,4).getBackgrounds();
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
for (var j = 0; j < values[i].length; j++) {
if (values[i][j] !== "") {
range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#dbdbdb";
if (values[i][j] == "" && j >=2 && j<15) {
range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
cells[i][j] = "#aaaaaa";
}
} else {
cells[i][j] = "#0066cc";
}
}
}
sheet.getRange(3,3,3,4).setBackgrounds(cells);
}
Résultat:
J'espère que cela t'aides.
De nouvelles questions
google-apps-script
À utiliser pour les questions sur Google Apps Script, la plate-forme de script cloud basée sur JavaScript de Google pour automatiser les tâches entre les produits Google et les services tiers. À utiliser en plus des balises pertinentes spécifiques au produit (par exemple [google-sheets], [google-docs]) ou spécifiques à l'API (par exemple [google-drive-api]), le cas échéant