Aide pour macros ou script
bonjour à tous,
je me suis fait bien aidé la semaine dernière pour une recherche de solution dans Excel. Je m'aperçois aujourd'hui qu'il sera plus facile pour moi d'utiliser google sheet d'une part, et mon idée a évolué depuis.
Je viens donc chercher un peu d'aide ici.
J'ai mis en pièce jointe mon fichier (précision : je ne suis pas très compétent dans les tableurs, pas mauvais mais pas expérimenté non plus
Mes besoins sont les suivants :
- J'ai créé deux "boutons", un qui concerne la température de frigos, le second le changement d'huile de friteuse. J'aimerais lorsque je clique sur ces boutons que la date et le l'heure se mettent dans les onglets qui suivent (j'ai mis un onglet pour chaque bouton). Je sais que la fonction =now() correspond mais je ne sais comment faire en sorte que cela s'inscrive sur les onglets, ligne après ligne.
- dans le forum Excel, deux personnes m'ont bien aidé pour mon deuxième problème. Je l'ai retranscrit dans ce fichier mais j'ai une modification à apporter. Dans la première colonne, je vais avoir une liste de produits alimentaires. L'idée est que lorsque je clique sur le nom du produit, une étiquette s'imprime avec dessus, le nom du produit, la date du jour (today())et une DLC (today()+3), DLC qui varie en fonction des produits.
A partir de là, mes compétences mes ont plus suffisantes. Quelqu'un pourrait-il m'aider ?
Merci beaucoup
Comme j'aime bien essayer de chercher et de comprendre, j'ai trouvé un début de script pour actionner mes boutons que j'ai légèrement modifié. Le voici :
function horodatage(){
const feuille = SpreadsheetApp.getActiveSheet()
const cellule = feuille.getActiveCell()
const horodatage = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd-MM-YYYY HH:mm') feuille.getRange(cellule.getRow(), cellule.getColumn()).setValue(horodatage)
}
Cependant, je n'arrive pas à trouver les "objets" (si c'est bien ça le nom) pour que ma date se mette sur la feuille que je veux (la feuille 'huile' par exemple) et que la date se mette sur une ligne différente à chaque fois (celle du dessous la précédente).
Je crois comprendre que c'est getActiveSheet() qui doit être modifié (et les autres) mais comment ?
Merci d'avance
Je viens de trouver pour afficher la date sur une autre feuille :
const feuille = SpreadsheetApp.getActive().getSheetByName('huile');
Bonjour,
Cependant, je n'arrive pas à trouver les "objets" (si c'est bien ça le nom) pour que ma date se mette sur la feuille que je veux (la feuille 'huile' par exemple) et que la date se mette sur une ligne différente à chaque fois (celle du dessous la précédente).
Tu as un exemple dans le cours Apps Script du site, regarde la dernière partie de cette page où tu as un exemple de code pour insérer des lignes dans une autre feuille à la suite :
https://sheets-pratique.com/fr/apps-script/modifier-cellules
Merci beaucoup !
Je viens de passer du temps dessus et j'ai réussi mon premier problème.
En revanche, je ne sais pas du tout pour le 2nd problème :
Dans la première colonne, je vais avoir une liste de produits alimentaires. L'idée est que lorsque je clique sur le nom du produit, une étiquette s'imprime avec dessus, le nom du produit, la date du jour (today())et une DLC (today()+3), DLC qui varie en fonction des produits.
Quelqu'un pourrait-il m'aider ?
Merci
Dans la première colonne, je vais avoir une liste de produits alimentaires. L'idée est que lorsque je clique sur le nom du produit, ...
Tu ne peux pas déclencher une action juste en cliquant sur une cellule si c'était ton idée ... Une solution assez simple dans ce cas est d'ajouter une colonne avec des cases à cocher et de déclencher une action à l'aide de onEdit lorsque la case est cochée (ce qui modifie la cellule et déclenche onEdit), voir cet exemple.
Note quand même qu'avec une fenêtre personnalisée il est possible de déclencher une action au clic sur un produit (et bien plus encore), en revanche c'est plus complexe à mettre en place.
Bonjour Sébastien
Merci beaucoup pour ton aide !
J'avance au fur et à mesure en fonction de ce que tu me dis.
Je suis arrivé au fichier ci-dessous qui est maintenant pratiquement fini.
je suis bloqué puisque la finalité de tout ceci est de pouvoir imprimer une étiquette (sachant que j'aimerais mettre l'affichage en plein écran afin qu'il n'y ait pas les barres d'outils et menus du haut pour éviter des mauvaises manip de la part des utilisateurs).
Mon besoin premier est que lorsque la personne clique sur le bouton que j'ai créé, les cellules en transparence du bouton s'impriment.
Actuellement, si je clique sur le bouton, les cellules se sélectionnent.
Penses-tu pouvoir m'aider avec le fichier que je te propose d'une de ces trois façons :
-avec une fenêtre personnalisée
- avec onEdit si c'est possible de déclencher plusieurs actions lorsque le mot du menu déroulant est sélectionné (actions de sélectionner les trois cellules sous le bouton et action d'imprimer)
- en créant un bouton imprimer qui permet d'afficher la page d'impression
Encore merci
Avant tout, dans le forum Google Sheets, tu devrais partager un fichier Google Sheets, c'est plus pratique (et ça évite de perdre tout le code Apps Script)
Note que si tu utilises des boutons, tu n'as pas besoin de onEdit, tu peux déclencher une macro au clic sur les boutons.
Jusque-là je t'ai donné quelques pistes, par contre je ne vais pas avoir le temps de faire le job à ta place, je vais donc laisser la main aux autres membres qui le souhaitent
Merci Sébastien.
Je suis désolé, le but n'est pas de le faire à ma place mais en même temps, il est parfois plus long pour des experts comme vous de donner des pistes que de le faire. Sachant que là je bloque même avec les pistes.
Voici le lien (je n'avais pas pensé le partager comme ça :( ) : https://docs.google.com/spreadsheets/d/1xRCzIAVsUGytTRSOLaP0hRW0TOf6QYm-31YwkjVi7Iw/edit?usp=sharing
J'ai essayé de faire une macro au clic du bouton mais je n'ai pas réussi à faire apparaître une page d'impression (j'ai pas l'impression que ce soit possible ?)
Merci d'avance à tous les autres pour votre aide.
Bonjour à tous,
je fais remonter un peu le sujet car j'ai besoin d'une petite aide
voici le fichier : https://docs.google.com/spreadsheets/d/1DCuzPj965V3weWirNUcUTzvv91I2QEctQ3GgeI-NbSU/edit?usp=sharing
J'ai bien avancé dans mes idées
Je suis arrivé - je pense - au bout de mon projet à un détail près.
Mon plus gros souci consiste (consistait) à imprimer sur des étiquettes le résultat des cases grises orange et verte.
Je vais utiliser un chromebook qui se plie à 180 ° pour m'en servir comme tablette.
Mes deux derniers soucis sont :
-lorsque je clique sur un bouton imprimer que j'ai crée, il ouvre un pdf pleine page. J'aurais souhaité que le pdf se ferme après l'impression (ou alors qu'il s'affiche plus petit pour revenir plus facilement sur mon fichier Googlesheet). Est-ce possible ? Actuellement, je n'ai même pas la croix pour fermer la page. Je suis obligé de faire un glissé avec le doigt pour la diminuer et pouvoir revenir sur mon fichier google). Je ne sais pas si je suis clair
- mon deuxième souci est mis de côté pour le moment. Ce sera la configuration de l'étiquette pour que cela s'imprime correctement. Je reçois l'imprimante demain.
D'avance un grand merci !
Bonjour,
Pour lancer directement la page d'impression, sans passer par la prévisualisation Sheets, créé un nouveau script print.html avec ceci à l'intérieur :
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<script>
window.open('<?=url?>', '_blank', 'width=800, height=600');
google.script.host.close();
</script>
</body>
</html>Et dans ton script GAS, appelle ton impression, voici un exemple d'un fichier concret, :
var PRINT_OPTIONS = {
'size': 7, // 0=letter, 1=tabloid, 2=Legal, 3=statement, 4=executive, 5=folio, 6=A3, 7=A4, 8=A5, 9=B4, 10=B
'fzr': false, // row headers
'portrait': true, // false=landscape
'fitw': true, // fit window or actual size
'gridlines': false, // show gridlines
'printtitle': false,
'sheetnames': false,
'pagenum': 'UNDEFINED', // CENTER = show page numbers / UNDEFINED = do not show
'attachment': false // L-O-G-I-C
}
var PDF_OPTS = objectToQueryString(PRINT_OPTIONS);
function printSelectedRange() {
SpreadsheetApp.flush();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getRange("A4:H35");
var gid = sheet.getSheetId();
var printRange = objectToQueryString({
'c1': range.getColumn() - 1,
'r1': range.getRow() - 1,
'c2': range.getColumn() + range.getWidth() - 1,
'r2': range.getRow() + range.getHeight() - 1
});
var url = ss.getUrl().replace(/edit$/, '') + 'export?format=pdf' + PDF_OPTS + printRange + "&gid=" + gid;
var htmlTemplate = HtmlService.createTemplateFromFile('print');
htmlTemplate.url = url;
SpreadsheetApp.getUi().showModalDialog(htmlTemplate.evaluate().setHeight(10).setWidth(100), "Ouverture de l'impression");
}
function objectToQueryString(obj) {
return Object.keys(obj).map(function(key) {
return Utilities.formatString('&%s=%s', key, obj[key]);
}).join('');
}Merci Pierre, c'est ce que j'avais trouvé en cherchant.
En fait, ma question est plutôt (ou une des solutions que je cherche) : est ce que je peux faire fermer la fenêtre d'impression après un délai (par exemple 5 secondes) ou bien la faire fermer après avoir lancé l'impression ?
Tu veux directement imprimer, sans passer par la fenêtre ? C'est possible, avec un serveur node.
Merci Pierre. je viens de regarder un peu mais là c'est bien trop complexe pour moi.
Je viens de recevoir mon imprimante d'étiquette (pour info VEVOR Y468BT.
Je viens de faire le test et il me reste un dernier souci : régler la page d'impression.
Mes étiquettes font 5cm de large sur 2,5cm, 3x2" en pouce
Lorsque j'imprime, j'ai une bande de 6-7 étiquettes qui sortent, la mienne - mal centrée- et 5-6 blanches.
Actuellement, dans le script, j'ai ceci :
var PRINT_OPTIONS = {
'size': 7, // paper size. 0=letter, 1=tabloid, 2=Legal, 3=statement, 4=executive, 5=folio, 6=A3, 7=A4, 8=A5, 9=B4, 10=B
'fzr': false, // repeat row headers
'portrait': true, // false=landscape
'fitw': true, // fit window or actual size
'gridlines': false, // show gridlines
'printtitle': false,
'sheetnames': false,
'pagenum': 'UNDEFINED', // CENTER = show page numbers / UNDEFINED = do not show
'attachment': false
}
Comment puis-je paramétrer ces valeurs pour arriver à sortir une étiquette ?
Je suppose que c'est 'size' mais après ?
Encore merci.
Lis le mode d'emploi, en esperant que tu puisses tout commander avec des commandes simplement, bon courage.
Je suis au bout du rouleau.
Je me demande si nous n'avons pas fait tout cela inutilement.
Je viens de passer trois heures dessus. J'ai imprimé des dizaines d'étiquettes.
J'ai connecté l'imprimante au chromebook qui doit servir. Il n'y a pas beaucoup de paramètres possibles avec lesquels "jouer", juste 2 :
- J'ai un menu déroulant avec la taille du papier avec une quarantaine de choix. A part A4 et letter, tous les autres sont iso _...x... inch (sachant que mes étiquettes sont 2x1 environ).
- j'ai ensuite une mise à l'échelle.
J'ai quasiment tout essayé. Le seul réglage de papier pour avoir une seule étiquette qui sort est 2x1. Mais ensuite, je n'ai qu'une mise à l'échelle où les données apparaissent toutes à l'impression, c'est 28 % . Mais cela occupe que la moitié de l'étiquette. C'est trop petit.
En fait j'ai l'impression que la partie droite de l'étiquette est comme une marge...
Bref. Si personne ne peut m'aider, je serai obligé d'abandonner. Je me laisse 48h avant de retourner l'imprimante.
Encore merci pour ceux qui auront des solutions..
Essayes ça :
var PRINT_OPTIONS = {
'size': 0,
'fzr': false,
'portrait': true,
'fitw': true,
'gridlines': false,
'printtitle': false,
'sheetnames': false,
'pagenum': 'UNDEFINED',
'attachment': false,
'pageSize': {
'width': 6,
'height': 4
},
'orientation': 'landscape'
};Merci Pierre,
J'ai essayé mais :
1- il y a une erreur dans
'pageSize': {
'width': 6,
'height': 4
},
Du coup j'ai juste mis
'width': 6,
'height': 4,
Mais ce ne change rien
2-je me rends Compte que dans cette partie du script, je peux changer et lettre n'importe quoi, cela n'a aucune influence sur le document pdf qui sort. J'ai mis par exemple 'size' : 6 (qui correspond à A3), l'impression en sortie est la même que pour du letter ou du A4
En vérifiant l'adresse du pdf qui s'ouvre, je m'aperçois qu'effectivement la taille du papier ne change pas, que je mette O (letter) ou 6(A3),...
Je me dis que le problème vient peut-être de là du coup ? Par ce que je n'arrive pas à faire coïncider ma t aille d'étiquette à la taille du pdf.
Et j'ai beau changer tous les paramètres à ma disposition, je n'arrive à rien.
Je suis désolé de répondre à moi-même
Plutôt que de faire appel à une fonction dans URL comme ça :
var url = ss.getUrl().replace(/edit$/, '') + 'export?format=pdf' + PDF_OPTS + printRange + "&gid=" + gid;
avec PDF_OPTS
avec
var PDF_OPTS = objectToQueryString(PRINT_OPTIONS);
et var PRINT_OPTIONS = { 'size': 6, 'fzr': false,.....
Je mets directement :
var url = ss.getUrl().replace(/edit$/, '') + 'export?format=pdf'+"&size=0&fzr=false&portrait=false&fitw=true&gridlines=false&printtitle=false&sheetnames=false&pagenum=UNDEFINED&attachment=false&weight=3&height=2&" + printRange + "&gid=" + gid;
Et là mon pdf s'affiche avec les bons paramètres (pourquoi cela ne marche pas dans l'autre cas ?)
Ensuite, ca commence à s'afficher mieux en mode portrait=false.
L'idéal serait que je puisse mettre dans Size autre chose que letter ou A4 ou A5... mais mes vraies dimensions.