Sauvergarder en pdf une plage de données

Bonjour,

J'ai lu quelque part qu'on ne pouvait pas gérer les impressions par le biais d'apps script et qu'il fallait passer par la création d'un pdf. Ca me va mais je n'arrive pas à trouver comment faire.

Je vous mets un fichier test en exemple. Je gère des réservations de salles mais je ne m'occupe pas des états des lieux. C'est donc un petit feuillet de suivi que je mets dans la pochette correspondant à une réservation afin que la personne qui fera l'état des lieux (elles sont plusieurs) puisse savoir ce qu'il faut réclamer au locataire sans avoir à feuilleter toute la pochette (chose qu'elle oubliera de faire systématiquement). J'ai simplifié et réduit le document pour faciliter les choses.

Dans mon fichier de travail :

  • la cellule A1 se rempli automatiquement par le biais d'une macro qui fonctionne parfaitement
  • la cellule A2 est une fonction QUERY qui rappatrie les informations d'une autre feuille et qui compléte le tableau de A2 à L3

Dans mon fichier test, je les ai remplie manuellement

J'ai une plage qui s'appelle "Feuilletsuivi" et qui correspond aux cellules A5 à D17

Je veux pouvoir, par le biais d'une macro, sauvegarder la plage "Feuilletsuivi" dans un dossier en particulier et je veux qu'elle récupère le nom dans la cellule L3

Je pense que ce n'est pas compliqué mais justement dans toutes les recherches que je faisais, il y avait des conditions différentes et plus complexes qui perturbaient ma macro.

Si quelqu'un a une idée, je suis preneuse

Merci

Coloc

https://docs.google.com/spreadsheets/d/1uNzDtp5LQhiEYUI1OGKUUfwpyLDTLHVa9hKUzYp-GaE/edit?usp=sharing

Bonjour Coloc,

Je vous laisse un script à tester :

function exportRangeToPdf() {
  // Obtenir le Spreadsheet actuel
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // Obtenir la feuille de calcul actuelle
  var sheet = ss.getActiveSheet();

  // Spécifier la plage à exporter en PDF
  var range = sheet.getRange("Feuilletsuivi");

  // Créer un nouveau Spreadsheet temporaire pour stocker la plage
  var newSpreadsheet = SpreadsheetApp.create("TempSpreadsheet");

  // Copier la plage dans le nouveau Spreadsheet
  range.copyTo(newSpreadsheet.getActiveSheet().getRange(1, 1));

  // Exporter le nouveau Spreadsheet en PDF
  var pdf = DriveApp.getFileById(newSpreadsheet.getId()).getAs('application/pdf');

  // Spécifier le nom du fichier à partir de la cellule L3
  var fileName = sheet.getRange("L3").getValue();
  pdf.setName(fileName);

  // Spécifier le dossier où sauvegarder le PDF
  var folder = DriveApp.getFolderById("id_du_dossier");
  folder.createFile(pdf);

  // Supprimer le nouveau Spreadsheet temporaire
  DriveApp.getFileById(newSpreadsheet.getId()).setTrashed(true);
}

N'oubliez pas de remplacer "id_du_dossier" par l'ID du dossier dans lequel vous voulez sauvegarder le PDF.

La fonction createFile() de l'objet Folder crée une copie du fichier PDF dans le dossier spécifié. C'est pourquoi le nouveau Spreadsheet temporaire est supprimé après l'exportation en PDF.
espère que cela vous aidera.

Bonsoir Abderrahmane

J'ai testé votre script mais il bloque dès le début. Il ne me crée pas la feuille temporaire.

J'ai cependant trouvé une solution. Je sais créer un pdf à partir d'une feuille. Du coup, dans ma macro, je masque au préalable mes lignes 1 à 4 et je crée mon pdf à partir de la feuille.

En tout cas, merci d'avoir proposé quelque chose. Il y a des parties qui vont me servire pour d'autres script

Coloc

Bonjour,

Afin d'imprimer une plage définie dans une feuille, j'utilise le code suivant :

var optionImpression = {
  'size': 7,               // choix du format papier. 0=letter, 1=tabloid, 2=Legal, 3=statement, 4=executive, 5=folio, 6=A3, 7=A4, 8=A5, 9=B4, 10=B
  'fzr': false,            // affiche les entetes
  'portrait': true,        // false=paysage
  'fitw': true,            // la taille s'adapte à la fenetre
  'gridlines': false,      // affiche les grille
  'printtitle': false,     // imprime le titre 
  'sheetnames': false,     // imprime le nom de la feuille 
  'pagenum': 'UNDEFINED',  // CENTER = affiche les numéros de page / UNDEFINED = ne les affiches pas
  'attachment': false
}

var PDF_OPTS = objectToQueryString(optionImpression);

function impressionPlage() {
  SpreadsheetApp.flush();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange("A4:H35"); // la plage à imprimer

  var gid = sheet.getSheetId();
  var printRange = objectToQueryString({
    'c1': range.getColumn() - 1,
    'r1': range.getRow() - 1,
    'c2': range.getColumn() + range.getWidth() - 1,
    'r2': range.getRow() + range.getHeight() - 1
  });
  var url = ss.getUrl().replace(/edit$/, '') + 'export?format=pdf' + PDF_OPTS + printRange + "&gid=" + gid;
  var htmlTemplate = HtmlService.createTemplateFromFile('js');
  htmlTemplate.url = url;
  SpreadsheetApp.getUi().showModalDialog(htmlTemplate.evaluate().setHeight(10).setWidth(100), "Ouverture de l'impression");
}

function objectToQueryString(obj) {
  return Object.keys(obj).map(function(key) {
    return Utilities.formatString('&%s=%s', key, obj[key]);
  }).join('');
}

Avec un second fichier, HTML : js.html

ceci permet de lancer l'impression directement :

"<!DOCTYPE html>
<html>
  <head>
    <base target=""_top"">
  </head>
  <body>
    <script>
  window.open('<?=url?>', '_blank', 'width=800, height=600');
  google.script.host.close();
</script>
  </body>
</html>"

Merci Pierre je vais essayer

Coloc

Rechercher des sujets similaires à "sauvergarder pdf plage donnees"