DPAE / Fichier TXT
Bonjour j'ai créer une application a l'aide de GoogleSheet
Des collaborateurs postules et nous décidons de qui peut travailler en fonction de horaires et de la disponibilité
Lorsque je valide les personnes leur nom prénom etc apparaissent dans un feuille
Je souhaiterais mettre un Tick dans une cellule et lorsque je clic sur "télécharger" cela génère un fichier qui permet de faire leur déclaration auprès de l'ursaff
Ce sont des personnes qui viennent travailler en extras pour arrondir leur fin de mois et aussi des étudiants qui veulent travailler
Pour ce faire j'ai vue sur le site de l'Ursaff qu'il y a ce code
comment faire pour changer les parties en noire en fonction des cellules du google sheet ?
J'ai mis en jaune les parties variantes
Merci par avance pour votre aide a tous
Bonjour,
Fichiers .zip je n'ouvre pas
Quel est ton objectif ? Avoir un fichier "base de donnée" et une page "masque" et lorsqu'un prestataire clique sur un bouton, ça imprime sa déclaration pré-remplie ?
Communiquer avec une API de l'URSSAF ? Laquelle ?
Bonjour Pierre
Merci pour ton retour
Voici le fichier
L'idée c'est que j'ai un collaborateur extras s'inscrit dans mon "sheet" via l'application que j'ai créée
Lorsque c'est fait j'aimerai soit un lien soit créer un bouton "télécharger" pour que ca génère en fichier TXT et que je n'ai plus qu'a le déposer sur le Site Urssaf pour faire leur DPAE
C'est possible sur leur site. Ainsi ca m'évite de saisir un a un toute les infos de mes "extras"
Merci a Toi pour ton aide et bonne fin de journée
Bonjour,
Fichiers .zip je n'ouvre pas
@Pierre : la grande majorité des fichiers zip ont été compressés automatiquement par le site (pour optimiser l'espace de stockage), ce n'est pas un choix de l'utilisateur.
Bonjour,
@Sébastien, d'accord mais dans le doute je préfère éviter tous fichiers .zip pour des raisons de sécurité, il est aisé de partager des fichiers de la suite Google, même en lecture.
@guillaume, c'est assez facilement réalisable, il faut mettre dans une variables les données ...variables (nom, prenom, etc...) + ensuite les insérer dans ton texte et enfin faire un export en .txt, par contre, l'usage d'image en bouton n'est pas forcément le + adapté car cela ne permet que difficilement de mapper bouton > ligne concerné, une case à cocher est + robuste.
Voici un fichier d'exemple fonctionnel : https://docs.google.com/spreadsheets/d/1A-Q2E4FbQMtzm37MNV-KBeeIcwhOumT2KmfsO9q2gTA/edit?gid=1944780...
J'ai crée 2 onglets, un paramétrage avec le modèle du fichier txt et des balises avec les éléments à mettre
Puis, dans l'onglet tableau, les données des personnes et une case à cocher au bout de chaque ligne :
Le script agit ensuite de cette manière :
1, la fonction verifCoche, comme son nom l'indique vérifie si une case est cochée/décochée en F2:F de la page tableau
function verifCoche(e) {
var sheetName = "tableau"; // nom de la feuille
var cocheColumn = 6; // colonne des cases à cocher
var startRow = 2; // ligne de départ
var sheet = e.source.getActiveSheet();
var range = e.range;
if (sheet.getName() == sheetName && range.getColumn() === cocheColumn && range.getRow() >= startRow) {
if (range.isChecked()) {
exportTxt(range.getRow());
}
}
}Et si oui, exécute la fonction exportTxt en envoyant comme argument le numéro de ligne
Dans cette seconde fonction, dans un premier temps on déclare quelques constantes :
function exportTxt(numRow){
const settingsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("paramétrage");
const boardSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("tableau");
const modelTxt = settingsSheet.getRange("A2").getValue();Puis, on map les données à récupérer : (ex, si on coche la ligne 6, le Prénom sera en B6)
var dataMap = {
"Nom":"A"+numRow,
"Prénom":"B"+numRow,
"Adresse":"C"+numRow,
"Tel":"D"+numRow,
"Référence":"E"+numRow
}On récupère toutes les données dans un values :
var values = {};
for (var key in dataMap) {
values[key] = boardSheet.getRange(dataMap[key]).getValue();
}Puis, on remplace les balises du model txt par les données réelles :
for (var key in values) {
var placeholder = "{{" + key + "}}";
modelTxt = modelTxt.replace(new RegExp(placeholder, 'g'), values[key]);
}Finalement, on créé un nom de fichier (dans cet exemple, nom + date) et on l'enregistre dans un fichier drive prédéfini :
var today = new Date();
var date = Utilities.formatDate(today, Session.getScriptTimeZone(), "dd-MM-yyyy");
var folderId = "1sB8Awm8H8sdywEN6T7pmB3e8cwPj3X-F";
var folder = DriveApp.getFolderById(folderId);
var fileName = values["Nom"] + " " + date + ".txt";
var blob = Utilities.newBlob(txtData, 'text/plain', fileName);
folder.createFile(blob);résultat :
Milles Merci Pierre
J'ai cependant une erreur TypeError: Cannot read properties of undefined (reading 'source')verifCoche@ Code.gs:5
Sur ton modele
Merci encore milles fois pour ton aide
Bonjour,
Tu as essayé d'exécuter le script manuellement, ça ne marche pas ainsi, il fonctionne comme un onEdit à chaque modification, modifie l'ID du drive dans le script, avec l'ID d'un dossier dans ton drive, puis essaye de cocher une case tu verras.
Désolé mais ca ne fonctionne pas
J'ai du faire une erreur (je suis pas doué lol)
function verifCoche(e) {
var sheetName = "tableau"; // nom de la feuille
var cocheColumn = 6; // colonne des cases à cocher
var startRow = 2; // ligne de départ
var sheet = e.source.getActiveSheet();
var range = e.range;
if (sheet.getName() == sheetName && range.getColumn() === cocheColumn && range.getRow() >= startRow) {
if (range.isChecked()) {
exportTxt(range.getRow());
}
}
}
function exportTxt(numRow){
const settingsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("paramétrage");
const boardSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("tableau");
var modelTxt = settingsSheet.getRange("A2").getValue();
var dataMap = {
"Nom":"A"+numRow,
"Prénom":"B"+numRow,
"Adresse":"C"+numRow,
"Tel":"D"+numRow,
"Référence":"E"+numRow
}
var values = {};
for (var key in dataMap) {
values[key] = boardSheet.getRange(dataMap[key]).getValue();
}
for (var key in values) {
var placeholder = "{{" + key + "}}";
modelTxt = modelTxt.replace(new RegExp(placeholder, 'g'), values[key]);
}
var today = new Date();
var date = Utilities.formatDate(today, Session.getScriptTimeZone(), "dd-MM-yyyy");
var folderId = "1lhulMpleA92jK_J6jt-n_ym6n_y8KOWJ"; //ID du fichier drive
var folder = DriveApp.getFolderById(folderId);
var fileName = values["Nom"] + " " + date + ".txt"; // nom du fichier
var blob = Utilities.newBlob(txtData, 'text/plain', fileName);
folder.createFile(blob);
}
DONE Merci a toi
Bonjour as tu fait les tests?
Merci a toi
Ça fonctionne chez moi, ré-essayez avec mon script, puis si ca fonctionne bien, adaptez le à votre fichier réel, le script est simplifié au possible, il faut définir la zone où il y a les cases à cocher dans votre feuille, donc, ces variables à modifier dans la fonction verifCoche :
var sheetName = "tableau"; // nom de la feuille
var cocheColumn = 6; // colonne des cases à cocher
var startRow = 2; // ligne de départPuis, dans exportTxt il faut changer les 2 noms de feuilles :
const settingsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("paramétrage");
const boardSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("tableau");Indiquer dans quelle cellule est le texte modèle, dans mon exemple A2 :
var modelTxt = settingsSheet.getRange("A2").getValue();Puis la liste des clés du modèles et dans quelle colonne trouver cette information :
var dataMap = {
"Nom":"A"+numRow,
"Prénom":"B"+numRow,
"Adresse":"C"+numRow,
"Tel":"D"+numRow,
"Référence":"E"+numRow
}GENIAL
MERCI TOUT FONCTIONNE A MERVEILLE
MILLES MERCIS
Bonjour Encore Merci
Pense tu qu'il soit possible d'ajouter un script qui envoie par mail le doc en Txt ?
a une mon adresse mail par exemple
L'idée est d'avoir une sauvegarde sur Drive mais que ca génère un mail automatique
Merci a toi
Bonjour,
Bien sûr c'est possible de l'envoyer par email, mais pour le coup à ta place je ferais un PDF et non pas un TXT, sinon il faut utiliser MailApp > sendMail > attachment
Merci infiniment
Le sujet c'est qu'on me le demande en XML
Peux tu m'aider sur le code ?
Merci
Salut,
Simple, déjà on va changer quelques noms pour garder la logique.
1. on vérifie à chaque modification sur le fichier si elle a eu lieu dans la plage F2:F, et si c'était une case cochée, alors on exécute exportXml avec la ligne concernée :
function verifCoche(e) {
const sheetName = "tableau"; // nom de la feuille
const cocheColumn = 6; // colonne des cases à cocher
const startRow = 2; // ligne de départ
const sheet = e.source.getActiveSheet();
const range = e.range;
if (sheet.getName() == sheetName && range.getColumn() === cocheColumn && range.getRow() >= startRow) {
if (range.isChecked()) {
exportXml(range.getRow());
}
}2. dans cette fonction, idem des modifs mineures, pour rappel, elle prend les données de la ligne cochée, les insère dans ton modèle et génère un fichier XML qui est stocké dans un dossier drive (pense à le changer), à la fin, on va lancer une nouvelle fonction sendMail(file), file étant le fichié XML généré :
function exportXml(numRow){
const settingsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("paramétrage");
const boardSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("tableau");
const modelXml = settingsSheet.getRange("A2").getValue();
var dataMap = {
"Nom":"A"+numRow,
"Prénom":"B"+numRow,
"Adresse":"C"+numRow,
"Tel":"D"+numRow,
"Référence":"E"+numRow
}
var values = {};
for (var key in dataMap) {
values[key] = boardSheet.getRange(dataMap[key]).getValue();
}
for (var key in values) {
var placeholder = "{{" + key + "}}";
modelXml = modelXml.replace(new RegExp(placeholder, 'g'), values[key]);
}
var today = new Date();
var date = Utilities.formatDate(today, Session.getScriptTimeZone(), "dd-MM-yyyy");
var folderId = "1lhulMpleA92jK_J6jt-n_ym6n_y8KOWJ"; //ID du fichier drive
var folder = DriveApp.getFolderById(folderId);
var fileName = values["Nom"] + " " + date + ".xml"; // nom du fichier
var blob = Utilities.newBlob(modelXml, 'application/xml', fileName);
var file = folder.createFile(blob);
sendMail(file);
}3. donc, cette nouvelle fonction, on envoie simplement un email en mettant le fichier précédemment généré en PJ : (change l'adresse email)
function sendMail(file) {
const to = "pierrelepinay.pro@gmail.com"; // il est aussi possible de prendre l'adresse email de manière dynamique sur le document
const subject = "Fichier XML";
const body = "Bonjour,\n\nVeuillez trouver ci-joint le fichier XML généré.";
MailApp.sendEmail({
to: to,
subject: subject,
body: body,
attachments: [file]
});
}Résultat :
Et la PJ :
J'ai bien le fichier qui ce met dans le drive mais j'ai pas le mail :-(
Merci pour ton aide tu es un génie
function verifCoche(e) {
var sheetName = "Validation"; // nom de la feuille
var cocheColumn = 20; // colonne des cases à cocher
var startRow = 3; // ligne de départ
var sheet = e.source.getActiveSheet();
var range = e.range;
if (sheet.getName() == sheetName && range.getColumn() === cocheColumn && range.getRow() >= startRow) {
if (range.isChecked()) {
exportXml(range.getRow());
}
}
}
function exportXml(numRow){
const settingsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Programme");
const boardSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Validation");
var modelTxt = settingsSheet.getRange("A2").getValue();
var dataMap = {
"Nom":"E"+numRow,
"Prénom":"F"+numRow,
"Adresse":"C"+numRow,
"Code Sexe" : "O"+numRow,
"numero secu" : "P"+numRow,
"Departement naissance" : "Q"+numRow,
"Date Birthday" : "R"+numRow,
"Ville de Naissance" : "S"+numRow,
"Date debut Contrat" : "H"+numRow,
"Heure de Debut" : "I"+numRow,
"Date de fin de Contrat" : "H"+numRow,
}
var values = {};
for (var key in dataMap) {
values[key] = boardSheet.getRange(dataMap[key]).getValue();
}
for (var key in values) {
var placeholder = "{{" + key + "}}";
modelTxt = modelTxt.replace(new RegExp(placeholder, 'g'), values[key]);
}
var today = new Date();
var date = Utilities.formatDate(today, Session.getScriptTimeZone(), "dd-MM-yyyy");
var folderId = "1lhulMpleA92jK_J6jt-n_ym6n_y8KOWJ"; //ID du fichier drive
var folder = DriveApp.getFolderById(folderId);
var fileName = values["Nom"] + " " + date + ".xml"; // nom du fichier
var blob = Utilities.newBlob(modelTxt, 'application/xml', fileName);
var file = folder.createFile(blob);
sendMail(file);
}
function sendMail(file) {
const to = "j'ai bien mis mon mail"; // il est aussi possible de prendre l'adresse email de manière dynamique sur le document
const subject = "Fichier XML DPAE";
const body = "Bonjour,\n\nVeuillez trouver ci-joint le fichier XML généré.";
MailApp.sendEmail({
to: to,
subject: subject,
body: body,
attachments: [file]
});
}Essaye d'exécuter manuellement sendMail, des autorisations supplémentaires sont à accepter.
Non mais c'est bon en fait :-)
Il fallait etre patient lol
MERCI POUR TOUT
