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 :

Mise à jour d'un tableau


Sujet :

APIs Google

  1. #1
    Débutant   Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 885
    Points : 267
    Points
    267
    Par défaut Mise à jour d'un tableau
    Bonjour.

    J'ai un google Doc qui me sert de Template pour une création d'un PDF.

    Dans ce document, j'ai un tableau qui à pour source un google Sheet.

    Quand je fait une modification dans le Sheet, je dois cliquer sur "METTRE A JOUR" au niveau du tableau dans le document google Doc afin que les dernières données saisie dans le Sheet soit ajoutées dans le tableau du Doc.

    Etant un Template, et la création du PDF se faisant depuis un Sheet, l'utilisateur ne peut pas aller sur le Doc afin de mettre à jour les informations.

    Je cherche donc un script qui me permettrait de mettre à jour ce tableau. (en fait, actuellement mon script ne fait qu'un conversion d'un Doc en PDF et c'est pas ce que je veux).

    De plus, j'ai 3 informations (date, ref, po) dans le Template qui devait venir du Sheet mais ces informations ne ce modifient pas.

    Mon code suivant peut être simplifié car je n'ai qu'une seule date, ref et po et que le code parcours une feuille mais je verrais plus tard ^^

    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
    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
    var TEMPLATE_ID = 'ID du doc de mon Template';var PDF_FILE_NAME = 'Facture BL'
     
     
    function createPdfs() {
     
     
      var ui = SpreadsheetApp.getUi()
     
     
      if (TEMPLATE_ID === '') {    
        ui.alert('L ID du template doit étre renseigné dans le code .gs')
        return
      }
     
     
      var templateFile = DriveApp.getFileById(TEMPLATE_ID)
      var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('infoTemplate')
      var allRows = activeSheet.getDataRange().getValues()
      var headerRow = allRows.shift()
     
     
      allRows.forEach(function(row) {
     
        createPdf(templateFile, headerRow, row)
     
     
        function createPdf(templateFile, headerRow, activeRow) {
     
          var headerValue
          var activeCell
          var ID = null
          var recipient = null
          var copyFile
          var numberOfColumns = headerRow.length
          var copyFile = templateFile.makeCopy()      
          var copyId = copyFile.getId()
          var copyDoc = DocumentApp.openById(copyId)
          var copyBody = copyDoc.getActiveSection()
     
     
          for (var columnIndex = 0; columnIndex < numberOfColumns; columnIndex++) {
     
            headerValue = headerRow[columnIndex]
            activeCell = activeRow[columnIndex]
            activeCell = formatCell(activeCell);
     
            copyBody.replaceText('%' + headerValue + '%', activeCell)
     
            if (headerValue === FILE_NAME_COLUMN_NAME) {
     
              ID = activeCell
     
            } else if (headerValue === EMAIL_COLUMN_NAME) {
     
              recipient = activeCell
            }
          }
     
          copyDoc.saveAndClose()
          var newFile = DriveApp.createFile(copyFile.getAs('application/pdf'))  
          copyFile.setTrashed(true)
     
     
          if (PDF_FILE_NAME !== '') {
            newFile.setName(PDF_FILE_NAME)
          } else if (ID !== null){
            newFile.setName(ID)
          }
     
     
          if (RESULTS_FOLDER_ID !== '') {
            DriveApp.getFolderById(RESULTS_FOLDER_ID).addFile(newFile)
            DriveApp.removeFile(newFile)
          }
        } // createPdfs.createPdf()
     
     
      })
     
     
      ui.alert('Nouveau PDF créé')
     
     
      return
     
    } // createPdfs()
    En espérant avoir été suffisamment explicatif.

    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé

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

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Points : 452
    Points
    452
    Par défaut
    Re !

    Hum, je n'ai pas tout compris, mais je vais essayer d'apporter quelques pistes...

    Une méthode que j'apprécie pour la génération dynamique de document depuis GAS implique l'utilisation de signets :
    1) je crée un document Google Docs modèle. Il est en tout point similaire aux documents attendus mais je remplace les informations "dynamiques" par des signets.
    2) A l'aide d'une méthode de détermination (ci-après), je repère l'identifiant de chaque signet coté GS que je conserve sous forme d'une variable constantes, par ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var MARK_TITRE = 'id.fygw72ubugq'; //  Le titre du document
    3) Au besoin, il est alors possible d'ouvrir le document template, d'en réaliser une copie dans un répertoire de destination, d'alimenter cette copie à l'aide de données issue d'un spreadsheet, puis de l'envoyer par mail :
    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
    // Variables élémentaires : modèle, répertoires, etc...
      var docTemplate = DriveApp.getFileById(xxx);
      var dossierDeGeneration = DriveApp.getFolderById(yyy);
     
      // Obtention d'une copie de travail personnalisée et datée à partir du modele
      var copiePerso_File, copiePerso_Doc, pdf, pdfFile;
      copiePerso_File = docTemplate.makeCopy('mon_titre' + edit_FormatDatePourTitreDoc_(new Date()), dossierDeGeneration);  
      copiePerso_Doc = DocumentApp.openById(copiePerso_File.getId());
     
      // Mise à jour de la copie
      copiePerso_Doc = edit_alimenterAnnexe_(copiePerso_Doc);
      copiePerso_Doc.saveAndClose();
     
      // Génération du fichier sous sa forme PDF
      pdf = copiePerso_Doc.getAs(TYPE_PDF)
      pdf.setName(copiePerso_Doc.getName() + ".pdf");
      pdfFile = DriveApp.createFile(pdf);
      DriveApp.getFolderById(ID_REP_GENERATION).addFile(pdfFile); // Ajout du fichier au répertoire de destination
      DriveApp.removeFile(pdfFile); // Le fichier doit être supprimé de la racine du Drive où il a été généré
      pdf = DriveApp.getFileById(pdfFile.getId()); // Récupération de la version depuis le répertoire de génération
      mailing_envoiDocParMail(pdf, user);
    "edit_alimenterAnnexe_" sert à substituer l'ensemble des signets du document en s'appuyant sur la méthode suivante (et en exploitant un spreadhseet pour déterminer les valeurs "texteAInserer"...). Un exemple d'appel serait "edit_remplacerMarkParId_(docARemplir, MARK_TITRE, 'Titre du document!');" :
    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
    /**
    * Fonction de complétion du texte d'un bookmark identifié par son id par le texte personnalisé transmis
    *
    * @param {File / Document} copieDeTravail, le document en cours de personnalisation
    * @param {String} idBookMarkARemplacer, l'id du bookmark à compléter
    * @param {String} texteAInserer, le texte à insérer
    */
    function edit_remplacerMarkParId_(copieDeTravail, idBookMarkARemplacer, texteAInserer) {
      // Identification du bookmark
      var bookMarkTemp = copieDeTravail.getBookmark(idBookMarkARemplacer);
     
      // ATTENTION : les bookmarks apparaissent parfois comme des PARAGRAPH et parfois comme des éléments TEXT
      // Concaténation de la valeur transmise, texteAInserer, au texte de présentation déjà présent sur le modèle
      var containerElement = bookMarkTemp.getPosition().getElement();
      if (containerElement.getType() == DocumentApp.ElementType.PARAGRAPH && texteAInserer != '') {
        containerElement.asParagraph().appendText(texteAInserer);
      } else if (containerElement.getType() == DocumentApp.ElementType.TEXT && texteAInserer != '') {
        containerElement.asText().appendText(texteAInserer);
      }
    }
    Et la méthode d'identification des signets/bookmarks :
    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
    /**
    * DEV uniquement
    * Fonction utilitaire d'aide à l'identification des bookmarks présents dans un document : leurs id sont tracés et rapprochés de leur texte
    */
    function edit_IdentifierBookmark() {
      var docTemplate = edit_getTemplateAnnexe_(DEPLOYMENT_TYPE);
      var dossierDeGeneration = DriveApp.getFolderById(ID_REP_GENERATION); 
      var copiePerso_File = docTemplate.makeCopy(DOC_TITRE + '_' + ('temp'.split('@')[0]).split('.')[0], dossierDeGeneration);
      var copiePerso_Doc = DocumentApp.openById(copiePerso_File.getId());
     
      // L'ensemble des bookmark est parcourus pour tracer dans les logs chaque ID avec le texte qui l'accompagne
      var bookMarks = copiePerso_Doc.getBookmarks();
      var indiceBM = 0;
      for(indiceBM; indiceBM < bookMarks.length; indiceBM++) {
        Logger.log(bookMarks[indiceBM].getId() + ' : ' + bookMarks[indiceBM].getPosition().getElement().asText().getText());
      }
    }
    Bon courage !
    Signature à venir...
    Ancienne : Divers NTIC (PHP, Dojo, à venir...) : http://tif44.fr/blog/

  3. #3
    Débutant   Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 885
    Points : 267
    Points
    267
    Par défaut
    Bonjour

    Merci beaucoup pour ta réponse.

    Cette partie étant mise en suspend par mon responsable, je me pencherait plus profondément dans ta réponse plus tard (si mon responsable souhaite y revenir dessus ^^).

    En tout cas, merci (mais ne t’inquiète pas, j'ai plein de question sur Google-Apps-Script avec toute la suite Google^^).

Discussions similaires

  1. [XL-2007] VBA pour automatiser la mise à jour d'un tableau
    Par gdmeunier dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 13/06/2011, 17h42
  2. [XL-2007] Mise à jour d'un tableau à partir d'un autre tableau générique
    Par NoxfromParis dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/01/2011, 20h40
  3. Réponses: 3
    Dernier message: 23/06/2010, 11h41
  4. Mise à jour d'un tableau de liens
    Par mielikki dans le forum Langage
    Réponses: 3
    Dernier message: 12/09/2009, 19h59
  5. mise à jour d'un tableau
    Par pipo159 dans le forum Excel
    Réponses: 17
    Dernier message: 14/03/2008, 12h03

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