Aide sur un basique (appscript) enregistrement feuille sur drive

Bonjour,

Je vais essayer d'expliquer au mieux mon besoin, je débute sur appscript. (en fin de post, mon script actuel)

Je souhaiterais envoyer des fichiers "dynamique" sur plusieurs dossiers partagés de mon drive.

Actuellement je sélectionne en B1 un nom/prénom, en B2 un mois, ce qui me créé un nom de fichier unique en A3. (l'idéal serait, que, lorsque je coche une ligne qqpart sur mon sheets ces cellules B1 et B2 se remplissent seules et que le script s'exécute par la suite)

Je souhaiterais que l'ensemble de mes cellules (dont certaines sont des formules qui pointent vers d'autre feuille de mon Sheets) aillent s'enregistrer dans le dossier drive partagé de la bonne personne.

Je ne sais pas si cela est clair, c'est dur à retranscrire ce que j'ai en tête sur le "papier".

Mon code actuel (qui pour le moment, me renomme le fichier avec le contenu de la cellule en A3) :

function quittance(){
  var SAgAS = SpreadsheetApp.getActiveSpreadsheet();
  var gSB = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Courrier');
  var nom = gSB.getRange('A3').getValue();
  var quittance = gSB;
  var dossier = DriveApp.getFolderById ("13wp0RVbvGcJ6p0e80h9eA-zQc5qy-8sH")
  var feuille = SpreadsheetApp.create("Quittance_" + nom)
  DriveApp.getFileById(feuille.getId()).moveTo(dossier);
  Logger.log(feuille.getId())
  var destination = SpreadsheetApp.openById(feuille.getId());
  quittance.copyTo(destination);
  destination.deleteSheet(destination.getSheets()[0])
}

1er problème / question : toutes les cellules qui renvoient des formules sont vides (forcément). que puis-je faire ?

2 ème : Comment puis-je gérer la notion d'envoyer vers tel ou tel dossier "dynamiquement" ou "automatiquement" je ne saispas ce qu'il est possible de réaliser ?

Je pense avoir d'autre question mais qui risque fortement de changer selon vos réponses/idées, je ne suis pas sûr que cela soit pertinent de demander tout de suite.

Merci bcp à qui prendra du temps pour ma demande

PS : Je suis pour avoir des explications mais pas forcement la solution, j'aime apprendre aussi.

Bonjour,

Si tu n'as pas besoin d'ensuite retourner modifier le fichier enregistré, tu peux l'exporter en PDF, ainsi c'est une "impression" de ta feuille, avec les données issues des formules figées.

Pour ce qui est de l'enregistrement, tu veux avoir quelle arborescence ? un dossier avec x sous dossier portant comme noms ce qu'il y a en B1 de ta feuille ?

Une fois le PDF sorti, je n'ai pas besoin d'y retourner.

Arborescence :

Mon arborescence dans mon drive :

Dossier "BAT 1" puis Dossier "QUITTANCE" puis dossier "B1 de ma feuille" (locataire n°1); B1 de ma feuille" (locataire n°2),.....

Dossier "BAT 2" puis Dossier "QUITTANCE" puis dossier "B1 de ma feuille" (locataire n°1); B1 de ma feuille" (locataire n°2),.....

Dossier "BAT 3" puis Dossier "QUITTANCE" puis dossier "B1 de ma feuille" (locataire n°1); B1 de ma feuille" (locataire n°2),.....

(S'il est plus simple de faire différemment je peux aussi)

Merci pour l'aide

Effectivement si la macro peut "faire un export en pdf" des cellules (A1:A25 par exemple) ce serait parfait.

PS : J'ai une signature en A25 (une "image" je crois)

D'accord, donc il y a 2 sujets :

- générer un PDF correct et avec un bon nom

- le stocker au bon endroit

Dans un 1er temps, il faut bien générer le PDF, dans un dossier test, une fois cette étape terminée, passer à la suite. Peux tu essayer ceci et voir ce que ca donne (en modifiant l'ID du dossier drive)

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

//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 celulle.
  var docName =  sheet.getRange('A3').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(""17LmzDRdzPpH3zt_4rhrtr--zNo5"");/* 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 : 0AGuVhN09TP00Uk9PVA */
  var finalFile = file.moveTo(folder);
  var docUrl = finalFile.getUrl();
}

Merci je vais essayer cela.

Mon code actuel ne sert plus à rien ?

Question bête, c'est quoi BSD ?

Merci :)

Edit : réponse à moi-même en lisant le script mon code ne sert plus....

J'ai un soucis sur cette ligne me semble t-il ?

var docurl = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' +  token } });

Le débogage s'arrête ici

Encore un réponse à moi-même.

J'ai du rajouter 2 "oauthScopes" dans mon "JSON" (je ne sais pas comment on le dit dans le language)

Puis accepter les autorisations

Et c'est bon

Rebonsoir,

Voilà j'ai qqs question qui me vienne :

Il me faudrait uniquement en PDF La partie A1:A25 (pas tout le document)

Je vais chercher comment faire cela.

Je suis en train de voir pour caler correctement le texte.

Pour grossir mon texte, je dois jouer dans le document en lui-même je suppose ?

Pour ne sélectionner que les cellules A1:A25 est-ce comme cela qu'il faut procéder ?

var range = sheet.getRange("A1:A25"); 

Je reviens vite

merci

Je me répond encore à moi-même

J'ai trouvé cela (j'ai mis les aides en français) qui me permet d'exporter la plage de cellule en pdf MAIS

function exportRangeToPDf(range) {
  var blob,exportUrl,options,pdfFile,response,sheetTabNameToGet,sheetTabId,ss,ssID,url_base;

  range = range ? range : "A1:A25";//Set the default to whatever you want

  sheetTabNameToGet = "Courrier";//Remplacer le nom par le nom de votre feuille
  ss = SpreadsheetApp.getActiveSpreadsheet();//Cela suppose que le projet Apps Script est lié à une Sheet
  ssID = ss.getId();
  sh = ss.getSheetByName(sheetTabNameToGet);
  sheetTabId = sh.getSheetId();
  url_base = ss.getUrl().replace(/edit$/,'');

  //Logger.log('url_base: ' + url_base)

  exportUrl = url_base + 'export?exportFormat=pdf&format=pdf' +

    '&gid=' + sheetTabId + '&id=' + ssID +
    '&range=' + range + 
    //'&range=NamedRange +
    '&size=A4' +     // Taille
    '&portrait=true' +   // orientation, "false" pour le paysage
    '&fitw=true' +       // ajuster à la largeur, "false" pour la taille réelle
    '&sheetnames=true&printtitle=false&pagenumbers=true' + //masquer les en-têtes et pieds de page facultatifs
    '&gridlines=false' + // masquer le quadrillage
    '&fzr=false';       // ne répétez pas les en-têtes de ligne (lignes figées) sur chaque page

  //Logger.log('exportUrl: ' + exportUrl)

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

  options.muteHttpExceptions = true;//Assurez-vous que ceci est toujours défini

  response = UrlFetchApp.fetch(exportUrl, options);

  //Logger.log(response.getResponseCode())

  if (response.getResponseCode() !== 200) {
    console.log("Error exporting Sheet to PDF!  Response Code: " + response.getResponseCode());
    return;

  }

  blob = response.getBlob();

  blob.setName('AAA_test.pdf')

  pdfFile = DriveApp.createFile(blob);//Créer le fichier PDF
  //Logger.log('pdfFile ID: ' +pdfFile.getId())

mais maintenant il faudrait que j'imbrique le code pour renommer correctement et là je sèche..

Si qq'un peut m'aider et me dire si je suis sur la bonne voie ?

Merci

Salut,

Pour imprimer une range précise, il te suffit de l'ajouter dans les paramètres d'impression, voici le script corrigé pour la range A1:A25 :

function savePDF(){
// Selection de la feuille à PDFiser
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Courrier');
  var range = 'A1:A25';

//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
      + '&range='+range;

  // 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 celulle.
  var docName =  sheet.getRange('A3').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(" ID DU DOSSIER DRIVE ");/* 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 : 0AGuVhN09TP00Uk9PVA */
  file.moveTo(folder);
}

Bonjour,

Malheureusement j'avais déjà essayé cela, et ça ne fonctionne pas.

J'ai toujours toutes la feuille qui vient avec...

Une idée ? (je remet le code en entier ci-dessous

function savePDF(){
// Selection de la feuille à enregistrer en PDF
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Courrier');
  var range = 'A1:A25';
//générer URL de la feuille
    var ssUrl = ss.getUrl();
    var sheetId= sheet.getSheetId();

// Ici sont indiquées les caractéristiques de l'impression PDF, il nécessite d'adapter les marges, les orientations en fonction des données.
    var url = ssUrl.replace(/\/edit.*$/,'')
      + '/export?exportformat=pdf&format=pdf'
      + '&size=A4'
      + '&portrait=true'
      + '&fitw=true'
      + '&top_margin=1'
      + '&bottom_margin=0.50'          
      + '&left_margin=2'             
      + '&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 A3, vous pouvez y mettre un nom directement, ou bien un autre celulle.
  var docName =  sheet.getRange('A3').getValue();

// Créer le PDF à 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("13wp0RVbvGcJ6p0e80h9eA-zQc5qy-8sH");
  /* Important ! > Ci-dessus on doit mettre l'adresse du dossier drive où l'on veut sauvegarder le PDF, allez dans votre dossier, et, dans la barre d'URL en haut copier le code qui ressemble à ça : 0AGuVhN09TP00Uk9PVA */
  var finalFile = file.moveTo(folder);
  var docUrl = finalFile.getUrl();
}

Bonjour,

tu as oublié de mettre la range :

      + '&range='+range;

Bonjour,

Effectivement je n'avais pas vue la ligne en plus dans les caractéristique de l'impression.

Mais après essais cela ne fonctionne toujours pas, j'ai du rater autre chose ?

Je recopie le code ci-dessous

function savePDF(){
// Selection de la feuille à enregistrer en PDF
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Courrier');
  var range = 'A1:A25';

//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 nécessite d'adapter les marges, les orientations en fonction des données.
      + '/export?exportformat=pdf&format=pdf'
      + '&size=A4'
      + '&portrait=true'
      + '&fitw=true'
      + '&top_margin=1'
      + '&bottom_margin=0.50'          
      + '&left_margin=2'             
      + '&right_margin=0.50'           
      + '&sheetnames=false'
      + '&printtitle=false'
      + '&pagenum=false'
      + '&gridlines=false'
      + '&fzr=FALSE'
      + '&gid='+sheetId;
      + '&range='+range;

// Création du nom du PDF, dans mon cas une cellule située en A3, vous pouvez y mettre un nom directement, ou bien un autre celulle.
  var docName =  sheet.getRange('A3').getValue();

// Créer le PDF à 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("13wp0RVbvGcJ6p0e80h9eA-zQc5qy-8sH");
  /* Important ! > Ci-dessus on doit mettre l'adresse du dossier drive où l'on veut sauvegarder le PDF, allez dans votre dossier, et, dans la barre d'URL en haut copier le code qui ressemble à ça : 0AGuVhN09TP00Uk9PVA */
  var finalFile = file.moveTo(folder);
  var docUrl = finalFile.getUrl();
}

Merci encore pour l'aide

J'ai copié collé ton code et effectivement il fonctionne, mais je ne vois pas où j'ai péché ! (grrrr)

En tout cas merci pour cela.

Est-il possible de m'aider sur ma 2ème partie : "Stockage en bon endroit" ?

Merci

Edit : à priori la seul différence était

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

au lieu de

// enregistrement du PDF dans le Drive
  var folder = DriveApp.getFolderById("13wp0RVbvGcJ6p0e80h9eA-zQc5qy-8sH");/* 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 : 0AGuVhN09TP00Uk9PVA */
  file.moveTo(folder);

Bonjour,

Actuellement lorsque je colle mon relevé de banque dans ma feuille dédiée cela me rempli un tableau de synthèse.

J'aimerais que lorsque certaine de ces cases se "remplissent" cela vienne modifier mes cellules B1 et B2 afin de pouvoir générer le pdf dans le bon dossier du locataire.

Je ne sais pas si cela est possible et réalisable.

Merci pour votre aide

Est-il possible de m'aider sur ma 2ème partie : "Stockage en bon endroit" ?

Comment le script doit trouver cet endroit ? un nom dans une cellule ? Laquelle ?

J'aimerais que lorsque certaine de ces cases se "remplissent" cela vienne modifier mes cellules B1 et B2 afin de pouvoir générer le pdf dans le bon dossier du locataire.

C'est faisable mais comment est structurée l'entrée des données ?

Je tente une explication de mon Sheets actuel :

Comment le script doit trouver cet endroit ? un nom dans une cellule ? Laquelle ?

coller

Ci-dessus en 1er je colle en A:C mon relevé de banque dans une feuille "coller" de mon Sheets et j'en extrait diverses informations (Nom du locataire, année, mois, terme 'loyer" ou "charges").

locataires actuels

Ci-dessus j'ai un tableau de synthèse qui se rempli seul à l'aide de formule

Le nom qui se trouve dans la case "B1" et le mois en "B2" (du fichier exporté en PDF sur lequel tu m'as aidé précédemment) se retrouve dans ce tableau là.

L'idée serait qu'à l'apparition d'un montant dans ce tableau de synthèse (il peut y en avoir plusieurs en même temps, vu que je copie généralement un mois entier de mes relevés de compte) que le (les) PDF soient générés et aillent dans le bon dossier. (Dossiers qui pourrait/devrait reprendre le "A3" du PDF exporté, sachant que j'ai des personnes par ex en 2024-02-C et des personnes en 2024-02-B, C et B étant des bâtiments différents, et donc des dossiers de destination différents)

Du coup, si je ne me trompe pas, l'endroit où le nom en "B1" (de la feuille PDF) se retrouve aussi en "E2" de ma feuille "Locataires actuels loyers 2024"), quant au "B2" du PDF, il se trouve en "C9" ou "C10" ou "C11" de cette même feuille.

Est-ce que cela répond à tes questions ou bien manque t-il encore des infos ?

Merci, j'espère que j'ai pu être clair.

Rechercher des sujets similaires à "aide basique appscript enregistrement feuille drive"