IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

APIs Google Discussion :

Select d'un formulaire HTML dans un Sheet [Google Sheets]


Sujet :

APIs Google

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 887
    Par défaut Select d'un formulaire HTML dans un Sheet
    Bonjour.

    Sur un Sheet, j'ai un formulaire HTML d'envoi de mail.

    J'ai un script qui me récupère tous les contacts que j'ai sur Gmail que je voudrais mettre dans un <select> de mon formulaire HTML dans mon code.gs:
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    <!DOCTYPE html><html>
      <head>
        <base target="_top">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
        <script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
        <style>
          form {
            /* Pour le centrer dans la page */
            margin: 0 auto;
            width: 500px;
            /* Pour voir les limites du formulaire */
            padding: 1em;
            border: 1px solid #CCC;
            border-radius: 1em;
          }
          div + div {
            margin-top: 1em;
          }
          label {
            /* Afin de s'assurer que toutes les étiquettes aient la même dimension et soient alignées correctement */
            display: inline-block;
            width: 90px;
          } 
          input, textarea {
            /* Afin de s'assurer que tous les champs textuels utilisent la même police
               Par défaut, textarea utilise une police à espacement constant */
            font: 1em sans-serif;
            /* Pour donner la même dimension à tous les champs textuels */
            width: 300px;
            -moz-box-sizing: border-box;
                 box-sizing: border-box;
     
     
            /* Pour harmoniser l'apparence des bordures des champs textuels */
            border: 1px solid #999;
          }
          input:focus, textarea:focus {
            /* Afin de réhausser les éléments actifs */
            border-color: #000;
          }
          textarea {
            /* Pour aligner correctement les champs multilignes et leurs étiquettes */
            vertical-align: top;
            /* Pour donner assez d'espace pour entrer du texte */
            height: 5em;
            /* Pour permettre aux utilisateurs de redimensionner un champ textuel horizontalement
               Cela ne marche pas avec tous les navigateurs  */
            resize: vertical;
          }
          .button {
            /* Pour positionner les boutons de la même manière que les champs textuels */
            padding-left: 90px; /* même dimension que les étiquettes */
          }
          button {
            /* Cette marge représente approximativement le même espace
               que celui entre les étiquettes et les champs textuels */
            margin-left: .5em;
          }
          #alert_msg{
          text-align: center;
          }
        </style>
      </head>
      <body>
      <div id="alert_msg" class="alert alert-danger hidden" role="alert">
      Veuillez remplir les champs obligatoire.
      </div>
        <form id="form_email">
          <div class="form-group">
            <label for="contact">Contact :</label>
            <select class="form-control" id="contacts">
              <?!= getContactsUser(); ?>
            </select>
          </div>
          <div class="form-group">
            <label for="courriel">Courriel :</label>
            <input class="form-control" type="email" id="courriel" name="user_email" placeholder="Adresse e-mail" required>
          </div>
          <div class="form-group">
            <label for="objet">Objet :</label>
            <input class="form-control" type="text" id="objet" name="objet_email" placeholder="Objet du message" required autocomplete="off">
          </div>
          <div class="form-group">
            <label for="message">Message :</label>
            <textarea class="form-control" id="message" name="message_email" placeholder="Message" rows="6" required autocomplete="off"></textarea>
          </div>
          <div class="button">
            <button id="submit_form" class="btn btn-success" type="button">Envoyer le message</button>
          </div>
        </form>
      </body>
      <script type='text/javascript'>
     
     
    $(function() {
      $('#courriel').val('destinataireParDefaut@exemple.com');
      $('#submit_form').on('click', function(){
        var email = $('#courriel').val();
        var objet = $('#objet').val();
        var form = '<h1>Formulaire test</h1>' + 
        '<form id="test-form">' +
        '<label for="nom">Nom</label><br />' + 
        '<input type="text" name="nom" id="nom"/><br />' + 
        '<label for="prenom">Prénom</label><br />' + 
        '<input type="text" name="prenom" id="prenom"/><br />' + 
        '<label for="sujet">Sujet</label><br />' + 
        '<input type="text" name="sujet" id="sujet"/><br />' + 
        '<label for="message">Message : </label><br />' + 
        '<textarea name="message" id="message"></textarea><br />' + 
        '<button class="btn btn-success" type="submit" id="submit-form" name="envoyer" >Envoyer</button><br />';
        var msg = $('#message').val() + form;
        if(email != '' && objet != '' && msg != ''){
          google.script.run.sendMail(email, objet, msg);
          google.script.host.close();
          Browser.msgBox('Le mail de facturation a bien été envoyé à ' + email + '.')
        }else{
          $("#alert_msg").removeClass("hidden");
          if(email == ''){
            $('#courriel').css('border-color', 'red');
          }else{
            $('#courriel').css('border-color', '#ccc');
          }
          if(objet == ''){
            $('#objet').css('border-color', 'red');
          }else{
            $('#courriel').css('border-color', '#ccc');
          }
          if(msg == ''){
            $('#message').css('border-color', 'red');
          }else{
            $('#courriel').css('border-color', '#ccc');
          }
        }
      });
     
     
      $('#courriel').on('change', function(){
        if($('#courriel').val() != ''){
          $(this).css('border-color', '#ccc');
        }
      });
     
     
      $('#objet').on('change', function(){
        if($('#objet').val() != ''){
          $(this).css('border-color', '#ccc');
        }
      });
     
     
      $('#message').on('change', function(){
        if($('#message').val() != ''){
          $(this).css('border-color', '#ccc');
        }
      });
    });
     
     
      </script>
    </html>

    Le méthode getContactsUser() ligne 74, me remonte bien les infos que je veux (j'ai mon résultat voulu quand je ais un Browser.msg(getContactsUser()) !)mais impossible de les afficher dans mon <select> (voir ligne 74 de mon code HTML).
    Ça fais 3 jours que j'y suis dessus et je n'arrive à rien.

    Help pls

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Par défaut
    Hum,

    mince, apparemment son pc a cramé avant qu'il ne termine sa question :-)

  3. #3
    Membre éclairé Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 887
    Par défaut
    Oui désolé, mes doigts sont en gréves ^^

  4. #4
    Membre chevronné

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Par défaut
    Salut FCL31,

    Deux possibilités : soit "form.html" est complété avant d'être affiché, soit il faut négocier la communication entre le GS (coté serveur) et la page HTML/JS (coté navigateur).

    Dans le premier cas, un simple split sur la balise qui servira de repère devrait permettre d'injecter la liste d'options. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    => coté GS : 
    var pageForm = HtmlService.createHtmlOutputFromFile('form.html').getContent(); // devrait déjà exister, peut-être dans une méthode doGet ?
    function completeForm(pageForm) {
    	var flag = 'id="contacts">';
    	var frag = pageForm.split(flag);
    	var options = getContactsUser();
    	return frag[0] + flag + options + frag[1];
    }
    Dans le second cas (page déjà affichée qui doit aller chercher les données coté serveur), il est nécessaire d'utiliser "google.script.run.withSuccessHandler...". Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    => à placer coté HTML : 
    function useContacts(contacts) {
    	console.log('useContacts : ' + contacts + ' : ' + contacts.length);
    }
    function getContacts() {
    	var test = google.script.run.withSuccessHandler(useContacts).getContactsUser(); // Appel à la méthode GS getContactsUser, le résultat sera traité par "useContacts" coté client
    	console.log('testContact : ' + test); // test ne contient rien à ce niveau !
    }
    En espérant que cela aide...

  5. #5
    Membre éclairé Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 887
    Par défaut
    Merci pour tes réponses.

    Mais sa n'a pas l'air de fonctionner (je vais y travailler un peut p lus dessus).

    J'ai surtout l'impression qu'il ne me reconnais pas Sur le navigateur, c'est directement écrit <?!= methodeDuGS(); comme du simple texte.

    J'ai essayé comme j'ai vu sur plusieurs tuto, de faire une méthode include(file) pour le css et le script mais c'est pareil, c'est afficher comme un simple texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    => coté GS
    function include(file){ return HtmlService.createHtmlOutputFromFile(file).getContent(); 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    => coté HTML
    <?!= include('style'); ?>
    avec un fichier style.html avec tout mon css dans des balise <style>

    J'ai tout fais comme j'ai vu sur des vidéos ou tuto mais rien ne fonctionne



    Edit
    Citation Envoyé par TIFéç Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    => coté GS : 
    var pageForm = HtmlService.createHtmlOutputFromFile('form.html').getContent(); // devrait déjà exister, peut-être dans une méthode doGet ?
    Dans mon doGet(), j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return HtmlService.createHtmlOutputFromFile('form');
    sans le getContent() car sinon, j'ai une erreur :
    Le script est terminé, mais la valeur obtenue n'est pas un type de réponse compatible.

  6. #6
    Membre chevronné

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Par défaut
    Alors,

    j'ai préféré mutualiser ma méthode "doGet" pour mieux isoler le contenu à injecter dans chaque page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function doGet(event) {
      // Génération d'une trame HTML de base qui sera remplacée
      var formHtml = HtmlService.createHtmlOutputFromFile('Accueil_HTML').setSandboxMode(HtmlService.SandboxMode.IFRAME); // A vérifier si le sandboxMode est nécessaire?
     
      // Appel à la méthode de la page pour obtenir le contenu à afficher
      var contentFormHTML = getMaPage();
     
      // Reinjection du flux dans son objet
      formHtml.setContent(contentFormHTML);
     
      // Enfin le flux HTML est retourné à l'utilisateur pour affichage
      return formHtml;
    }
    Ensuite dans "getMaPage" je peux travailler le contenu comme s'il s'agissait d'un très gros string. Par exemple, pour ré-injecter la gestion de style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function getMaPage() {
      // D'abord génération de la trame de la page d'après le code HTML lié et transformation en string
      var pageAccueil = HtmlService.createHtmlOutputFromFile('MaPage_HTML').getContent();
     
      // Injection du style sur la balise <MonStyle>
      pageAccueil = util_injecterStyle(pageAccueil);
     
      return pageAccueil;
    }
     
    function util_injecterStyle(contentFormHTML) {
      // Flag sur '<MonStyle/>' pour injection des éléments de style (CSS)
      var TAG_STYLETOINCLUDE = '<MonStyle/>';
      var NOM_SRC = 'Style';
     
      // Identification des éléments à supprimer à l'aide du flag de debut et de celui de fin, attention il peut y avoir injection d'une balise de remplacement
      var elementsAvantEtApresFlag = contentFormHTML.split(TAG_STYLETOINCLUDE); // En théorie, il ne devrait y avoir qu'un seul...
     
      // Récupération du fichier partagé Style.html sous forme de String pour injection dans la page HTML
      var styleHtml = HtmlService.createHtmlOutputFromFile(NOM_SRC).getContent();
     
      return elementsAvantEtApresFlag[0] + styleHtml + elementsAvantEtApresFlag[1]; 
    }
    Sur cette base, tu devrai pouvoir injecter facilement la liste d'options dans le code HTML avant affichage comme proposé précédemment.
    Par contre, je ne saurai pas t'aider à utiliser le tag "<?!=". Je ne l'ai jamais utilisé... Il est décrit dans la doc Google Apps Script ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Reception formulaire html dans outlook
    Par phemme dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 04/12/2009, 14h28
  2. Affichage formulaire html dans webmail
    Par romann76 dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2009, 20h17
  3. Réponses: 3
    Dernier message: 08/01/2009, 14h44
  4. Affichage d'un formulaire HTML dans PHP
    Par super-java dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2007, 16h10
  5. Probleme avec mes formulaire html dans mes pages web
    Par foungnigue dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/12/2005, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo