Page 1 sur 1

Intégrer l'ID du fichier à partir de son URL dans un code

Publié : 17 févr. 2024 17:00
par Piga25
Bonjour,

J'ai un fichier sheets qui me permet d'envoyer une feuille en PDF. Par contre lorsque je change d'année, je fait une copie dudit fichier, mais le soucis que j'ai c'est que l'adresse URL du fichier est toujours celle du fichier origine et non celle du fichier actif.

J'aimerai que la ligne située dans mon code s'actualise automatiquement.: const docID = '......................';
function envoiPDF() {
  DocumentApp.getActiveDocument();
  DriveApp.getFiles();
  // variables
  const doc = SpreadsheetApp.getActive();
  const docID = '1UO3KItXuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
  const feuilleID = '1108413420';

J'ai bien un code qui permet de récupérer l'URL complet du document actif, 
function getUrl() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  Logger.log(ss.getUrl());
}

et un autre qui permet d'identifier l'ID du document
function getIdFromUrl() {
  let ui = SpreadsheetApp. getUi()
  let prompt = ui.prompt("Renseignez l'URL depuis laquelle vous souhaitez récupérer l'identifiant")
  url = prompt.getResponseText()
  ui.alert(url.match(/[-\w]{25,}(?!.*[-\w]{25,})/).toString())
}

Mon problème, comment faire pour tout intégrer dans mon code envoiPDF

Merci
Cordialement PIGA25

Re: Intégrer l'ID du fichier à partir de son URL dans un code

Publié : 18 févr. 2024 17:30
par Piga25
Bonjour,

J'ai un peu avancé. J'ai trouvé une façon de récupérer l'identifiant du fichier et à coller celui-ci dans une cellule.
Par contre comment faire pour ne pas avoir cette étape de manière à avoir directement le résultat
- dans le code : function envoiPDF() {,
- ligne :  const docID ='   ici    '

le code que j'ai réussi à faire:
function getUrl() {
  var app = SpreadsheetApp;
  var classeur = app.getActiveSpreadsheet();
  var feuille = classeur.getActiveSheet();
  const cellule = feuille.getRange('A1');
  const Cellule2 = feuille.getRange('A2');
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  cellule.setValue(ss.getUrl());
  var url = cellule.getValue();
  Cellule2.setValue (url.match(/[-\w]{25,}(?!.*[-\w]{25,})/).toString())
}
Merci

Re: Intégrer l'ID du fichier à partir de son URL dans un code

Publié : 19 févr. 2024 13:22
par ChristopherH
Hello Piga25 !

J'espère que tu vas bien.

Si tu as besoin de récupérer l'ID du fichier auquel ton script est rattaché (désolé si je n'ai pas compris !) tu peux utiliser tout simplement la méthode getId().

Exemple : 

let id = SpreadsheetApp.getActive().getId() 
Cela te retournera l'ID du Spreadsheet actif

Juste ici la documentation officielle de la classe Spreadsheet : https://developers.google.com/apps-scri ... heet?hl=fr

N'hésite pas à me dire si cela ne répond pas au besoin et à rajouter un max de précisions 😀

Bonne journée,

Christopher

Re: Intégrer l'ID du fichier à partir de son URL dans un code

Publié : 19 févr. 2024 13:26
par NC_Quentin
Bonjour !

Il y a une manière bien plus simple de récupérer l’ID du Spreadsheet auquel est lié un projet Apps Script. Il suffit tout simplement d’utiliser la fonction getId() de la classe Spreadsheet de SpreadsheetApp. En d’autres termes, changez votre code ainsi :

Code : Tout sélectionner

function envoiPDF() {
  DocumentApp.getActiveDocument();
  DriveApp.getFiles();
  // variables
  const doc = SpreadsheetApp.getActive();
  const docID = doc.getId();
  const feuilleID = '1108413420';

// reste du code
}

La variable doc contient déjà une instance de la classe Spreadsheet, c’est-à-dire un objet avec des règles et fonctions précises. Elle est obtenue avec SpreadsheetApp.getActive(), équivalente à SpreadsheetApp.getActiveSpreadsheet(), qui retourne, comme son nom l’indique, le classeur lié à votre projet Apps Script sous la forme de cet objet. Il ne reste plus donc qu’à utiliser getId() pour obtenir l’ID, et le tour est joué !

Attention toutefois avec feuilleID, qu’il faut probablement changer aussi. Je conseille de plutôt mettre quelque chose de cette forme :

Code : Tout sélectionner

const feuilleID = doc.getSheetByName(" NOM DE LA FEUILLE VISÉE ").getSheetId()

En mettant le nom de la feuille à exporter au bon endroit, cela permet de garder un code relativement dynamique, pour peu que le nom de la feuille soit bon.

Enfin, si vous vouliez réellement utiliser votre fonction getUrl(), il faudrait changer la fonction pour qu’elle fasse un return, et simplement appeler la fonction et stocker la valeur de retour dans la variable. Par exemple :

Code : Tout sélectionner

function getIdFromUrl(){
    // Récupère l’URL du document actif sous la forme d’une chaîne (string)
    const docUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl();

    // Récupère l’ID du document actif à l’aide d’une regex.
    // Attention ! String.prototype.match() renvoie un tableau potentiellement vide, cela peut donc entraîner une erreur en l’état.
    const ID = docUrl.match(/[-\w]{25,}(?!.*[-\w]{25,})/)[0]

    return ID;
}

function envoiPDF() {
  DocumentApp.getActiveDocument();
  DriveApp.getFiles();
  // variables
  const doc = SpreadsheetApp.getActive();

  // On appelle la fonction créée précédemment
  const docID = getIdFromUrl();
 
  // reste du code
}

 

Re: Intégrer l'ID du fichier à partir de son URL dans un code

Publié : 19 févr. 2024 15:44
par Piga25
Bonjour,
ChristopherH : Merci, je ne connaissais pas cette fonction. J'ai toujours rechercher avec le mot url, 
Je vais regarder la doc que tu me suggère.
Oui la fonction getSheetId() correspond exactement à ce que je recherche.

NC Quentin: Merci. Tes solutions sont exactement ce que je recherchais. Tu vas même plus loin avec le nom de la feuille. J'ai intégré cela à mon code final et cela fonctionne à merveille. Aucune ligne supplémentaire dans le code. 

Un grand merci à vous deux. Maintenant je vais même pouvoir fournir des copies de fichier sans modification du code d'envoi PDF.

Mon code modifié qui fonctionne: (désolé je n'ai pas trouvé la balise pour mettre les codes, j'ai pris celle de citation).
function envoiPDF() {
  DocumentApp.getActiveDocument();
  DriveApp.getFiles();
  // variables
  const doc = SpreadsheetApp.getActive();
  const docID = doc.getId();
  const feuilleID = doc.getSheetByName("Note de frais").getSheetId()
  //const email = 'Parametre!B5';
  var email = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Note de frais').getRange('E7').getValue();
  //const dossier = DriveApp.getFolderById('Déplacement');
  const d = Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd");
  const fichier = 'Déplacement' + "_" + d + ".pdf";
  const objet = "Frais de déplacement ";
  const corps = "Bonjour,<br><br>Tu trouveras en pièce jointe  .........................................................";
  // Création du fichier pdf
  const url = 'https://docs.google.com/spreadsheets/d/' + docID + '/export?';
  const exportOptions =
    'exportFormat=pdf&format=pdf' +
    //'&size=A4' +
    //'&portrait=true' +                     // orientation portrait, false pour paysage
    //'&fitw=false' +                        // pas d'ajustement en largeur
    //'&sheetnames=false&printtitle=false' + // pas de nom ni de titre à l'impression
    //'&pagenumbers=false&gridlines=false' + // pas de numérotation, pas de grille
    //'&fzr=false' +                         // frozen rows = pas de répétition de l'en-tête
    '&gid=' + feuilleID;
  var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};
  var reponse = UrlFetchApp.fetch(url + exportOptions, params).getBlob();
  // Envoi email avec fichier attaché
    GmailApp.sendEmail(email, objet, corps, {
      htmlBody: corps,  
      attachments: [{
            fileName: fichier,
            content: reponse.getBytes(),
            mimeType: "application/pdf"
        }]
    });