Macro VBA pour Sheet (DRIVE EN LIGNE)

OKAY

  1. C'est donc le nom de l'affaire qui est l'identifiant ? et pas le n° de l'affaire ?
  2. les onglets dupliqués servent seulement à la lecture ou bien reçoivent-ils des mises à jour jusqu'au solde où ils sont effacés ?

pour le moment je n'ai fait que la navigation entre onglets principaux

function retour() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  doc.setActiveSheet(doc.getSheets()[0]);
};

function nouvelleAffaire() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  doc.setActiveSheet(doc.getSheets()[1]);
};

function listeAffaires() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  doc.setActiveSheet(doc.getSheets()[2]);
};

je vais attaquer l'enregistrement

Oups désoler, quand on crée une affaire, le nom de l'onglet dupliquer vient "Affaire - (N° d'affaire).

Les onglets d'affaires reçoivent des mises à jour selon l'avancer du chantier jusqu'à la finalisation qui efface l'onglet de l'affaire.

Je peux rentré ce script dans mon fichier et ça le faire automatiquement où il y a des modifications autres à faire ?

@Steelson,

Petite précision en lisant Floow80, attention qu'il n'y a pas d'espaces entre "Affaire" et le trait et le numéro d'affaire --> AFFAIRE-XX

En effet, autant pour moi

J'ai terminé le moteur principal ... sur ma copie

Mais il y a encore toute la navigation à partir de la liste des affaires et peut-être du contrôle car c'est ici sans filtre !

function enregistrerNouvelleAffaire() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f1 = SpreadsheetApp.getActive();
  var nouveau = 'Affaire' + '-' + f1.getRange('E10').getValue().toString();
  var f3 = doc.getSheetByName(nouveau);
  if (!f3){
    var f2 = doc.getSheetByName('Liste des affaires');
    var i = f2.getLastRow() +1;
    f2.getRange('B' + i).setValue(f1.getRange('E7').getValue());
    f2.getRange('C' + i).setValue(f1.getRange('H7').getValue());
    f2.getRange('D' + i).setValue(f1.getRange('E10').getValue());
    f2.getRange('E' + i).setValue(f1.getRange('H10').getValue());
    f2.getRange('F' + i).setValue(f1.getRange('E13').getValue());
    f2.getRange('G' + i).setValue(f1.getRange('H13').getValue());
    f2.getRange('H' + i).setValue(f1.getRange('E16').getValue());
    var fa = doc.getSheetByName('Affaire');
    fa.showSheet();
    newf = fa.copyTo(doc).setName(nouveau);
    fa.hideSheet();
    newf.getRange('F2').setValue(f1.getRange('H7').getValue());
    var adresses = ["E7","H7","E10","H10","E13","H13","E16"];
    f1.getRangeList(adresses).clearContent();
    doc.setActiveSheet(doc.getSheetByName(nouveau));
  } else {
    Browser.msgBox('Cette affaire existe déjà !');
  }
};

https://docs.google.com/spreadsheets/d/1BOQOVMkZe7-j1cn7Ium7HfFyI86XdVuliCmmmFyMA-4/edit?usp=sharing

je vais mettre en pause pour retourner à une affaire de json !

Merci beaucoup pour ton retour ça fait super plaisir !

J'ai fais une demande d'autorisation pour accéder au fichier.

Merci d'avance c'est top!

Tu devrais pouvoir faire une copie, de toute façon à terme tu récupères. Et comme j'ai dit j'ai un gros problème de clavier donc je ne voudrais pas tout effacer tant que ce clavier m fait des vacheries.

J'ai compris maintenant comment naviguer, ce ne sera pas par un double clic qui ne semble pas possible mais une simple sélection par exemple du n° d'affaire. Donc je finalise la mécanique cette nuit ou demain, après il faudra sans doute fignoler.

Le but ultime c'est que tu puisses t'approprier le code et les façons de faire dans google sheets (importer un script, créer un trigger) afin d'être autonome ou presque.

D'accord oui comme ça je pourrais voir la façon de travailler avec Google Sheet et surtout le principe du codage du script.

Par contre je n'arrive pas à accéder à ton fichier, il me demande une autorisation, j'en ai envoyé une mais l'accès est refusé pour le moment ?

C'est ok, j'ai tout ouvert à tout le monde sans restriction !

J'ai fais une demande d'autorisation pour accéder au fichier.

Merci d'avance c'est top!

Je ne comprends pas que je ne les reçois pas ! idem avec un autre compte que j'utilise parfois.

Par contre, je peux indiquer un email précis.

Bizarre même que ça soit ouvert il me donne un accès refusé.

Au pire, si c'est possible d'ajouter mon compte : florianhouartfoad@gmail.com

Mets moi les droits en modifications si possible, pour que je puisse copier le tableau.

Merci d'avance pour ton aide Steelson

reste à faire ...

- Nous pouvons géré avec les cases "En cours" et "A faire" afin que le changement de statut s'effectue dans l'onglet "Liste des affaires" pour pouvoir voir les affaires qui sont déjà lancé ou non (avec un passage de la ligne complète en ORANGE pour "En cours" et ROUGE pour "A faire").

- Nous validons les étapes selon l'avancer de l'affaire, une fois qu'elles sont toutes validé, nous avons la possibilité de "Finaliser l'affaire".

- Quand nous la finalisons, l'onglet "Affaire - (Nom de l'affaire)" se supprime automatiquement pour que le fichier reste léger.

- La ligne de l'affaire passe donc en VERT dans l'onglet "Liste des affaires" et son statut en colonne 7 devient donc "Finaliser".

/** @OnlyCurrentDoc */

function retour() {
  basculerVers(0);
};

function nouvelleAffaire() {
  basculerVers(1);
};

function listeAffaires() {
  basculerVers(2);
};

function enregistrerNouvelleAffaire() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f1 = SpreadsheetApp.getActive();
  var nouveau = 'Affaire' + '-' + f1.getRange('E10').getValue().toString();
  var f3 = doc.getSheetByName(nouveau);
  if (!f3){
    f1.setActiveSelection('H16');
    var n = f1.getRange('H16').getValue() ;
    if (n == 7) {
      var f2 = doc.getSheetByName('Liste des affaires');
      var i = f2.getLastRow() +1;
      f2.getRange('B' + i).setValue(f1.getRange('E7').getValue());
      f2.getRange('C' + i).setValue(f1.getRange('H7').getValue());
      f2.getRange('D' + i).setValue(f1.getRange('E10').getValue());
      f2.getRange('E' + i).setValue(f1.getRange('H10').getValue());
      f2.getRange('F' + i).setValue(f1.getRange('E13').getValue());
      f2.getRange('G' + i).setValue(f1.getRange('H13').getValue());
      f2.getRange('H' + i).setValue(f1.getRange('E16').getValue());
      var fa = doc.getSheetByName('Affaire');
      fa.showSheet();
      newf = fa.copyTo(doc).setName(nouveau);
      fa.hideSheet();
      newf.getRange('F2').setValue(f1.getRange('H7').getValue());
      var adresses = ["E7","H7","E10","H10","E13","H13","E16"];
      f1.getRangeList(adresses).clearContent();
      basculerVers(doc.getSheetByName(nouveau).getIndex() - 1);
    } else {
      Browser.msgBox('Merci de rensseigner tous les champs !');
    }
  } else {
    Browser.msgBox('Cette affaire existe déjà !');
  }
};

function voirAffaire(){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f = doc.getActiveSheet();
  var r = f.getActiveRange();
  var numAffaire = 'Affaire' + '-' + r.getValue().toString();
  var fa = doc.getSheetByName(numAffaire);
  if (fa){
    basculerVers(fa.getIndex() - 1);
  }
};

function basculerVers(n){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f1 = doc.getSheets()[n];
  var f2 = doc.getActiveSheet();
  f1.showSheet();
  doc.setActiveSheet(f1);
  f2.hideSheet();
};

et automatiser passage d'une cellule à l'autre

J'ai accès à la copie, merci.

Merci beaucoup aussi pour ton avancer, c'est très gentil....

Teste le, liste les points qui te préoccupent, je vais faire une pause aujourd'hui sur ce sujet.

Bonjour,

As-tu des nouvelles à propos du projet ? Car sur le drive les changements d'état, les couleurs ne fonctionne pas.

Merci d'avance

pas encore fait, j'avais autres sujets à solder, dont un qui me servira ici aussi

as-tu déjà des remarques à ce stade ?

Le sujet à traiter pour choisir en-cours, à-faire, finalisé c'est qu'il n'y a pas de bouton radio, mais on peut contourner la difficulté

Un truc sympa que j'ai pu bricoler selon une idée trouvée sur la toile pour transformer les check box en boutons radio

Admettons qu'il y ait 3 checkboxes colonne 1 (c) lignes 1 (de) à 3 (a)

function onEdit(e) {
  // parametres
  var de = 1;
  var a = 3;
  var c = 1;
  // script
  var r = e.range;
  var f = SpreadsheetApp.getActiveSheet();
  var val = r.getValue();
  var row = r.getRow();
  var col = r.getColumn();
  if (col == c || row >= de || row <= a) {
    if (val) {
      for (var i = de; i <= a; i++){
        if (i != row){
          f.getRange(i,1).setValue('FALSE'); 
        }
      }
    }
  }
}

Attention : il y a des changements dans la feuille Affaire ... ajout du n° et des checkboxes

J'ai terminé le moteur.

Je te laisse faire la carrosserie ? notamment la MFC selon le statut ?

/** @OnlyCurrentDoc */

function retour() {
  basculerVers(0,'A1');
};

function nouvelleAffaire() {
  basculerVers(1,'E7');
};

function listeAffaires() {
  basculerVers(2,'A1');
};

function enregistrerNouvelleAffaire() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f1 = SpreadsheetApp.getActive();
  var nouveau = 'Affaire-' + f1.getRange('E10').getValue().toString();
  var f3 = doc.getSheetByName(nouveau);
  if (!f3){
    f1.setActiveSelection('F16');
    var n = f1.getRange('H16').getValue() ;
    if (n == 7) {
      var f2 = doc.getSheetByName('Liste des affaires');
      var derL = f2.getLastRow() +1;
      var adresses = ["E7","H7","E10","H10","E13","H13","E16"];
      var destination = ["B","C","D","E","F","G","H"];
      var titre = f1.getRange('H7').getValue();
      var num = f1.getRange('E10').getValue();
      for (var i = 0; i < adresses.length; i++){
        f2.getRange(destination[i] + derL).setValue(f1.getRange(adresses[i]).getValue());
        f1.getRange(adresses[i]).clearContent();
      }
      var fa = doc.getSheetByName('Affaire');
      newf = fa.copyTo(doc).setName(nouveau);
      newf.getRange('F2').setValue(titre);
      newf.getRange('B5').setValue(num);
      basculerVers(doc.getSheetByName(nouveau).getIndex() - 1,'E6');
    } else {
      Browser.msgBox('Merci de rensseigner tous les champs !');
      f1.setActiveSelection('E7');
    }
  } else {
    Browser.msgBox('Cette affaire existe déjà !');
  }
};

function voirAffaire(){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f = doc.getActiveSheet();
  var r = f.getActiveRange();
  var numAffaire = 'Affaire-' + r.getValue().toString();
  var fa = doc.getSheetByName(numAffaire);
  if (fa){
    basculerVers(fa.getIndex() - 1,'E6');
  }
};

function basculerVers(n,r){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f1 = doc.getSheets()[n];
  var f2 = doc.getActiveSheet();
  f1.showSheet();
  doc.setActiveSheet(f1);
  f1.setActiveSelection(r);
  f2.hideSheet();
}

function onEdit(event){ 
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  if (f.getName() == 'Ajouter une nouvelle affaire'){
    if (r.getValue() != ''){
      var adresses = ["E7","H7","E10","H10","E13","H13","E16"];
      var valeurs = adresses.join().split(",");
      var item = valeurs.indexOf(r.getA1Notation());
      if (item < adresses.length - 1){ // sauf le dernier
        f.setActiveSelection(adresses[item + 1]);
      }
    }
  } else if (f.getName().substring(0,8) == 'Affaire-'){
    var val = r.getValue();
    var row = r.getRow();
    var col = r.getColumn();
    if (col == 1 || row >= 6 || row <= 8) {
      var fa = doc.getSheetByName('Liste des affaires');
      var values = fa.getRange('D7:D').getValues().join().split(","); 
      var ligne = values.indexOf(f.getRange('B5').getValue().toString());
      if (ligne != -1) {
        if (val) {
          fa.getRange('I' + (ligne+7)).setValue(f.getRange('B' + row).getValue());
          for (var i = 6; i <= 7; i++){
            if (i != row){
              f.getRange(i,1).setValue('FALSE'); 
            }
          }
        } else {
          fa.getRange('I' + (ligne+7)).setValue('');
        }
      }
    }
  }
}

function finaliser(){ 
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f = doc.getActiveSheet();
  if (f.getName().substring(0,8) == 'Affaire-'){
    var fa = doc.getSheetByName('Liste des affaires');
    var values = fa.getRange('D7:D').getValues().join().split(","); 
    var ligne = values.indexOf(f.getRange('B5').getValue().toString());
    if (ligne != -1) {
      fa.getRange('I' + (ligne+7)).setValue('Finalisée');
      basculerVers(2,'A1');
      doc.deleteSheet(f);
    }
  }
}
Rechercher des sujets similaires à "macro vba sheet drive ligne"