Ouverture sur un onglet spécifique en fonction du jour

Bonjour,
Je dispose d’un fichier Excel qui sert d’afficheur de planning hebdomadaire avec 6 feuilles (du lundi au samedi) pour un établissement scolaire.
Nous avons décidé de passer sur google sheets pour diverses raisons.
Jusqu’alors je m’étais débrouillé pour rechercher et adapter les macros VBA à nos besoins et contraintes.
Mais je n’ai toujours pas trouvé d’équivalent ou de correspondance avec ce que nous souhaitons faire.
De plus je ne suis malheureusement pas assez compétent dans la transcription VBA vers sheets…je viens donc faire appel à vos lumières
Nous souhaitons donc :
- pouvoir faire afficher la feuille du jour en fonction du jour à lors de l'ouverture du classeur
- à chaque modification d’une cellule dans une des feuilles du classeur, enregistrement auto de la feuille concerné par la modification en pdf.
Ci-joint le partage fichier avec le code VBA.

https://docs.google.com/spreadsheets/d/1hFsBadzGhJyKALrDxXaL7-nqcJbGu5cs/edit?usp=sharing&ouid=10354...

Ouverture sur la feuille du jour (Lundi/mardi/…../samedi)

Private Sub Workbook_Open()
Dim NomFeuille As String, F As Worksheet

On Error Resume Next
NomFeuille = Format(Date, "dddd")
Set F = Worksheets(NomFeuille)

If Err <> 0 Then
Err = 0
MsgBox "Il n'y a pas une feuille " & _
"nommée """ & NomFeuille & """ dans ce " & _
"classeur.", vbCritical + vbOKOnly, "Attention"

Else
Sheets(NomFeuille).Select
End If

End Sub

Enregistrement auto de la feuille à chaque changement/modif dans une cellule de cette feuille

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\attachelabo\Desktop\LABO\Planning - Afficheur\lundi.pdf", Quality:=xlQualityStandard, IncludeDocProperties _
:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

Application.EnableEvents = True

End Sub

En vous remerciant par avance.

Bonjour, et bienvenue

D'abord, enregistre ton fichier au format GSheets Fichier > Enregistrer au format Google Sheets

- pouvoir faire afficher la feuille du jour en fonction du jour à lors de l'ouverture du classeur

Fais ... Extensions > App script

Puis remplace ce qui est proposé par

function onOpen() {
  var d = new Date()
  var tabJours = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"]
  var jour = tabJours[d.getDay()]
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName(jour).activate()
}

Enregistre

image

Ferme et rouvre ... tu peux avoir un petit temps d'attente car GSheets, contrairement à Excel effectué les scripts ("macros") sur le serveur et non sur ton PC

Pour ceci

- à chaque modification d’une cellule dans une des feuilles du classeur, enregistrement auto de la feuille concerné par la modification en pdf.

si tu n'es pas encore familier de GSheets, il faut savoir que Google est très à cheval sur la sécurité (étant donné qu'avant tout GSheets est un outil collaboratif), donc

- GSheets n'a pas accès à ton PC, les enregistrements se font sur le drive

- je te conseille de créer un dossier, mais quel que soit le nom (tu peux avoir plusieurs dossiers du même nom, plusieurs fichiers du même nom aussi), ce qui est important c'est relever l'ID du dossier comme ici

image

- ensuite, certaines fonctions requièrent une autorisation de ta part, ce sera justement le cas ici en enregistrant sur ton drive, j'ai ajouté un menu pour que tu puisses donner les autorisations (pas de crainte, c'est classique)

- et enfin, la fonction onEdit qui se déclenche seule, requiert ici aussi que tu définisses un déclencheur spécique en sélectionnant l'horloge à gauche

image

et en mettant ces paramètres

image

le script complet est le suivant (remplace ######### par l'identifiant de ton dossier)

voir ci-dessous

Bonjour,

J'étais un peu pris par le temps cette semaine et je n'ai pu tester que ce week-end!
Que dire...quelle réactivité et quelle efficacité! Un grand merci pour cette aide.
Tout fonctionne parfaitement!!

J'aurais souhaité pour parfaire ma demande savoir s'il était possible lors de la sauvegarde en pdf, d'écraser le fichier précédemment sauvegardé ? et également optimiser l'espace du pdf sur le format choisi(A4)?
J'ai tenté de "bricoler" un peu le code....j'ai réussi à modifier le nom d'enregistrement afin de ne garder que le nom du jour de sauvegarde ("lundi.pdf"), mais à chaque modif de cellule, il crée un autre fichier du même nom sans écraser le précédent.
J'ai également fait quelques recherches infructueuses sur la mise en page du pdf enregistré, mais cela reste encore un peu compliqué pour moi. Je n'arrive pas à diminuer les marges, optimiser la pagination afin que le pdf occupe le maximum d'espace.

Encore merci Steelson.

Ok pour supprimer les anciens fichiers du même nom, je regarderai.

Pour la mise en forme, je ne sais pas du tout.

MAIS, pourquoi veux-tu toujours avoir une copie pdf du document ? surtout si c'est le dernier cri. Car tu peux toujours retrouver le document via un simple lien, par exemple :

https://docs.google.com/spreadsheets/d/1hFsBadzGhJyKALrDxXaL7-nqcJbGu5cs/gviz/tq?tqx=out:html&sheet=...

ou un lien pdf mais il faudrait sans doute avoir un vrai fichier GSheets et non un fichier importé xlsx non enregistré en GSheets

On peut aussi céer une application html pour avoir une meilleure mise en forme. Ce sont justement des outils simples qu'on n'a pas avec excel.

Enfin, si tu veux tracer les évolutions (mais cela ne semble pas le cas car tu effaces les anciens) on pourrait mettre un espion.

Bonjour,
Je vais préciser l'utilisation, ce sera en effet un fichier Gsheets qui sera utilisé.
https://docs.google.com/spreadsheets/d/1fcvfnr3_20e3WQxiP7hTRtqqyMl9UWCGKlSa-ra1wC4/edit?usp=sharing

La sauvegarde en local d'un pdf ou d'un html serait utilisé pour pouvoir continuer d'afficher le planning du jour en cas de défaillance du réseau...(ce qui arrive relativement régulièrement....)
Et si une application html permet d'avoir une meilleure mise en forme alors je suis effectivement intéressé!

Par curiosité, qu'est-ce que le tracé des évolutions, à quoi cela peut-il servir?

Merci par avance.

La sauvegarde en local d'un pdf ou d'un html serait utilisé pour pouvoir continuer d'afficher le planning du jour en cas de défaillance du réseau...(ce qui arrive relativement régulièrement....)

Merci pour cette précision, cela change beaucoup de choses car si c'est pour prévenir des défaillances de réseau et l'avoir en local ce sera un code différent. Donc on est bien d'accord qu'il ne s'agit pas de l'avoir sur drive du coup. Mais là, je pense que c'est trop lourd à réaliser à chaque modification.

De toute façon, je te ferai 2 choses

  • une sauvegarde sur drive avec suppression des anciens fichiers
  • une sauvegarde à la demande sur PC

Par curiosité, qu'est-ce que le tracé des évolutions, à quoi cela peut-il servir?

Comme je ne connaissais pas le but, j'imaginais qu'il s'agissait de mémoriser toutes les actions sur le fichier (ce qui aurait été possible de faire dans un fichier texte à part mémorisant quelle cellule était modifiée et à quelle heure).

J'aurais souhaité pour parfaire ma demande savoir s'il était possible lors de la sauvegarde en pdf, d'écraser le fichier précédemment sauvegardé ?

essaie de cette façon, j'ai ajouté une instruction

supprimerFichier(fichier,folderId)

avec une fonction (on ne supprime pas le fichier, il est mis dans la corbeille et un autre est recréé)

function savePDF(){
  const folderID = '############################';
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getActiveSheet();
  const fichier = sh.getName() +".pdf"
  supprimerFichier(fichier,folderId)
  const url = 'https://docs.google.com/spreadsheets/d/' + ss.getId() + '/export?';
  const exportOptions =
    'exportFormat=pdf&format=pdf' + 
    '&size=A4' + 
    '&portrait=false' +                     
    '&fitw=true' +                        
    '&sheetnames=false&printtitle=false' + 
    '&pagenumbers=false&gridlines=false' + 
    '&fzr=false' +
    '&gid=' + sh.getSheetId();
  var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};
  var response = UrlFetchApp.fetch(url + exportOptions, params).getBlob();
  DriveApp.getFolderById(folderID).createFile(response.setName(fichier));
  SpreadsheetApp.getActive().toast('Sauvegarde effectuée !')
}
function supprimerFichier(fileName,folderId) {
  var files = DriveApp.getFolderById(folderId).getFiles();
  while (files.hasNext()) {
    var file = files.next();
    if (file.getName() == fileName) {
      file.setTrashed(true);
    }
  }
}

Pour une sauvegarde local, tu peux ajouter

function onOpen() {
  var d = new Date()
  var tabJours = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"]
  var jour = tabJours[d.getDay()]
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName(jour).activate()
    SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 Autoriser ...', 'autoriser')
    .addItem('👉 Editer en local (pdf) ...', 'savePDFonComputer')
    .addToUi();
}

puis

function savePDFonComputer() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getActiveSheet()
  const type = 'pdf'
  const mimeTypes = { pdf: MimeType.PDF };
  const name = sh.getName() + '.pdf'
  const url = "https://docs.google.com/a/mydomain.org/spreadsheets/d/" + ss.getId() + "/export?exportFormat=pdf&gid=" + sh.getSheetId() + "&access_token=" + ScriptApp.getOAuthToken();
  const blob = UrlFetchApp.fetch(url).getBlob().setName(name);
    const infoHtml = {
    data: `data:${mimeTypes[type]};base64,` + Utilities.base64Encode(blob.getBytes()),
    filename: `${name}`,
  };
  const html = HtmlService.createHtmlOutput(`<a href="${infoHtml.data}" download="${infoHtml.filename}">${infoHtml.filename}</a>`)
    .setWidth(420).setHeight(100);
  SpreadsheetApp.getUi().showModalDialog(html, "Cliquer pour télécharger le fichier ...")
}

Bonjour,
La fonction et l'instruction ajoutés fonctionnent parfaitement! La sauvegarde ne crée plus une suite de fichiers ( lundi, lundi(1), lundi(2)...)

La sauvegarde en local fonctionne aussi, j'ai rajouté "/export?exportFormat=pdf="&portrait=false&gid=" ça a fonctionné, le pdf est enregistré en mode paysage.
Mais elle crée aussi une suite de fichier, j'ai tenté de réutiliser l'instruction supprimerFichier en essayant de modifier la fonction mais sans succès.

Concernant la mise en forme, tu écrivais qu'une application html serait sûrement plus adapté pour optimiser l'affichage. Je suis tenté de te demander s'il est possible alors d'enregistrer la feuille en html (à chaque changement dans une cellule) pour pouvoir modifier ensuite la mise en page?

Encore une fois merci!

Mais elle crée aussi une suite de fichier, j'ai tenté de réutiliser l'instruction supprimerFichier en essayant de modifier la fonction mais sans succès.

en effet, pas possible en script car google ne peut pas dialoguer avec ton PC, c'est le cas général en html, du reste il faut que tu demandes à le télécharger, et c'est idem pour tout téléchargement, le PC acceptera le nouveau fichier en lui accolant un indice

Concernant la mise en forme, tu écrivais qu'une application html serait sûrement plus adapté pour optimiser l'affichage. Je suis tenté de te demander s'il est possible alors d'enregistrer la feuille en html (à chaque changement dans une cellule) pour pouvoir modifier ensuite la mise en page?

non, en fait le html dont je parlais fonctionne sur la base du fichier GSheets mais si la connexion n'est plus dispo ce ne sera donc pas une solution !

Bonjour,
Ok, je me doutais que cela serait probablement impossible.

Juste un léger dysfonctionnement concernant la fonction supprimerfichier et le renommage du pdf (dont je pourrais m’accommoder si il n'existait pas de solution)

Je ne m'en étais pas aperçu de suite, mais cela arrive lors de modifications successives.
Cela nomme normalement le fichier lundi.pdf lors de la modif 1 puis lundi(1).pdf lors de la modification 2 , puis lundi.pdf à la modif 3....etc.

Encore un grand Merci pour cette aide et le temps passé!

Rechercher des sujets similaires à "ouverture onglet specifique fonction jour"