Google sheet script conversion en PDF

Le problème exposé dans ce sujet a été résolu.

Bonjour tout le monde.

Voilà, j’ai un petit soucis avec mon script sur google sheet. L’idée c’est de pouvoir faire un PDF avec 2 onglets de mon google sheet. J’ai donc fait un script qui copie les données sur un fichier temporaire et qui ensuite fait le PDF.

Sauf que, les données copiées sont des formules, donc ca me donne le resultat en #REF puisqu’il n’a plus les formules…

J’ai bien essayé d’utiliser un PASTE.VALUES mais ça ne fonctionne pas ><

Auriez-vous une idée ? Merci d’avance

function saveToPDF() {
  var dest = SpreadsheetApp.create('temp');
  var s1 = SpreadsheetApp.getActive().getSheets()[7];
  var s2 = SpreadsheetApp.getActive().getSheets()[12];
  //var s3 = SpreadsheetApp.getActive().getSheets()[3];
  s1.copyTo(dest);
  s2.copyTo(dest);
  //s1.copyTo(dest,SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
  //s2.copyTo(dest,SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
 // s3.copyTo(dest);
  dest.deleteActiveSheet();

  // Get folder containing spreadsheet, for later export
  var parents = DriveApp.getFileById(dest.getId()).getParents();
  if (parents.hasNext()) {
    var folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }

  //additional parameters for exporting the sheet as a pdf
  var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

      // Print either the entire Spreadsheet or the specified sheet if optSheetId is provided
      + '&id=' + dest.getId()

      // following parameters are optional...
      + '&size=letter'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&fitw=true'        // fit to width, false for actual size
      + '&sheetnames=false&printtitle=false&pagenumbers=false'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page

  var options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken()
    }
  }

  //var artiste =  sheet.getRange('C3').getValue();

  var activeSSName = SpreadsheetApp.getActive().getName();
  var response = UrlFetchApp.fetch("https://docs.google.com/spreadsheets/" + url_ext, options);
  var blob = response.getBlob().setName(activeSSName + '.pdf');

  //from here you should be able to use and manipulate the blob to send and email or create a file per usual.
  //In this example, I save the pdf to drive
  folder.createFile(blob);

  var toDelete = DriveApp.getFileById(dest.getId());
  toDelete.setTrashed(true);

}
+0 -0

Salut,

en explorant un peu l’API il semble qu’on peut soit exporter le document entier soit une feuille précise mais pas deux feuilles. D’où le fait que le script utilise un document temporaire pour faire l’export de deux feuilles spécifiques.

La méthode copyTo ne semble pas vraiment paramétrable, ou du moins ne marche pas bien.

Une bonne méthode semble être de faire des copies de Range. Pour éviter le bug du #REF plutôt que getValues il faut utiliser getDisplayedValues

  var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
  // ici l'astuce du DisplayedValues
  var sourcevalues = sourceRange.getDisplayedValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);
+0 -0

Bonjour o/

Merci pour cette réponse. J’ai du coup adapté le script à mon fichier (en mettant DisplayValues et pas DisplayedValues ^^)

J’ai quasiment réussi à tout faire ! Là il me reste le soucis d’exporter aussi le format et une image ><.

Le script, s’il peut servir

function saveToPDF() {

  var dest = SpreadsheetApp.create('temp');
  var destSheet1 = SpreadsheetApp.openById(dest.getId()).getSheets()[0];

  var destSheet2 = dest.getSheetByName("Test2");
  if (destSheet2 != null) {
      dest.deleteSheet(destSheet2);
  }
  destSheet2 = dest.insertSheet();
  destSheet2.setName("Test2");

  //var destSheet2 = SpreadsheetApp.openById(dest.getId()).getSheets()[1];
 // var dest1 = SpreadsheetApp.getActive().getSheets()[1];
  var s1 = SpreadsheetApp.getActive().getSheets()[1];
  var s2 = SpreadsheetApp.getActive().getSheets()[2];
  
  var sourceRange = s1.getRange(1,1,s1.getMaxRows(),s1.getMaxColumns());
  var sourcevalues = sourceRange.getDisplayValues();
  var destRange = destSheet1.getRange(1,1,s1.getMaxRows(),s1.getMaxColumns());
  destRange.setValues(sourcevalues);

  var sourceRange2 = s2.getRange(1,1,s2.getMaxRows(),s2.getMaxColumns());
  var sourcevalues2 = sourceRange2.getDisplayValues();
  var destRange2 = destSheet2.getRange(1,1,s2.getMaxRows(),s2.getMaxColumns());
  destRange2.setValues(sourcevalues2);

  // Get folder containing spreadsheet, for later export
  var parents = DriveApp.getFileById(dest.getId()).getParents();
  if (parents.hasNext()) {
    var folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }

  //additional parameters for exporting the sheet as a pdf
  var url_ext = 'export?exportFormat=pdf&format=pdf'   //export as pdf

      // Print either the entire Spreadsheet or the specified sheet if optSheetId is provided
      + '&id=' + dest.getId()

      // following parameters are optional...
      + '&size=letter'      // paper size
      + '&portrait=true'    // orientation, false for landscape
      + '&fitw=true'        // fit to width, false for actual size
      + '&sheetnames=false&printtitle=false&pagenumbers=false'  //hide optional headers and footers
      + '&gridlines=false'  // hide gridlines
      + '&fzr=false';       // do not repeat row headers (frozen rows) on each page

  var options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken()
    }
  }

  //var artiste =  sheet.getRange('C3').getValue();

  var activeSSName = SpreadsheetApp.getActive().getName();
  var response = UrlFetchApp.fetch("https://docs.google.com/spreadsheets/" + url_ext, options);
  var blob = response.getBlob().setName(activeSSName + '.pdf');

  //from here you should be able to use and manipulate the blob to send and email or create a file per usual.
  //In this example, I save the pdf to drive
  folder.createFile(blob);

  var toDelete = DriveApp.getFileById(dest.getId());
  toDelete.setTrashed(true);

}
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte