2016-04-18 3 views
1

J'ai regardé autour de stackoverflow pour quelques conseils concernant les listes déroulantes dyanmic. Cependant, la plupart semblent être basées sur la création d'un en-tête de catégorie, puis les valeurs de chaque en-tête en dessous. J'ai une configuration différente qui rend difficile pour moi d'ajuster cette méthode à mon problème parce que je veux filtrer puis 2ème colonne en fonction du premier choix de la liste déroulante. J'ai trois colonnes de données (j'ai seulement besoin de deux pour ce numéro) Ville, nom, courrielliste déroulante filtrée basée sur le 1er choix (googlesheets)

J'ai une liste de délégués, dont beaucoup proviennent des mêmes villes. Exemple:

Boston   John Smith 
Atlanta   Chris Jones 
New York City Alan Chan 
Boston   Phillip Cho 
Boston   Sarah Fieler 
Atlanta   Eric Parks 

J'essaie de faire deux liste déroulante dans les feuilles google. La première liste déroulante est facile car je vais juste sélectionner la colonne entière. Cependant, je veux avoir la 2ème colonne pour filtrer les valeurs basées sur la première colonne donc si c'est Boston, cela montrera seulement John Smith, Phillip Cho et Sarah Fieler.

Est-ce possible? Toute orientation serait appréciée.

EDIT Je voulais ajouter une mise à jour à la réponse de Serge. Je voulais prendre un peu plus loin et ne voulais pas rafraîchir la validation de toute la colonne des règles chaque fois que je choisi une ville si j'ai modifié le script en ajoutant

var r = tSheet.getActiveCell(); 
    var nextCell = r.offset(0, 1); 
    var rule =SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInList(names).build(); 
    nextCell.setDataValidation(rule); 

Maintenant, chaque fois que je modifie la colonne de ville, affectera seulement la cellule à côté de lui. J'espère que quelqu'un d'autre trouve une utilité pour cela. Merci Serge

+0

Je suppose que vous voulez également supprimer les doublons dans la première liste déroulante ne vous? Et aussi, avez-vous besoin que la validation soit disponible dans une seule cellule ou dans toutes les colonnes? –

+0

Les listes de données et de listes déroulantes se trouvent-elles dans la même feuille? –

+0

Vous recherchez la validation des données pour toute la colonne. Donc, si je sélectionne la ville dans la première colonne, elle sera filtrée pour la 2ème colonne, mais cela fait partie d'un planning donc il y aura environ 20 lignes. En outre, j'ai une feuille de contact et une feuille de calendrier. La feuille de calendrier est donc validée par rapport à la feuille de contact. – User125

Répondre

2

Voici une configuration complète pour obtenir ce comportement dans votre feuille. J'ai dû prendre quelques décisions d'installation que vous devrez probablement adapter à vos besoins tels que les colonnes et les noms de feuilles.

La fonction TriggerSetup doit exécuter une seule fois pour configurer le déclencheur onEdit

getCities() devrait fonctionner sur ouvert ou lorsque vous décidez besoin de la première validation à être mis à jour.

J'ai ajouté un petit utilitaire pour supprimer les doublons dans les tableaux, j'en avais besoin pour créer les listes de validation sans doublons.

function setupTrigger(){ 
    ScriptApp.newTrigger('onEditGetNames') 
    .forSpreadsheet(SpreadsheetApp.getActive()) 
    .onEdit() 
    .create(); 
} 

function onEditGetNames(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var tSheet = ss.getActiveSheet(); 
    var col = ss.getActiveRange().getColumn(); 
    if(tSheet.getName()!='schedule' || col!=1){ // assuming city validation is in column A 
    Logger.log('wrong sheet or wrong column'); 
    return; 
    } 
    var cityMatch = tSheet.getActiveCell().getValue(); 
    var data = ss.getSheetByName('contacts').getRange('A2:B').getValues();//assuming names are in column B 
    var names = []; 
    for(var n in data){ 
    if(data[n][0] == cityMatch && data[n][1] != ''){ 
     names.push(data[n][1]); 
    } 
    } 
    names.sort(); 
    var tSheet = SpreadsheetApp.getActive().getSheetByName('schedule'); 
    var targetRange = tSheet.getRange('B2:B'); 
    targetRange.clearDataValidations(); 
    var rule = SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInList(names).build(); 
    targetRange.setDataValidation(rule); 
} 

function getCities(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var data = ss.getSheetByName('contacts').getRange('A2:A').getValues();//assuming cities are in column A 
    var city = []; 
    for(var n in data){ 
    if(data[n][0] !=''){ 
     city.push(data[n][0]); 
    } 
    } 
    city.sort(); 
    var tSheet = SpreadsheetApp.getActive().getSheetByName('schedule'); 
    var targetRange = tSheet.getRange('A2:A'); 
    targetRange.clearDataValidations(); 
    var rule = SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInList(city).build(); 
    targetRange.setDataValidation(rule); 
} 

function removeDups(array){ 
    var data = array.slice(); 
    var outArray = []; 
    data.sort(
    function(x,y){ 
     var xp = x.toLowerCase(); 
     var yp = y.toLowerCase(); 
    return xp > yp ? 1 : xp < yp ? -1 : 0; 
    }); 
    outArray.push(data[0]); 
    for(var n=0;n<data.length-1;n++){ 
    if(data[n+1]!=data[n]){outArray.push(data[n+1])} 
    } 
    return outArray; 
} 

capture d'écran:

enter image description here enter image description here

+0

Cela a très bien fonctionné et était très instructif. Il semble y avoir un attrape cependant.Chaque fois qu'une ville est sélectionnée dans la première colonne, elle modifie le contenu de la validation pour la deuxième colonne, ce qui invalide tous les enregistrements précédents. Donc par exemple. Dans la capture d'écran, si je retournais à Atlanta, et je voulais choisir Eric Parks, je ne verrais que les gens de Boston. Y a-t-il un moyen de contourner ceci? Merci beaucoup pour votre aide. – User125

+0

C'est normal puisque vous vouliez avoir une nouvelle règle de validation basée sur la ville. Je ne vois aucun moyen de l'éviter ... de toute façon, cela provoque juste un avertissement visuel, rien d'autre. –

+0

Pour modifier une entrée précédente, vous devez d'abord supprimer la ville, puis la resélectionner pour obtenir la bonne validation des noms. –