0
votes

Comment créer de la macro pour masquer / afficher automatiquement les feuilles en fonction d'une condition?

Je suis totalement perdu ici!

Ma feuille de calcul a une feuille "Enregistrement principal du produit" avec une table contenant trois colonnes: ID de produit (numérique) | Description du produit | État du produit.

Chaque produit a sa propre feuille dans la feuille de calcul. Le nom de chaque feuille dépend de l'état du produit:

- produit "actif": nom de feuille = nom du produit -> la feuille est visible

- Produit "inactif": Nom de la feuille = ID de produit -> La feuille est cachée

Donc, j'essaie d'écrire une macro qui masquez / montre des feuilles en fonction de la condition:

  1. Statut du produit (actif / inactif)
  2. Nom de la feuille (si le nom contient du texte ou non)

    Je n'ai pas besoin d'écrire les deux conditions; seulement le plus facile à coder.

    Des idées ?? Merci!


3 commentaires

Bienvenue sur Stackoverflow. Souhaitez-vous résumer la recherche que vous avez déjà fait - nous ne voudrions pas doubler.


Voulez-vous dire que vous souhaitez distribuer chaque donnée dans l'enregistrement maître de produit à chaque feuille en fonction de l'ID de produit et la visibilité dépend de l'état du produit? S'il vous plaît un script simple comme votre atterrissage, afin que nous puissions comprendre votre flux


Mais pour une idée, vous prenez des enregistrements avec ID et statut, vous cochez l'identifiant, car il ne s'agit pas de texte vide, vous créez une nouvelle feuille simplement si la même feuille n'existe pas, renommez-la avec ID, puis vérifiez l'état, si inactif. il caché et répétez-le jusqu'à la dernière fiche


3 Réponses :


0
votes

Ici ici l'échantillon de votre but, PRODMASTER, la rangée 1 en-tête [PRODID, DESC, STATUS] et les lignes ultérieures sont des données et l'état sera inactif et actif:

function HideSheets() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName('ProdMaster');
  var lrow = sheet.getLastRow();
  var myValue = sheet.getRange("A2:C" + lrow).getValues();

  for (a=1; a<myValue.length+1; a++)
  {
    var target = myValue[a-1];
    var tsheet = spreadsheet.getSheetByName(target[0]);
    if(tsheet==null) spreadsheet.insertSheet(target[0]);
    if(target[2]=='Active') tsheet.showSheet();
    if(target[2]=='Inactive') tsheet.hideSheet();
  }
};


0 commentaires

0
votes

comme moyen de résoudre votre problème, vous pouvez effectuer ce qui suit, au lieu d'utiliser "actif" ou "inactif" en tant que vérificateurs de validation d'une condition booléenne, dans votre "record principal de produit", vous pouvez définir l'état à l'aide des fonctions true et false , de cette façon, vous pouvez découpler du texte codé sur le texte de votre code et éviter les problèmes de quelqu'un qui a mal orthographié les mots" actifs ". ou "inactif".

function HideSheets() {
  
  // Get the active sheet and range of rows you want 
  var spreadSheet = SpreadsheetApp.getActive();
  var mainSheet = spreadSheet.getSheetByName('Product Master Record');
  var rows = mainSheet.getRange("A2:C" + mainSheet.getLastRow()).getValues();
  
  // Iterate over all rows 
  for(row in rows){
    // Get the sheets from their names and check if not null
    var secondarySheet = spreadSheet.getSheetByName(rows[row][0]);
    if(secondarySheet){
       if(rows[row][2]) secondarySheet.showSheet(); // show the sheet if value is true
       if(!rows[row][2]) secondarySheet.hideSheet(); // hide sheet if value is false
    }
  }
  
};


0 commentaires

0
votes

merci à tous!

Enfin j'ai trouvé de l'aide avec un collègue et ça marche. Ceci est le code au cas où quelqu'un trouve utile: xxx


0 commentaires