Enregistrement PDF d'une ligne selon script

Bonjour à tous,

Autre sujet sur lequel j'ai un petit coup de pouce.

J'ai un fichier composé de 2 onglets dont j'aimerais enregistrer les lignes dans un document PDF (1 document par ligne).

J'aimerais que le fichier PDF soit composé de date, du type, du moyen de paiement et y trouver la photo de la colonne F.

J'aimerais que le fichier se nomme : DATE_Magasin_Moyen de paiement et s'enregistre dans un dossier dans google drive.

capture

J'ai un bout de script mais qui ne fonctionne pas :/

https://docs.google.com/spreadsheets/d/1gVs_PWzel1wAxS57Eshn5bmI0iLW72It42LJjpO1C6E/edit?usp=share_l...

Je vous en remercie par avance :)

juju_ski

Bonjour,

Le fichier n'est pas accessible, toutefois, c'est faisable :

- 1 déclarer le fichier, les onglets

- 2 créer une liste vide qui contiendra les données (1 occurrence = date + type + moyen paiement + photo) > Attention, j'ai un doute au sujet à la copie de la photo

- 3 compter le nombre de lignes dans l'onglet tableau

- 4 faire une boucle qui vérifie ligne par ligne si la case en colonne A est coché, si oui, ajouter la ligne concernée à la liste précédemment créée.

- 5 faire une nouvelle boucle, qui à partir de la liste, pour chaque occurrence, complète votre modèle PDF, l'exporte dans votre drive, le vide.

Pardon,

Le fichier doit être accessible maintenant :)

Il est en lecture seul, de plus je ne vois pas votre feuille qui sert à faire les PDF ?

Voilà, c'est mis en modificateur.

Ma feuille qui sert à faire les PDF est la première feuille "Factures"

En effet, le code semble copier/coller, il manque des données.

Afin de le rendre fonctionnel, pouvez-vous expliquez votre objectif, de ce que j'ai compris, vous avez un tableau, la feuille facture sur laquelle vous allez avoir une liste de donnée et votre but est de cocher certaines lignes, puis de pouvoir les enregistrer en PDF ?

Si tel est le cas, vous voulez juste 1 pdf par ligne qui ressemble à ça ? :

screenshot 2023 04 28 14 59 02

En fait, j'ai une application mobile simple, qui va me remplir ce tableau. 1 facture = 1 photo et ses précisions = 1 ligne.

Ce que je cherche c'est d'avoir 1 PDF par ligne avec la photo et les informations qui vont avec tel que vous l'avez indiqué.

Et le nom du fichier, s'il peut s'appeler : date_magasin_moyen de paiement ca serait top.

Le tout, s'enregistrant dans un dossier drive.

Les cases de la colonne A fonctionnent sont là pour cocher automatiquement les lignes qui se sont bien transformer en PDF et moi je viens supprimer régulièrement les lignes déjà cochées dans le tableau.

En espérant avoir été assez précis

D'accord, donc l'objectif, c'est que ce script tourne automatiquement et lorsqu'une nouvelle ligne apparait, il édite un PDF, l'enregistre et coche la case en colonne A, c'est cela ?

exactement :)

J'appuie sur mon petit MENU :

capture

et cela se lance.

Bonjour,

J'ai essayé un nouveau code, malheureusement j'ai une erreur :

ReferenceError: Sheets is not defined

Pourtant, j'ai l'impression que l'ensemble de mes feuilles sont bien nommées.

Une idée ? :)

Merci d'avance,

juju_ski

Voici à titre d'exemple le script dont je me sers pour enregistrer et envoyer des PDF par mail, si vous souhaitez l'adapter, il faut changer les plages, perso je ferai une feuille qui reprenne les lignes cochées et à la fin supprimer la partie envoi mail :

function savePDF()
{
// Selection de la feuille à PDFiser
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

//générer URL de la feuille
    var ssUrl = ss.getUrl();
    var sheetId= sheet.getSheetId();

    var url = ssUrl.replace(/\/edit.*$/,'') // ici sont indiquées les caractéristiques de l'impression PDF, il necessite d'adapter les marges, orientation en fonction de vos données.
      + '/export?exportformat=pdf&format=pdf'
      + '&size=A4'
      + '&portrait=true'
      + '&fitw=true'
      + '&top_margin=-0.95'
      + '&bottom_margin=0.50'          
      + '&left_margin=0.50'             
      + '&right_margin=0.50'           
      + '&sheetnames=false'
      + '&printtitle=false'
      + '&pagenum=false'
      + '&gridlines=false'
      + '&fzr=FALSE'
      + '&gid='+sheetId;

  // Création du nom du PDF, dans mon cas une cellule située en A6, vous pouvez y mettre un nom directement, ou bien un autre cellule.
  var docName =  sheet.getRange('A6').getValue();
// CRÉER LE PDF A PARTIR DE L'URL
  var token = ScriptApp.getOAuthToken();
  var docurl = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' +  token } });
  var pdf = docurl.getAs('application/pdf').setName(docName);
  var file = DriveApp.createFile(pdf);

  // enregistrement du PDF dans le Drive
  var folder = DriveApp.getFolderById("1BFuThN09TP00Uk9PVA");/* Important ! > Ici on doit mettre l'adresse du dossier drive où on veut sauvegarder le PDF, allez dans votre dossier et dans la barre d'URL en haut copier le code qui ressemble à ça : 1BFuThN09TP00Uk9PVA */
  var finalFile = file.moveTo(folder);
  var docUrl = finalFile.getUrl();

  // Envoi du PDF par mail
  var demandeurEmail = sheet.getRange('F5').getValue(); /* ici l'adresse mail de mon destinataire se situe dans une cellule (F5), il est possible de changer directement l'information, ou de mettre une autre cellule */
  var message = "Bonjour"+"<p>Ci-joint le "+docName+"</p>"+"<a href='"+docUrl+"'>Cliquez ici pour ouvrir le recap.</a>"; // texte du mail
MailApp.sendEmail({to:demandeurEmail , subject: ""+docName, htmlBody:message}) ;

 // facultatif, cela sert à confirmer à l'utilisateur que le mail à  bien été envoyé
 var demandeur = "Prénom NOM"; // nom du destinataire
 var ui = SpreadsheetApp.getUi(); 
 ui.alert("Le "+ docName +" a bien été créé\n et été envoyé à "+ demandeur +" ");
}

Bonjour,

J'ai réussi à faire fonctionner mon code mais juste une remarque.

const ss = SpreadsheetApp.getActiveSpreadsheet();
const source = ss.getSheetByName('Scan');
const rngDest = ss.getSheetByName('Paramètres').getRange('B1:B').getValues().flat().filter(r => r != '')
const destination = 'Facture'

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 Editer en pdf et stocker', 'editionsPDF')
    .addToUi();
}

function editionsPDF() {
  source.getDataRange().getDisplayValues().forEach((r, i) => {
    if (r[0] == 'FALSE' && r[1] != '') {
      reporterValeurs(+i + 1)
    }
  })
}

function reporterValeurs(row) {

  const ranges = []
  const values = []
  rngDest.forEach((c, i) => {
    if (c.includes(':')) {
      var ligne = /([0-9]+)/g.exec(c)[0]
      var colonne = /([A-Z]+)/g.exec(c)[0]
      source.getRange(row, +i + 2).getDisplayValue().split(',').forEach((cell, j) => {
        // on commence à la colonne B
        ranges.push(`'${destination}'!${colonne + (+ligne + j)}`)
        values.push(`${cell}`)                       
      })
    } else {
      ranges.push(`'${destination}'!${c}`)
      values.push(`${source.getRange(row, +i + 2).getDisplayValue()}`)                
      // on commence à la colonne B
    }
  })

  const data = ranges.map((e, i) => ({ range: e, values: [[values[i]]] }));
  Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, idDest);

  SpreadsheetApp.flush()

  // sortie pdf de la feuille
  const fileDest = SpreadsheetApp.openById(idDest)
  const filename = 'Facture_' + fileDest.getRange('e2').getValue()+ "_"+ fileDest.getRange('e3').getValue()+ "_" + fileDest.getRange('c4').getDisplayValue()
  const url = "https://docs.google.com/a/mydomain.org/spreadsheets/d/"
    + idDest
    + "/export?exportFormat=pdf&gid="
    + fileDest.getSheetByName(destination).getSheetId()
    + "&access_token=" + ScriptApp.getOAuthToken();
  const blob = UrlFetchApp.fetch(url).getBlob().setName(filename);
  const file = DriveApp.getFolderById(folderID).createFile(blob);
  fileDest.getSheetByName('GED').appendRow([Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd"), file.getId(), file.getUrl(), file.getName()])

  source.getRange(row, 1).setValue(true)                                      // indicateur en colonne A

}

J'ai une photo que j'aimerais afficher en G2.

Or, ce qui s'affiche c'est le lien où est stockée la photo qui s'affiche et non la photo en elle même.

Pensez-vous qu'il existe une solution ?

Merci d'avance,

Rechercher des sujets similaires à "enregistrement pdf ligne script"