Cellule remplie avec "0" considérée comme vide
Bonjour,
J'ai fait un script sur google sheets me permettant de déterminer la dernière case non vide d'une plage de données (colonne a : colonne b) pour par la suite faire des copier coller sur des feuilles différentes sans qu'il y ait trop de cellules vides entre les collages (peut-être pas le plus élégant ni le plus efficace, mais c'est compatible avec mon niveau de connaissances en programmation, et ça suffit à mes besoins, les plages de données faisant 25 cases maximum).
Cette fonction est appelée plusieurs fois par une autre programme que j'ai testé de plusieurs manières et tout fonctionne à une exception près. J'ai l'impression qu'il considère une case où il est entré "0" comme une cellule vide, faussant mon compteur dans ce cas. Y a-t-il moyen d'écrire différemment les conditions dans les if (val == "" ou val != "") pour que le 0 devienne une cellule remplie ?
function longueur (colonne, a, b, sh){
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName(sh), true);
var compt = a;
cellule = spreadsheet.getRange(colonne + compt);
val = cellule.getValue();
if (val == ""){
return a;
}
while (compt < (b+1)){
cellule = spreadsheet.getRange(colonne + compt);
val = cellule.getValue();
if (val != ""){
compt++;
}
else return (compt-1);
}
}
Merci
Bonjour,
0 n'est pas égal à ""
Faites des logs voir si les cellules concernées sont bien testées, par exemple, après cette ligne :
cellule = spreadsheet.getRange(colonne + compt);
mettez : console.log(cellule.getA1Notation())
Ensuite dans les logs, vous devriez voir apparaitre toutes les cellules testées par votre script, les cellules contenant 0 sont elles bien testées ?
Si non, voyez pourquoi, si oui, mettez un nouveau log après le test, voir s'il est validé ou non.
Bonjour à tous,
0 n'est pas égal à ""
En fait, si
Dans ce cas, si val
vaut 0
la condition est validée :
const val = 0;
console.log(val == ""); // Renvoie : true
Pour que la condition soit validée seulement si val
vaut ""
(et pas 0, false, null ou undefined), il faut utiliser ===
:
const val = 0;
console.log(val === ""); // Renvoie : false
Pour plus de détails à ce sujet :
Ah bon ? J'utilise === ou !== pour éviter ce genre de déconvenue, mais j'ai fais le test, en colonne A, des 0 et des 1
le script suivant :
function myFunction() {
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let data = sheet.getRange(1,1,sheet.getLastRow(),1).getValues();
for(i=0;i<data.length;i++){
console.log(data[i][0])
if(data[i][0]!=""){
sheet.getRange(i+1,2).setValue('différent de rien')
}
}
}
Avec l'opérateur de test != j'ai le résultat suivant :
Avec l'opérateur de test !== j'ai le résultat suivant :
Donc en effet, il faut systématiquement, sauf cas exceptionnel bien choisir son opérateur , @alnilman dans ton cas à tester :
function longueur (colonne, a, b, sh){
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName(sh), true);
var compt = a;
cellule = spreadsheet.getRange(colonne + compt);
val = cellule.getValue();
if (val === ""){
return a;
}
while (compt < (b+1)){
cellule = spreadsheet.getRange(colonne + compt);
val = cellule.getValue();
if (val !== ""){
compt++;
}
else return (compt-1);
}
}
@alnilman : voici une version plus simple et plus rapide (et qui gère en plus le cas où aucune cellule vide n'existe dans la plage)
function longueur(colonne, a, b, sh){
const ss = SpreadsheetApp.getActive().getSheetByName(sh); // Feuille
const valeurs = ss.getRange(colonne + a + ':' + colonne + b).getValues().flat(); // Liste des valeurs de la plage
const position = valeurs.indexOf(''); // Position du premier ''
// Renvoie b si aucun '' / renvoie a si la première cellule est vide / sinon renvoie le numéro de ligne
return position == -1 ? b : (position ? position + a - 1 : a);
}
Merci beaucoup à tous les deux pour vos réponses.
Merci aussi pour la version simplifiée du script, je vais essayer de la comprendre avant de l'utiliser. Il y a des mots clés que je n'ai encore jamais employé.