Glide vers Sheet vers PDF

1- oui c'est cela !

2 - non pas de question. Cet espace a été supprimé ;)

3- Pas de soucis, je peux mettre B ou Bon d'un côté ou de l'autre, c'est égal.

Merci

  1. Il me reste à régler le problème des participants multiples.
  2. Je n'ai pas reporté les données dans "reprise appli", cela ne sert pas.
  3. Je n'ai pas effacé pour le moment la ligne dans le fichier source.
  4. Il faudra régler les timezones correctement dans la feuille et dans le script (clique à gauche sur l'engrenage dans l'éditeur de script).
  5. Il faut activer le service Google Sheets API (clique à gauche dan services)
  6. Il faut indiquer l'id du fichier de destination et l'id du dossier de stockage des pdf.
  7. Le script dans le fichier de destination ne sert plus.

=>

Dans le fichier source

// ajouter service Google Sheets API

const folderID = 'mettre l id du dossier'
const idDest = 'mettre id du fichier permettant l edition des pdf'

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

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) => {
    ranges.push(`'${destination}'!${c}`)
    values.push(`${source.getRange(row, +i + 2).getValue()}`)                // 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 = 'Fiche journalière de fonctionnement '+ Utilities.formatDate(new Date(source.getRange('B'+row).getValue()), Session.getScriptTimeZone(), "dd/MM/yyyy hh:mm")  + '.pdf'
  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(), "dd/MM/yyyy hh:mm"),file.getId(),file.getUrl(),file.getName()])

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

}

J'oublie le plus important ... ajouter une feuille paramètres dans ton fichier source qui contient l'adresse des cellules du fichier de destination

https://docs.google.com/spreadsheets/d/1ksLf1RBY7P_iEbwl8PQiuus28-z6Z7T6ssfHJF78wmg/copy

Qu'appelles-tu les timezones ?

La feuille Paramètre est créée. Le service API activé.

Dans le fichier destination, le script ne sert plus, même pas pour le GED ? c'était bien pratique :)

j'ai tout remis dans le fichier source

les timezones : regarde dans ton fichier

  • dans la feuille : fichier > paramètres
  • dans l'éditeur de script > clique sur l'engrenage à gauche

il faut que ce soit pareil

Dans le fichier : j'ai GMT +1 Paris;

Dans Script j'ai GMT +2 Paris.

Mais impossible de trouver les 2 identiques ^^

mais cela fonctionnera quand même je pense car dans la feuille il tient compte d el'heure d'été

je pense avoir trouvé la solution pour les différentes personnes, je suis pris, je t'en parlerai ce soir ou demain, sachant que tu rencontreras peut-être aussi des problèmes lors de tes essais

pour tenir compte de la liste des participants

changer B12 en B12:B17 dans l'onglet paramètres ligne 7

// ajouter service Google Sheets API

const folderID = 'l id du dossier de stockage des pdf'
const idDest = 'id du fichier qui sert à réaliser les fiches en pdf'

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

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).getValue().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).getValue()}`)                // 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 = 'Fiche journalière de fonctionnement ' + Utilities.formatDate(new Date(source.getRange('B' + row).getValue()), Session.getScriptTimeZone(), "dd/MM/yyyy hh:mm") + '.pdf'
  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(), "dd/MM/yyyy hh:mm"), file.getId(), file.getUrl(), file.getName()])

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

}

Bonjour Steelson,

Merci pour le code. Ca m'indique bien "script terminé" mais rien ne se passe, ni dans le fichier source, ni dans le fichier destination, ni dans le dossier PDF.

regarde si la case en A1 est cochée, il faut qu'elle soit décochée

A1 est bien coché, mais rien de plus.

image

désolé, je me suis exprimé trop rapidement

en colonne A du fichier source tu avais des cases à cocher que je ne vois plus, il faut les remettre sur chaque ligne et faire en sorte qu'elles ne soient pas cochées

Ah oui en effet ça fonctionne très bien :) :)

Juste 2 soucis :

- la partie sur les noms à cocher qui ne se remplit pas.

- le contrôle qui vient en cellule B42 au lieu de 46 alors que c'est bien B46 dans la fiche paramètre.

Je peux supprimer le script du fichier de destination du coup ?

j'avais bien B42 dans la fiche paramètre, change si nécessaire, tu as normalement la main

image

pour les checkboxes, je m'y attendais, mais c'est compliqué, est-ce vraiment nécessaire dans la mesure où il y a les noms issus de la form ?

tu peux supprimer le script, mais aussi l'autre feuille reprise appli

On va laisser comme le contrôleur, la liste sans case à cocher ça sera en effet plus simple

Ca fonctionne parfaitement sans les croix à cocher pour les personnes présentes. J'ai repris le modèle du contrôleur.

Juste une dernière question. Est-ce possible, de modifier le format de C5 et C6 (heures d'ouverture et de fermeture) pour n'afficher que "09:00" au lieu de "Tue Jun 28 2022 09:00:00 GMT+0200 (heure d’été d’Europe centrale)" ?

Et pour la date n'afficher que la date et pas "Tue Jun 28 2022 00:00:00 GMT+0200 (heure d’été d’Europe centrale)" ?

Pour la suppression de la ligne, je peux le faire manuellement, ça pose pas de soucis ?

Merci Steelson !!!

Juste une dernière question. Est-ce possible, de modifier le format de C5 et C6 (heures d'ouverture et de fermeture) pour n'afficher que "09:00" au lieu de "Tue Jun 28 2022 09:00:00 GMT+0200 (heure d’été d’Europe centrale)" ?

Et pour la date n'afficher que la date et pas "Tue Jun 28 2022 00:00:00 GMT+0200 (heure d’été d’Europe centrale)" ?

Il suffit -je pense- que tu mettes le bon format dans les cases ! Le script n'a rien à voir avec cela.

Malheureusement le changement de format ne change rien :/

Peut-être peut-on, dans le script, imposer le format ?

Par ailleurs, peut-on faire ajouter une case en colonne A automatiquement, dès qu'une ligne s'ajoute ?

ok, je regarde ce soir ...

Rechercher des sujets similaires à "glide sheet pdf"