Formulaire latéral

Hello

Je me suis basé sur la présentation de sébastien sur les formulaires https://www.sheets-pratique.com/fr/codes/sidebar pour l'adapter à un fichier sur lequel il est tout à fait adapté.

Mais je bloque sur 2 points:

- la donnée va être saisie sur la prochaine ligne où il n'y a aucune donnée

Or j'ai des colonnes à droite (que je masque ensuite) sur lesquelles j'ai entré des formules pour que ma bdd créée soit exploitable

Si je laisse les formules, et que j'utilise le formulaire, il n'inscrira la donnée qu'à la ligne où il n'y a plus aucune donnée sur mes colonnes F à H (onglet bdd). Je ne suis pas du tout calé en langage HTML pour lui dire de se soustraire de ces colonnes et de copier à la suite tant que les colonnes A à E sont bien vierges.

- avant d'utiliser le formulaire je me basais sur des validations de données. Sébastien a bien montré qu'on pouvait en insérer dans le formulaire mais de la même façon je ne connais pas le code html qui le permet.

Dans mon exemple je souhaite que mon formulaire "nom" et "don à" aille chercher la plage nommée "nom" et que "type" aille chercher la plage nommée "type"

Pour info mon appel de formulaire s'intitule "ajout BDD" dans le menu

Je vous donnerai accès au fichier sur demande

https://docs.google.com/spreadsheets/d/1PcCbnAm4k7xzu3w-IcwDgOaayFD9ex35hgVyxvO3Gts/edit#gid=1711264...

Re- ...

Si je laisse les formules, et que j'utilise le formulaire, il n'inscrira la donnée qu'à la ligne où il n'y a plus aucune donnée sur mes colonnes F à H (onglet bdd). Je ne suis pas du tout calé en langage HTML pour lui dire de se soustraire de ces colonnes et de copier à la suite tant que les colonnes A à E sont bien vierges.

comment sont données ces formules ? avec arrayformula ? quoique je pense que cela n'a pas d'importance, il y a d'autres moyens que getLastRow() pour trouver la dernière ligne, par exemple, sur la colonne A

function getLastDataRow(sheet) {
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange("A" + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

ou bien encore, à condition que les données soient "brèves" car je les joins dans une chaîne de caractères :

function premLigneVide(f) {
  var col = 'A';
  var valeurs = f.getRange(col + ':' + col).getValues().join().split(","); 
  var vide = valeurs.indexOf("") + 1; // indexOf commence à 0 et les lignes à 1
  return vide;
}

Avant d'utiliser le formulaire je me basais sur des validations de données. Sébastien a bien montré qu'on pouvait en insérer dans le formulaire mais de la même façon je ne connais pas le code html qui le permet.

une solution plus simple est de dédier un onglet à la saisie, dans ce cas, les listes déroulantes, c'est facile

https://docs.google.com/spreadsheets/d/1tU3koMXsQjKwPj2uXNvcTgaPAUHDQ4hRIb9CfptWL0c/edit?usp=sharing

J'ai commencé à "standardiser" le script, il "suffit" de quelques réglages

function onEdit(event) {
  var f = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  if (f.getName() == 'Saisie'){
    var adresses = ["C3","C5","F5","C7","F7","C9","F9","C11","F11","E13"];
    var valeurs = adresses.join().split(",");
    var item = valeurs.indexOf(r.getA1Notation());
    if (item < adresses.length - 1){ // sauf le dernier
      f.setActiveSelection(adresses[item + 1]);
    }
  }
}

function saisir(){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f1 = SpreadsheetApp.getActive();
  var n = f1.getRange('F13').getValue();
  var origine = ["C3","C5","F5","C7","F7","C9","F9","C11","F11","C13"];
  if (n == 7) {
    var destination = ["A","B","C","D","E","F","H","I","J","G"];
    var f2 = doc.getSheetByName('BdD');
    var derL = f2.getLastRow() + 1;
    f1.getRange('C13').setValue(f2.getRange('G' + (derL - 1)).getValue() + 1);
    for (var i = 0; i < origine.length; i++){
      f2.getRange(destination[i] + derL).setValue(f1.getRange(origine[i]).getValue());
    }
    f1.getRangeList(origine).clearContent();
    //f1.setActiveSelection(origine[0]);
  } else {
    Browser.msgBox('Merci de renseigner tous les champs !');
    f1.setActiveSelection(origine[0]);
  }
}

mais on peut poursuivre avec un formulaire en barre latérale, là il faudra, avec un peu de travail ...

  • écrire le formulaire en html
  • transférer les listes possibles à partir de la feuille
  • puis transférer les donnés introduites vers la feuille

Le formulaire en html est déjà écrit.

Mais en effet un onglet spécial saisie pourrait tout à fait convenir.

je t'ai fait une demande d'écriture sur ton fichier afin de mieux comprendre comment il fonctionne pour pouvoir l'adapter ;)

Bonjour,

@Mike il faut garder en tête que le bouton envoie les données dans un autre onglet mais si l'onglet en question est protégé le script ne fonctionnera pas car GS ne fait pas la différence entre une manipulation humaine ou automatique (par un script) depuis j'ai interrogé d'autre personne mais il n'y a pas de solution. J'ai interrogé Google Doc et la seul réponse :

• Google ne fournit pas de support pour les comptes gratuits donc, je pense que vous n'aurez jamais de réponse aux demandes formulées via "aide".

Et en effet j'ai écrit à Google lorsque tu m'as fait ce magnifique script mais toujours pas de réponse à ce jour.

Si j'intervient sur ce sujet c'est que la barre de Sébastien envoie bien les données et même si l'onglet est protégé du coup ce serait intéressant d'avoir un menu déroulant sur cette barre.

CDLT

Alex

Bonjour Alex,

je vais regarder le lien donné par evolm. J'espère qu'il n'y a pas de protection !

@Mike il faut garder en tête que le bouton envoie les données dans un autre onglet mais si l'onglet en question est protégé le script ne fonctionnera pas

je n'ai toujours pas réussi à comprendre totalement la façon dont GS protégeait, mais chez eux tout est super logique !

@evolm

J'ai juste retouché ce que tu avais préparé pour le formulaire dans la feuille dédiée saisie ...

si tu double-cliques sur la date, tu as un calendrier

function onEdit(event) {
  var f = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  if (f.getName() == 'saisie'){
    var adresses = ["C3","C5","C7","C9","C11"];
    var valeurs = adresses.join().split(",");
    var item = valeurs.indexOf(r.getA1Notation());
    if (item < adresses.length - 1){ // sauf le dernier
      f.setActiveSelection(adresses[item + 1]);
    }
  }
}

function saisir(){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var f1 = SpreadsheetApp.getActive();
  var n = f1.getRange('E11').getValue();
  var origine = ["C3","C5","C7","C9","C11"];
  if (n == 5) {
    var destination = ["A","B","C","D","E"];
    var f2 = doc.getSheetByName('BDD');
    var derL = getLastDataRow(f2) + 1;
    f1.getRange('C13').setValue(f2.getRange('G' + (derL - 1)).getValue() + 1);
    for (var i = 0; i < origine.length; i++){
      f2.getRange(destination[i] + derL).setValue(f1.getRange(origine[i]).getValue());
    }
    f1.getRangeList(origine).clearContent();
    var d = Utilities.formatDate(new Date(), "GMT+1", "yyyy-MM-dd")
    f1.getRange(origine[0]).setValue(d);
    //f1.setActiveSelection(origine[0]);
  } else {
    Browser.msgBox('Merci de renseigner tous les champs !');
    f1.setActiveSelection(origine[0]);
  }
}

function getLastDataRow(f) {
  var lastRow = f.getLastRow();
  var range = f.getRange("A" + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

je n'oublie pas d'intégrer la liste déroulante dans l'autre solution de formulaire, c qui te donnera le choix, mais cela va me demander un peu de temps

j'ai commencé à revoir le formulaire ... tu choisiras

je termine ce midi

Merci mais ne perds pas de temps à faire les 2 options. Celle de la saisie dans un onglet ma va parfaitement. D'autant que je pourrais regarder en détail le script et l'adapter sur d'autres fichiers qui nécessitent des saisies de bdd simples

Le formulaire c'était histoire de tester ce nouvel outil

ok, j'ai donc supprimé la partie que j'avais commencé à ajouter ... je travaillerai sur un autre fichier (a minima pour moi, la liste déroulant marchait, enfin une car la seconde répétait la première)

je pense aussi que dans ce cas, le formulaire "latéral" amenait une complexité importante du code ! pas impossible, mais plus de lignes et plus de compétences (css, html)

je te laisse supprimer form.html et code.gs pour ne conserver que saisie.gs

Ca marche nickel.

Je vais bien sécuriser la saisie désormais. Merci

Hello

J'ai un petit problème avec ton script.

Le remplissage de cellule C9 n'est pas obligatoire. (c'est la seule)

Mais si on ne met rien, l'onglet BDD ne se met pas à jour.

Je ne trouve pas dans le script comment supprimer cette obligation de renseigner une donnée dans cette cellule.

J'ai voulu palier à cela en intégrant une cellule vide dans ma liste déroulante mais ca ne fonctionne pas

Pour l'instant je demande à ce qu'ils tapent un espace pour pouvoir tout de même renseigner une cellule vide.

C'est simple,

en E11 il y a une formule qui compte les cellules remplies, retire alors de la formule la cellule facultative

et dans le script, modifie cette ligne

if (n == 5) {

en mettant le nombre de cellules obligatoires

Rechercher des sujets similaires à "formulaire lateral"