abracadabraPDF › Forums › PDF – Général › Champs adresses remplis après sélection nom dans liste
Étiqueté : jointe Excel
- Ce sujet contient 32 réponses, 4 participants et a été mis à jour pour la dernière fois par bebarth, le il y a 1 année et 1 mois.
-
CréateurSujet
-
9 novembre 2023 à 20:28 #73421ced2001Participant
Bonjour, je souhaiterais modifier un formulaire PDF avec des champs Adresse, NPA, Ville, Tel, Mail, … Se remplissent automatiquement en fonction d’un nom sélectionné dans un champ liste.
Idéalement les données seraient stockées dans un fichier Exel, CVS, joint au formulaire et caché ou directement dans un script.
Merci d’avance pour votre aide
-
CréateurSujet
-
AuteurRéponses
-
9 novembre 2023 à 22:41 #73422bebarthMaître des clés
bonsoir,
Le sujet a déjà été traité plusieurs fois, dont :
et ci-joint le script associé :
// Importation de l'unique pièce jointe sans la nommer
var pj=this.getDataObject(this.dataObjects[0].name);
var fichier=this.getDataObjectContents(pj.name);
var donnees=util.stringFromStream(fichier);
// Suppression du fichier
this.removeDataObject(pj.name);
// Suppression du champ "script"
this.removeField("script");
// Séparation des lignes de la feuille de calcul (saut de ligne)
var lignes=donnees.split("\r\n");
// Séparation des cellules de chaque ligne de la feuille de calcul (TAB)
cellules=new Array();
for (var i=1; i<lignes.length; i++) {
// i est le numéro de la ligne et on commence par la deuxième ligne : i=1
cellules=lignes.split(";");
this.getField("Nom").value=cellules[0]; // Cellule 0 de la ligne i, donc Nom
this.getField("Prenom").value=cellules[1]; // Cellule 1 de la ligne i, donc Prénom
this.getField("Adresse").value=cellules[2]; // etc.
this.getField("Telephone").value=cellules[3];
this.getField("e-mail").value=cellules[4];
var nomFichier="Fichier "+cellules[0]+" "+cellules[1]+".pdf";
if (i!=lignes.length-1) this.saveAs({cPath: nomFichier,bCopy: true});
else this.saveAs({cPath: nomFichier});
}
…et le fichier en pièce jointe.
@+
Attachments:
You must be logged in to view attached files.10 novembre 2023 à 15:59 #73435ced2001ParticipantBonjour
Merci pour votre réponse.
Je pense que je n’ai pas bien expliqué se que j’aimerais…
J’ai un formulaire type contrat à compléter et une dizaine d’adresse revienne régulièrement
je souhaite joindre un XLSX,CVS ou autre base de donnée comme Access qui contient les nom, adresse, N°, ….
Dans mon formulaire un champ liste déroulante permet de choisir le nom et j’aimerais que les autre champs texte se remplisse lors de la sélection, lâché de souris ou sortie du champ….
Je ne suis vraiment pas expert mais voici les script que j’ai essayé de faire fonctionner :
var excelFilePath = “/chemin/fichier.xlsx”; //
var selectedName = this.getField(“nomMenuDeroulant”).value;
var excelData = app.Excel.importDataObjects(excelFilePath);for (var i = 0; i < excelData.length; i++) {
if (excelData[“11 Nom_2”] === selectedName) {
this.getField(“12 Adresse_2”).value = excelData[“12 Adresse_2”];
this.getField(“13 NPA_2”).value = excelData[“13 NPA_2”];
this.getField(“14 Ville_2”).value = excelData[“14 Ville_2”];
this.getField(“15 Téléphone_2”).value = excelData[“15 Téléphone_2”];
this.getField(“16 E-Mail_2”).value = excelData[“16 E-Mail_2”];
break;
}
}Y compris en adaptant le votre
// Importation de l’unique pièce jointe sans la nommer
var pj = this.getDataObject(this.dataObjects[0].name);
var fichier = this.getDataObjectContents(pj.name);
var donnees = util.stringFromStream(fichier);// Séparation des lignes de la feuille de calcul (saut de ligne)
var lignes = donnees.split(“\r\n”);// Séparation des cellules de chaque ligne de la feuille de calcul (TAB)
cellules = new Array();
for (var i = 1; i < lignes.length; i++) {
// i est le numéro de la ligne et on commence par la deuxième ligne : i=1
cellules = lignes.split(“;”);// Si le nom dans la cellule correspond au choix dans le champ “11 Nom_2”
if (this.getField(“11 Nom_2”).value === cellules[0]) {
// Remplir les champs du formulaire
this.getField(“12 Adresse_2”).value = cellules[1]; // Adresse
this.getField(“13 NPA_2”).value = cellules[2]; // NPA
this.getField(“14 Ville_2”).value = cellules[3]; // Ville
this.getField(“15 Téléphone_2”).value = cellules[4]; // Téléphone
this.getField(“16 EMail_2”).value = cellules[5]; // EMail// … (code existant)
break; // Terminer la boucle une fois que la correspondance est trouvée
}
}10 novembre 2023 à 18:19 #73436bebarthMaître des clésbonjour,…
var excelFilePath = « /chemin/fichier.xlsx »; //
var selectedName = this.getField(« nomMenuDeroulant »).value;
var excelData = app.Excel.importDataObjects(excelFilePath);Ça ce n’est pas possible !
Ton fichier .csv doit être en pièce jointe de ton pdf.@+
10 novembre 2023 à 18:57 #73437ced2001ParticipantBonsoir
Si le fichier est en pièce jointe c’est encore mieux. J’aurais meme envisager d’intégrer les adresse dans le script mais moins facile à mettre à jour …
Par contre est-il possible d’utiliser un tableau .Xlsx au lieu du csv ? Et est-il possible de le cacher ?
10 novembre 2023 à 20:52 #73438bebarthMaître des clésDu coup, voici un script pour un autre post que j’avais écris il y a quelques années (déjà) !
// Script de document
var id=this.getField(“ID”).value;
var studentName=this.getField(“Name”).value;
var parentName=this.getField(“Parent_Name”).value;
var address=this.getField(“Address”).value;
var phoneNumber=this.getField(“Phone_Number”).value;
var email=this.getField(“E-mail”).value;
// Initialisation liste déroulante
this.getField(“ID”).clearItems();
// Importer l’unique PJ sans la nommer
var p=this.getDataObject(this.dataObjects[0].name);
var fichier=this.getDataObjectContents(p.name);
var donnees=util.stringFromStream(fichier);
// Séparation des rangées (saut de ligne)
var rangees=donnees.split(“\n”);
// Séparation des colonnes (TAB)
var colonnes=new Array();
for (var i=0; i<rangees.length; i++) colonnes=rangees.split(“;”);
var cellule=new Array();
for (var j=0; j<colonnes.length; j++) cellule[j]=[colonnes[j][0], j];
// Remplissage de la liste déroulante
this.getField(“ID”).setItems(cellule); // champ liste déroulante
// Re-remplissage des champs
this.getField(“ID”).value=id;
this.getField(“Name”).value=studentName;
this.getField(“Parent_Name”).value=parentName;
this.getField(“Address”).value=address;
this.getField(“Phone_Number”).value=phoneNumber;
this.getField(“E-mail”).value=email;// Script de touches personnalisé du menu déroulant
if (!event.willCommit) {
try {
var studentName=colonnes[event.changeEx][1];
} catch(e) {
var studentName=””;
}
try {
var parentName=colonnes[event.changeEx][2];
} catch(e) {
var parentName=””;
}
try {
var address=colonnes[event.changeEx][3];
} catch(e) {
var address=””;
}
try {
var phoneNumber=colonnes[event.changeEx][4];
} catch(e) {
var phoneNumber=””;
}
try {
var email=colonnes[event.changeEx][5];
} catch(e) {
var email=””;
}
this.getField(“Name”).value=studentName;
this.getField(“Parent_Name”).value=parentName;
this.getField(“Address”).value=address;
this.getField(“Phone_Number”).value=phoneNumber;
this.getField(“E-mail”).value=email;
}@+
Attachments:
You must be logged in to view attached files.11 novembre 2023 à 08:29 #73440ced2001ParticipantBonjour
C’est exactement le principe ! Merci beaucoup !
Comme expliqué dans mon 1er message, je ne suis vraiment pas un expert …
Pouvez-vous m’expliquer comment le mettre en place dans le formulaire (Est-ce dans action du champ liste ?)
Est-ce que le fichier Excel peut-être masqué ou invisible pour les utilisateur ?
Est-ce que le système marchera avec le lecteur pdf ou uniquement la version pro ?
11 novembre 2023 à 14:17 #73441bebarthMaître des clésbonjour,
Pouvez-vous m’expliquer comment le mettre en place dans le formulaire (Est-ce dans action du champ liste ?)
Le code est placé en “Script de touches personnalisé” du menu déroulant (cf. copie d’écran).
Est-ce que le fichier Excel peut-être masqué ou invisible pour les utilisateur ?
Le fichier Excel peut-être masqué si on cache les volets de navigation… On peut peut-être essayer qu’il ne soit pas possible à afficher !
Est-ce que le système marchera avec le lecteur pdf ou uniquement la version pro ?
Ça fonctionnera sur ordinateur PC/Mac avec Acrobat Reader ou Pro (ou autres lecteurs pdf) mais pas avec les téléphones et tablettes dont les readers sont allergiques au JavaScript.
Si tu veux plus d’aide, merci de partager un fichier (en messagerie privée si tu le souhaites).
@+
Attachments:
You must be logged in to view attached files.11 novembre 2023 à 20:20 #73443ced2001ParticipantMerci beaucoup pour ton aide !
J’ai regardé et il me semblait qu’il y avait aussi un script à la base du document qui allait prendre les ID pour mettre à jour la liste …
Je veux bien un coup de pouce, c’ai du déjà passé une vingtaine d’heure juste sur cette partie !
Après je veux faire qqch pour lier les champs ville et npa mais apparemment c’est plus simple !
11 novembre 2023 à 20:34 #73444ced2001Participant13 novembre 2023 à 12:58 #73452bebarthMaître des clésbonjour,
Voici les scripts à indiquer :
// Script de document
this.getField("nomCabinet").clearItems();
var p=this.getDataObject(this.dataObjects[0].name);
var fichier=this.getDataObjectContents(p.name);
var donnees=util.stringFromStream(fichier);
var rangees=donnees.split("\n");
var colonnes=new Array();
for (var i=0; i<rangees.length; i++) colonnes=rangees.split(";");
var cellule=new Array();
for (var j=0; j<colonnes.length; j++) cellule[j]=[colonnes[j][0],j];
cellule[0][0]="";
this.getField("nomCabinet").setItems(cellule);
// Script de touches personnalisé du menu déroulant
if (!event.willCommit) {
if (event.changeEx!=0) {
this.getField("adresseCabinet").value=colonnes[event.changeEx][1];
this.getField("npaCabinet").value=colonnes[event.changeEx][2];
this.getField("villeCabinet").value=colonnes[event.changeEx][3];
this.getField("telephoneCabinet").value=colonnes[event.changeEx][4];
this.getField("emailCabinet").value=colonnes[event.changeEx][5];
} else {
this.getField("adresseCabinet").value="";
this.getField("npaCabinet").value="";
this.getField("villeCabinet").value="";
this.getField("telephoneCabinet").value="";
this.getField("emailCabinet").value="";
}
}
…et si tu as des caractères accentués, il faut absolument enregistrer ton fichier .csv en UTF-8.
@+
- Cette réponse a été modifiée le il y a 1 année et 1 mois par bebarth.
Attachments:
You must be logged in to view attached files.13 novembre 2023 à 13:51 #73455ced2001ParticipantExcellent !! Merci beaucoup !
Si je fais la même chose avec ville et NPA. J’utilise seulement le script de touche ? Je peux mettre en relation deux cases texte sans menu déroulant afin que l’une ou l’autre reprenne le texte de l’autre ?
13 novembre 2023 à 14:03 #73456bebarthMaître des clés??? Je ne comprends pas les questions !
Tu veux un menu déroulant pour “ville” et “NPA” ?@+
13 novembre 2023 à 14:29 #73457ced2001ParticipantA désolé je ne sais pas comment expliquer
Non pas forcément besoins de liste déroulante (sauf si c’est plus simple) mais juste des champs textes.
Je voudrais juste lier les champs Fille et NPA via un csv. Si je tape le NPA la ville se remplit et si je tape la ville le NPA se remplit cette fonction est dispo sur beaucoup de formulaire internet
13 novembre 2023 à 15:38 #73458bebarthMaître des clésTu peux écrire ceci :
// Script champ "npaCabinet" désactivé
for (var i=0; i<colonnes.length; i++) {
if (event.value==colonnes[2]) {
this.getField("villeCabinet").value=colonnes[3];
break;
}
}
// Script champ "villeCabinet" désactivé
for (var i=0; i<colonnes.length; i++) {
if (event.value==colonnes[3]) {
this.getField("npaCabinet").value=colonnes[2];
break;
}
}
@+
Attachments:
You must be logged in to view attached files.13 novembre 2023 à 15:53 #73460ced2001ParticipantOui c’est exactement ça ! C’est plus qu’un coup de main là !!! Merci beaucoup !
C’est possible d’avoir deux fichier csv par document ? J’en ai fait un avec le NPA qui ne changera jamais (celui des vetos aura des mises à jour)
Du coup il faut copier le script dans les scripts de touches des champs NPA et Ville ? Si j’ai plusieurs champs NPA et ville dans mon formulaire, je peux utiliser le même script ?
Attachments:
You must be logged in to view attached files.14 novembre 2023 à 10:34 #73486bebarthMaître des clésbonjour,
C’est possible ! Il faut donc appeler chaque fichier csv plutôt par son nom que sa position…...
//
var fichier=this.getDataObjectContents("NPA.csv");
var donnees=util.stringFromStream(fichier).replace(/\r/g,"");
var rangees=donnees.split("\n");
var NPA=new Array();
for (var i=0; i<rangees.length; i++) NPA=rangees.split(";");
// Script champ "npaCabinet" désactivé
if (event.value) {
for (var i=0; i<NPA.length; i++) {
if (event.value==NPA[1]) {
this.getField("villeCabinet").value=NPA[0];
break;
}
this.getField("villeCabinet").value="";
}
} else this.getField("villeCabinet").value="";
// Script champ "villeCabinet" désactivé
if (event.value) {
for (var i=0; i<NPA.length; i++) {
if (event.value.toUpperCase()==NPA[0].toUpperCase()) {
this.getField("npaCabinet").value=NPA[1];
event.target.value=NPA[0];
break;
}
this.getField("npaCabinet").value=""
}
} else this.getField("npaCabinet").value="";
@+
😎- Cette réponse a été modifiée le il y a 1 année et 1 mois par bebarth.
15 novembre 2023 à 11:39 #73509daninetParticipantBonjour (Salve)
Je m’excuse si je l’écris ici, est-il possible de mettre à jour la pièce jointe Excel des listes Veto à partir du fichier PDF ? insérer de nouvelles données ? qu’ils sont toujours mis à jour ?
15 novembre 2023 à 14:23 #73510bebarthMaître des clésbonjour,
Si je comprends bien, tu veux alimenter le fichier .csv à partir de données entrées dans le pdf !
Si c’est cela, il y a un post où j’avais répondu :
…et le fichier correspondant en pièce jointe.N’hésite pas à demander pour des informations complémentaires.
@+
😎Attachments:
You must be logged in to view attached files.15 novembre 2023 à 14:49 #73512ced2001ParticipantBonjour Bebarth
J’ai réussi à importé et modifier les scripts avec adresses sans problème
par contre pour les NPA j’ai qqch qui beug ! Même en reprenant le NPA du fichier avec les adresses afin d’avoir qu’un seul csv …
Une case efface l’autre !?
Je souhaite utiliser le script dans chaque case du formulaire avec ville et adresse il me suffit de copier ton script dans les actions des cases en question ?
for (var i=0; i<colonnes.length; i++) {
if (event.value==colonnes[3]) {
this.getField(“npaCabinet”).value=colonnes[2];
break;
}
}J’ai loupé qqch ? Il me semple que c’est les colonnes 3 et 4 Non ? Pas 2 et 3 ?
J’ai essayé de remplacer “npaCabinet” par “06 NPA” et villeCabinet par “07 ville” qui corresponde au champs de mon document mais cela ne fonctionne pas
Je souhaite aussi ajouter une colonne dans mon csv ( N°7 frais de déplacements) avec un montant
et le reprendre dans une case plus loin dans le formulaire en fonction en fonction du NPA ajouté dans le champs ” 06 NPA”
15 novembre 2023 à 16:17 #73513daninetParticipantSalut,
en faisant les tests j’ai vu que ça marche sur Acrobat 2020 (je mets à jour le livre)
alors qu’avec le lecteur Adobe gratuit, ça ne marche pas. (il ne le met pas à jour pour moi)
Existe-t-il un moyen pour que le lecteur gratuit mette à jour le fichier Excel ?
Merci15 novembre 2023 à 18:06 #73515bebarthMaître des clésSalut, en faisant les tests j’ai vu que ça marche sur Acrobat 2020 (je mets à jour le livre) alors qu’avec le lecteur Adobe gratuit, ça ne marche pas. (il ne le met pas à jour pour moi) Existe-t-il un moyen pour que le lecteur gratuit mette à jour le fichier Excel ? Merci
Le message retourné par la console avec Adobe Reader est :
NotAllowedError: Les paramètres de protection interdisent l’accès à cette propriété ou à cette méthode.
Doc.setDataObjectContents:27:Field addAbook.4:Mouse UpDonc pas possible…
@+
😎15 novembre 2023 à 18:08 #73516bebarthMaître des clésBonjour Bebarth J’ai réussi à importé et modifier les scripts avec adresses sans problème par contre pour les NPA j’ai qqch qui beug ! Même en reprenant le NPA du fichier avec les adresses afin d’avoir qu’un seul csv … Une case efface l’autre !? Je souhaite utiliser le script dans chaque case du formulaire avec ville et adresse il me suffit de copier ton script dans les actions des cases en question ? for (var i=0; i<colonnes.length; i++) { if (event.value==colonnes[3]) { this.getField(“npaCabinet”).value=colonnes[2]; break; } } J’ai loupé qqch ? Il me semple que c’est les colonnes 3 et 4 Non ? Pas 2 et 3 ? J’ai essayé de remplacer “npaCabinet” par “06 NPA” et villeCabinet par “07 ville” qui corresponde au champs de mon document mais cela ne fonctionne pas Je souhaite aussi ajouter une colonne dans mon csv ( N°7 frais de déplacements) avec un montant et le reprendre dans une case plus loin dans le formulaire en fonction en fonction du NPA ajouté dans le champs ” 06 NPA”
Il faudrait partager ton fichier car comme ça je ne comprends pas !
@+
😎15 novembre 2023 à 18:43 #73517daninetParticipantDésolé, existe-t-il une autre méthode que vous pouvez utiliser pour saisir et mettre à jour des données avec le lecteur gratuit ?
peccato, nessun altro metodo da poter utilizzare per inserire e aggiornare dati con il lettore gratuito?
15 novembre 2023 à 19:57 #73519ced2001ParticipantMerci pour ta réponse ! C’est ok mais j’ai un problème avec mon dernier script
for (var i = 0; i < colonnes.length; i++) {
if (event.value == colonnes[2]) {
this.getField(“43 Deplacement”).value = colonnes[6];
break;
}
}j’ai un message d’erreur car le format du champ 43 est nombre monétaire
Attachments:
You must be logged in to view attached files.15 novembre 2023 à 20:55 #73522bebarthMaître des clésDésolé, existe-t-il une autre méthode que vous pouvez utiliser pour saisir et mettre à jour des données avec le lecteur gratuit ? peccato, nessun altro metodo da poter utilizzare per inserire e aggiornare dati con il lettore gratuito?
Je ne pense pas !
@+
😎15 novembre 2023 à 20:57 #73523bebarthMaître des clésMerci pour ta réponse ! C’est ok mais j’ai un problème avec mon dernier script for (var i = 0; i < colonnes.length; i++) { if (event.value == colonnes[2]) { this.getField(“43 Deplacement”).value = colonnes[6]; break; } } j’ai un message d’erreur car le format du champ 43 est nombre monétaire
Essaye :
...
this.getField("43 Deplacement").value = Number(colonnes[6]);
...
En supposant que “colonnes[6]” (la septième colonne numérotée basée sur 0) est bien un nombre !
@+
😎- Cette réponse a été modifiée le il y a 1 année et 1 mois par bebarth.
15 novembre 2023 à 21:22 #73525ced2001ParticipantJ’ai essayé de modifier, malheureusement toujours le même message
je suis bien en nombre dans ma colonne 7
Attachments:
You must be logged in to view attached files.15 novembre 2023 à 21:28 #73528ced2001ParticipantJ’ai aussi essayer ça
for (var i = 0; i < colonnes.length; i++) { if (event.value == colonnes[2]) { this.getField(“43 Deplacement”).value = Number(colonnes[6]); break; } }
15 novembre 2023 à 21:52 #73529ced2001ParticipantVoila, celui-ci fonctionne !
Merci encor pour ton aide !
for (var i = 0; i < colonnes.length; i++) { if (event.value == colonnes[2]) { var montant = parseFloat(colonnes[6].replace(/[^\d]/g, ”)); if (!isNaN(montant)) { this.getField(“43 Deplacement”).value = montant.toFixed(0); } break; } }
- Cette réponse a été modifiée le il y a 1 année et 1 mois par ced2001.
16 novembre 2023 à 10:15 #73531MerlinMaître des clés“j’ai un message d’erreur car le format du champ 43 est nombre monétaire”
Bonjour
Par principe un champ qui est en lecture seule et qui est rempli programmatiquement ne devrait pas avoir de “Format”.
En général c’est contre-productif, comme dans ce cas.
16 novembre 2023 à 18:54 #73532ced2001ParticipantBonsoir
Désolé de revenir vers toi, j’ai un problème avec le script “veto”
le nom du veto disparaît lors de l’enregistrement du document
Moins grave, si je veux ajouter une info après le cabinet sélectionné comme (un nom par exemple), l’adresse s’efface …
As-tu une idée ?
21 novembre 2023 à 12:46 #73567bebarthMaître des clésbonjour,
Désolé pour cette réponse tardive, je pensais avoir répondu !j’ai un problème avec le script “veto” le nom du veto disparaît lors de l’enregistrement du document
Ça ce n’est pas compliqué, il suffit de récupérer la valeur du menu déroulant à l’ouverture du document et de redonner cette valeur après lecture des données de la pièce jointe dans le script de document.
var leCabinet=this.getField("nomCabinet").value;
...
this.getField("nomCabinet").value=leCabinet;
Moins grave, si je veux ajouter une info après le cabinet sélectionné comme (un nom par exemple), l’adresse s’efface … As-tu une idée ?
Ça c’est plus compliqué et je ne sais pas si c’est une bonne idée… Je vais réfléchir !
@+
😎Attachments:
You must be logged in to view attached files. -
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.