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

}

0
Duke Bevard 21 avril 2017 à 04:41

3 réponses

Meilleure réponse

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

0
Jack Brown 22 avril 2017 à 15:40

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);
}
0
OblongMedulla 21 avril 2017 à 14:31

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:

enter image description here

J'espère que cela t'aides.

0
Mr.Rebot 21 avril 2017 à 15:22