MENU DEROULANT a partir d'un script

Bonjour,

Je cherche à créer un menu déroulant avec un script à partir de données dans des cellules

J'utilise le code suivant:

tableOfLRU= lruconf.getRange(8,47,11,47).getValues()

sheet.getRange(rowOfUpdate,colToUpdateEDB).setValue("")

sheet.getRange(rowOfUpdate,colToUpdateEDB).setDataValidation(SpreadsheetApp.newDataValidation()

.setAllowInvalid(false)

.requireValueInList(tableOfLRU, true) 

.build())<br>

Quand le script s'execute, le menu déroulant s'est bien créé mais il ajoute des virgules à la fin de chaque mot

image

Est-ce que vous seriez me dire ce que j'écris de mal?

Je vous remercie pour votre support.

Cordialement,

Sébastien

Bonjour, essai ça.

"Il semble que le problème vienne de la manière dont les valeurs sont récupérées et utilisées pour la validation des données. Les virgules peuvent apparaître si les valeurs sont traitées comme des tableaux de chaînes de caractères plutôt que des chaînes individuelles.

Pour résoudre ce problème, vous pouvez essayer de transformer les valeurs récupérées en une liste plate de chaînes de caractères. Voici une version modifiée de votre code :"

// Récupérer les valeurs de la plage
var tableOfLRU = lruconf.getRange(8, 47, 11, 47).getValues();

// Transformer les valeurs en une liste plate
var flatList = tableOfLRU.flat().filter(String);

// Appliquer la validation des données
sheet.getRange(rowOfUpdate, colToUpdateEDB).setValue("");
sheet.getRange(rowOfUpdate, colToUpdateEDB).setDataValidation(
  SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false)
    .requireValueInList(flatList, true)
    .build()
);

"Cette modification utilise la méthode flat() pour aplatir le tableau en une seule liste et filter(String) pour supprimer les valeurs vides. Cela devrait éliminer les virgules supplémentaires dans ton menu déroulant."

Bonjour,

Merci pour votre retour. Dans la version que j'utilise, la class "Flat" n'est pas reconnu, i.e. que mon éditeur ne me propose pas cette classe après le point de la variable tableOfLRU

Dois-je installer quelque chose en plus?

// Transformer les valeurs en une liste plate
var flatList = tableOfLRU.flat().filter(String);

"Cela peut arriver si vous utilisez une version de JavaScript antérieure à ES2019, où cette méthode a été introduite

Pour contourner ce problème, vous pouvez utiliser une fonction personnalisée pour aplatir le tableau. Voici comment vous pouvez le faire :"

// Fonction pour aplatir un tableau
function flattenArray(arr) {
  return arr.reduce((flat, toFlatten) => {
    return flat.concat(Array.isArray(toFlatten) ? flattenArray(toFlatten) : toFlatten);
  }, []);
}

// Récupérer les valeurs de la plage
var tableOfLRU = lruconf.getRange(8, 47, 11, 47).getValues();

// Transformer les valeurs en une liste plate
var flatList = flattenArray(tableOfLRU).filter(String);

// Appliquer la validation des données
sheet.getRange(rowOfUpdate, colToUpdateEDB).setValue("");
sheet.getRange(rowOfUpdate, colToUpdateEDB).setDataValidation(
  SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false)
    .requireValueInList(flatList, true)
    .build()
);

"Cette fonction flattenArray utilise reduce et concat pour aplatir récursivement le tableau. Cela devrait fonctionner dans toutes les versions de JavaScript."

Salut,

.flat() est utilisable dans GAS

var tableOfLRU = lruconf.getRange(8, 47, 11, 47).getValues().flat();

Merci à vous 2!

@Alexander: votre macro fonctionne très bien :)

@Pierre: comment installe-t-on GAS?

"GAS" est une abréviation de Google Appli Script

Rechercher des sujets similaires à "menu deroulant partir script"