[Apps-Script sheets] Première cellule et dernière cellule non-vide dans la ligne actuelle

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Je suis à la recherche d’un script qui me permette de trouver la première cellule non vide de la ligne actuelle (quelque soit la ligne dans laquelle je me trouve).

Une fois cette cellule trouvée, je voudrais lui donner des attributs comme par exemple avec setBorder.

Je voudrais ensuite faire la même chose avec la dernière cellule non vide de la ligne actuelle.

Enfin, je voudrais donner un autre attribut aux cellules dans lesquelles j’ai des données.

Tout cela sur la ligne actuelle sur laquelle je me trouve.

j’espère que quelqu’un pourra m’aider :)

Si je n’ai pas été assez claire dans ma demande, je reste à votre disposition.

Je vous remercie d’avance.

Bien à vous.

+0 -0

Je ne pense pas qu’il existe de script tout fait mais tu peux toujours passer par un algorithme fait maison.

Structurer le script

Je ne garantie pas que la logique sera la plus performante, mais elle est je trouve intuitive :

Premièrement on va séparer le problème en trois parties comme tu l’as fait :

  • trouver la première cellule non vide
  • trouver la dernière cellule non vide
  • associer un style au range qui en résulte

function firstNotEmpty(spreadsheet, row){

}

function lastNotEmpty(spreadsheet, row) {

}

function applyStyle(spreadsheet, start, end) {

   const range = spreadsheet.getRange(start, end);
   range.setBorder(true, true, true, true, false, false); // par exemple mettre des bordures autour du range
}

// code principal
const app = SpreadsheetApp.getActive();
const spreadsheet = app.getActiveSpreadsheet();
const row = app.getActiveRange().getRow();
applyStyle(spreadsheet, firstNotEmpty(spreadsheet, row), lastNotEmpty(spreadsheet, row))

Maintenant qu’on a la structure de note algorithme, résolvons chaque problème un par un.

Un petit problème à la fois

Trouver la première cellule non vide

Pour trouver la première cellule non vide, c’est assez facile finalement : on parcours la ligne complète et on regarde la première colonne non vide.

Pour parcourir une ligne il faut d’abord sélectionner la ligne complète puis le parcours se fait comme dans le tutoriel.

Le point le plus difficile c’est donc d’obtenir la ligne complète.

méthode 1 : créer le range

COmme tu l’as fais dans un autre message, tu peux obtenir le range avec simplement spreadsheet.getRange(row, 1, row, spreadSheet.getLastColumn()).

méthode 2 : utiliser la méthode qui permet de lister le range qui a une données

l’objet Spreadsheet possède la fonction getDataRange() qui te retourne un tableau avec toutes les lignes. Ensuite, il te suffit d’utiliser dataRange[row] pour avoir toutes les données de la lignes.

Avec ça tu pourras savoir à quelle colonne il y a une données.

Autre avantage pour la suite, il te suffit de parcourir ce tableau à l’envers pour connaître la dernière cellule non vide.

Trouver la dernière cellule non vide

Globalement il y a deux manières de faire :

  • on parcourt le tableau de gauche à droite, on retient la dernière fois qu’on a vu une cellule non vide. Une fois la parcours terminé on a gagné.
  • On parcourt le tableau de droite à gauche et on s’arrête à la première cellule non vide

Voilà

Bonjour Artragis,

Je te remercie pour ta réponse et du temps que tu as consacré à mon problème.

Je t’avoue ne pas avoir un niveau suffisant pour coder cela malgré tes explications.

Il me manque en effet quelques billes.

J’ai donc parcouru ton tutoriel pour prendre un peu de niveau.

D’ailleurs, je trouve celui-ci très bien réalisé et te félicite pour ton travail et ton altruisme.

Bien à toi.

Ok, je vais donc tenter de te donner le code :

Premièrement firstNotEmpty


function firstNotEmpty(spreadsheet, row){
   const dataRange = spreadsheet.getRange(row, 1, 0, spreadSheet.getLastColumn()).getData()[0];
   for(let i=0; i<dataRange.length; i++) {
      if (dataRange[i] && dataRange[i].trim()) {
          return spreadsheet.getRange(row, i, 0, 0).getA1Notation();
      }
   }
   // si on n'a rien trouvé ça retournera undefined, il faut donc changer un peu le code principal
   // on y reviendra
}

Et maintenant, la même mais à l’envers pour trouver la dernière cellule

function lastNotEmpty(spreadsheet, row) {
const dataRange = spreadsheet.getRange(row, 1, 0, spreadSheet.getLastColumn()).getData()[0];
   for(let i=dataRange.length -1; i>=0; i--) {
      if (dataRange[i] && dataRange[i].trim()) {
          return spreadsheet.getRange(row, i, 0, 0).getA1Notation();
      }
   }
}

Et la légère modification du code principale pour éviter les soucis

function codePrincipal(){
// code principal
const app = SpreadsheetApp.getActive();
const spreadsheet = app.getActiveSpreadsheet();
const row = app.getActiveRange().getRow();
const first = firstNotEmpty(spreadsheet, row);
if (!first) {
   // si la ligne était vide, un message a été affiché, on s'arrête là
   return;
}
applyStyle(spreadsheet, first, lastNotEmpty(spreadsheet, row))
}



Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte