IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

Script ok s/ AppleScript et pas s/ Excel [AppleScript]


Sujet :

AppleScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Réunion

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 49
    Par défaut Script ok s/ AppleScript et pas s/ Excel
    Bonjour,

    Je reviens vers vous pour obtenir une explication et éventuellement une solution sur ce script qui fonctionne s'il est lancé avec Applescript et ne fonctionne pas s'il est lancé à partir d'Excel. Je dois beaucoup à l'aide apporté par PBell pour les instructions du script qui fonctionnent, en revanche la ligne 14 qui pose problème est de moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    on Impression()
    	tell application "Mail"
    		activate
    		--a/ On simulee l'action clavier, à chaque fois qu'une commande est non scriptable
    		tell application "System Events"
    		--b/ On ouvre le dialogue d'impression avec le clavier par "command p",		
    		keystroke "p" using {command down}
    		delay 0.25
    		--c/ Test pour connaître l'état du dialogue d'impression. 			
    			--	c1-	si le boutton "Afficher les détails" est présent (dialogue non déployer)
    			-- 			Cliquer sur le bouton  "Afficher les détails" pour déployer le dialogue d'impression.
    			-- 	c2-	si non ne rien faire(sous entendu)
    		tell process "Mail" to tell sheet 1 of front window
    		        if exists button "Afficher les détails" then click button "Afficher les détails"
    		end tell
    		--d/ Sélection des options du dialogue d'impression qui est déployé
                            -- on actionne 2 fois sur la touche tabulation, 
    			-- une 1ère fois pour passer de copies à pages
    			-- une 2ème fois pour passer de 1 à 1
    			-- puis on actionne la touche "1" (la frappe de la touche 1 force le petit bouton devant !).
                    keystroke tab
    		keystroke tab
    		delay 0.25
    		keystroke "1"
    		-- e/  actionne la touche "retour" pour valider le dialogue d'impression.
    		delay 0.25
    		keystroke return
    		end tell
    	end tell
    end Impression
    Je précise le comportement du script :
    1- Sans les lignes 13 à 15 - celles qui testent l'état du dialogue d'impression - le script fonctionne parfaitement qu'il soit lancé d'Excel ou d'AppelScript.
    2- Avec les lignes 13 à 15, le script fonctionne entièrement s'il est lancé d'Appel script, il s'arrête de fonctionner à l'instruction 14 s'il est lancé d'Excel.
    Quand je le lance d'Excel :
    1- le dialogue d'impression s'affiche à l'écran et plus rien ne se passe; toutefois je peux poursuivre manuellement les actions du script dans le dialogue d'impression.
    2- Aucun message d'erreur ne vient d'AppleScript. Dans la fenêtre du script appelé comme du script appelant, la cartouche "Resultat" est vide.
    3- Un message d'erreur, lié au script s'affiche quand je retourne sur Excel.

    C'est incompréhensible pour moi, cela dépasse mes capacités de programmation.

    Merci pour votre aide.
    Cordialement.

    jf Zuinghedau

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir,
    Qu'entends tu par le script lancé à partir d'Excel ?
    Tu lances le script à partir de VBA ? si oui, quelle instruction utilises tu ?
    Tu lances le script à partir d'un service ? (Automator, ou autres )

    Je pense que le problème vient du fais que ta méthode de lancement ne mets pas les mêmes application et processus au même plan.
    Le script se retrouve alors à simuler des actions clavier sur une autre fenêtre que celle prévue et ces commandes ne sont tout simplement pas interprétées.

    Connaître la méthode de lancement du script "à partir d'Excel" nous aidera...
    Cordialement

  3. #3
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Réunion

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 49
    Par défaut
    Merci PBell de me répondre et de prendre en charge mon problème>

    0- Avant de répondre directement à ta question, la ligne 14 peut aussi s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if name of button 4 is "Afficher les détails" then click button "Afficher les détails"
    et fonctionne avec la même anomalie.

    1- "Le script fonctionne s'il est lancé avec Applescript" : signifie que dans le script j'ai désactivé les lignes 1 et 30
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    on Impression() 
    ....
    end Impression
    puis je clique dans la fenêtre du script sur le bouton Exécuter, après avoir enregistré le script et avoir dans Mail un message à envoyer à l'écran.
    Tout se passe bien, ce message s'imprime.

    2- Je réponds directement à ta question maintenant. Je lance le script à partir d'Excel (version Office 2011, Excel 14.4.4) par cette instruction.
    [CODE]ChDir "Catherine:Usersrogrammes:"
    MacScript ("EnvoiCourriel.scpt")[/CODE
    où Catherine est le non du disque dur, EnvoiCourriel celui du script principal.

    Dans le script principal je fais appel à la routine comme il est indiqué dans la discussion de MrSpark ( Je travaille sous Maverick)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tell script "Imprimer"
          Impression()
    end tell
    puisque j'ai placé la routine dans Catherine:Bibliothèque:Script Libraries:Imprimer.
    Le script d'impression fonctionne que je le place dans une routine ou dans le mail principal. Et le script d'impression quelque soit sa place le bloque sur la ligne 14 quand il est lancé à partir d'Excel.

    Voilà, c'est un peu long, je m'en excuse, toutefois tu as toutes les informations. La piste que tu indiques me semble pertinente, puisqu'un éclair se produit à l'écran après le déploiement de la fenêtre d'impression, et puis plus rien ne se produit après.

    Sans aucun doute, tu vas lever ce paradoxe.

    Merci encore et bonne journée à tous.

    Cordialement. JF Zuinghedau

  4. #4
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour Jefmonde,
    Tout d'abord, une remarque qui ne doit pas être liée au problème précis, mais juste pour le fun : ta première ligne VBA "chdir" n'affecte bien sûr que Excel et pas le script qui ne tiendra donc absolument pas compte du répertoire par défaut d'Excel.
    Remarque annexe, si "Catherine" est le disque dur, "programmes" doit être un user, compte tenu de l'arborescence standard.
    Soit c'est effectivement un user et en plus le user qui a lancé ton Excel VBA, dans ce cas pas de problème car ton script VBA pourra faire quelque chose dans ce répertoire après le Chdir. Sinon, cela veut dire que "programmes" est un répertoire en dehors de ton user courant et alors tu n'as pas les autorisations (au moins par défaut !!), et tu sera très limité.


    Ceci étant, je continue de supposer (peut être à tord) le souci vient d'une confusion dans les process actifs /inactif, donc c'est bien la routine appelante qu'il faut regarder, c'est à dire le script EnvoiCourriel.scpt.

    Au moment où est exécutée l'instruction "Macscript" dans VBA, la seule possibilité est que Excel soit le processus actif (forcément) et je vais aussi supposer qu'il est au premier plan (c'est probable mais cela dépend de ce que fait VBA avant).
    Ensuite il passe la main à EnvoiCourriel.scpt. La question est de savoir ce que fait ce script AVANT l'appel à "Impression".
    Ce sont ces instructions qui me manque pour avancer et déterminer ce qui est actif ou pas.

    J'ajoute que Maverick a été particulièrement renforcé en matière de sécurité et il a une tendance forte à "cloisonner" les scripts d'un point de vue autorisation. C'est bien pour la sécurité, mais c'est galère pour les développements car les scripts doivent bien être validés pour l'application qui les appelle.
    Chaque chose en son temps : commençons par voir ton EnvoiCouriel.scpt

    Cordialement

    PS : avec ce script on aura aussi peut être une vue plus globale de ce que tu cherches à faire, car pour l'instant, je vois que dans VBA tu lances un script, qui lui-même appelle une subroutine, qui elle-même appelle "Mail" pour enfin appeler le driver d'impression. Une vraie course de relai

  5. #5
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Réunion

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 49
    Par défaut
    Bonjour PBell et à ceux qui suivent la discussion.

    Je réponds en reprenant ton texte avant :


    Citation Envoyé par PBELL Voir le message
    Remarque annexe, si "Catherine" est le disque dur, "programmes" doit être un user, compte tenu de l'arborescence standard.
    Soit c'est effectivement un user et en plus le user qui a lancé ton Excel VBA, dans ce cas pas de problème car ton script VBA pourra faire quelque chose dans ce répertoire après le Chdir. Sinon, cela veut dire que "programmes" est un répertoire en dehors de ton user courant et alors tu n'as pas les autorisations (au moins par défaut !!), et tu sera très limité.
    Je ne saisis pas bien ce que tu écrit ci-dessus, je n'ai pas le niveau suffisant. Il est vrai que sur le MBP, Users n'apparait pas dans le chemin, mais que sur le MBA il est indispensable. Pourquoi ? Le MBP avait OS 10.8 avant OS 10.9, alors que NBA a été initié avec OS 10.9. Est-ce la raison ?

    Au moment où est exécutée l'instruction "Macscript" dans VBA, la seule possibilité est que Excel soit le processus actif (forcément) et je vais aussi supposer qu'il est au premier plan (c'est probable mais cela dépend de ce que fait VBA avant).
    Le programme est l'édition d'une quittance et d'un appel de loyer. VBA remplit les informations du document qui se trouve dans une feuille d'Excel, puis isole cette feuille du classeur pour enregistrer la quittance en format PDF et sauvegarder la quittance ensuite. Voici le code VBA.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    '   Envoyer la quittance du mois au format pdf.
    Sub EnregistrerEnPDF()
        ' Enregistrer la feuille sous format PDF
            Worksheets(2).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "Catherine:Users:Locatif:Erasme:" & an & ":" & rg & "/" & an & " " & v & ".pdf", _
        Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=True 
        ' Créer le mail pour envoyer la quittance locataire
    ChDir "Catherine:Users:Programmes:"
           MacScript ("EnvoiQuittance.scpt")
    End Sub
    Ensuite il passe la main à EnvoiCourriel.scpt. La question est de savoir ce que fait ce script AVANT l'appel à "Impression".
    Ce sont ces instructions qui me manque pour avancer et déterminer ce qui est actif ou pas.
    Le script "EnvoiQuittance" crée le mail puis attache la quittance au mail. Voici le code du script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    -- Partie commune à tous les mails mis dans une routine
    tell script "ElementsLettre"
    	set rep to LaLettre()
    	set Par to Classeur()
    end tell
    -- Partie propre au mail
    	set Objet to "Votre quittance " & item 4 of rep & ". "
    	set corps to "J'ai bien reçu votre règlement du loyer " & item 4 of rep & " et je vous en remercie." & return
    	set corps to corps & "Vous trouverez en annexe la quittance s'y afférent. " & return & return
    -- le texte du mail
    set letexte to item 5 of rep & corps & item 6 of rep & item 7 of rep
    -- création du mail
    tell application "Mail"
    	activate
    	set courrier to make new outgoing message with properties {sender:item 8 of rep, subject:Objet, content:letexte & return & return, visible:true}
    	tell courrier
    		make new to recipient at end of to recipients with properties {name:item 2 of Par, address:item 3 of Par}
     
    		make new attachment with properties {file name:("Catherine:Users:Locatif:" & item 1 of Par & ":" & item 2 of rep & ":" & item 1 of rep & "/" & item 2 of rep & " quittance.pdf" as alias)} at after last paragraph
    		delay 1
    	end tell
    	-- 1- 
                 send courrier
     
    	-- 2 Imprimer le courrier. Le script d'impression commun à tous les mails est mis dans une routine.
    	tell script "Imprimer"
    		Impression()
    	end tell
    end tell
    PS : avec ce script on aura aussi peut être une vue plus globale de ce que tu cherches à faire, car pour l'instant, je vois que dans VBA tu lances un script, qui lui-même appelle une subroutine, qui elle-même appelle "Mail" pour enfin appeler le driver d'impression. Une vraie course de relai
    Voilà la séquence : 1- Avec Excel : > je crée la quittance > qui est sauvegardée en format pdf > puis je passe le relais à AppleScript pour gérer l'expédition.
    Remarque : je ne sais pas diriger Mail avec Excel comme je peux le faire avec Word, d'où l'appel à AppleScript pour diriger Mail
    2- Avec AppleScript. > Un script principal qui crée le Mail prêt à l'envoi. > Le script principal fait appel à deux routines pour les instructions partagées avec les autres scripts : > une première routine "ElementsLettre" pour le titre, la formule de politesse, la signature > puis une deuxième routine "Imprimer" pour l'impression papier.

    Et seul hic dans tout cela : la ligne 14 de la routine "Imprimer".
    On est proche de la théorie du chaos; "un plomb saute à la périphérie de NY et plonge la ville dans le noir. 9 mois plus tard se produit un mini baby boon"

    Bonne journée à tous et merci PBell.

    jfz.

  6. #6
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir Jefmonde,
    Merci pour le détail des scripts.

    Ton problème est que dans le script "Envoiquittance", tu crées le mail objet "courrier", puis tu l'envoies via l'instruction "send".
    Or, une fois cette instruction exécutée, l'objet courrier n'existe plus !!
    Pour être précis, le mail envoyé existe bien, mais ce n'est ce n'est plus le même objet. L'instruction "send" l'a fermé, dé-selectionné et placé dans la boite des messages envoyés !
    Ta routine d'impression qui arrive ensuite reçoit bien le "Commande P", mais rien n'est sélectionné !

    Comment faire ?
    Tout simplement lancer l'impression du mail actif, AVANT la commande "send".
    Il faut sans doute ajouter un petit délai après le make et le "command P", puis après l'impression avant de passer au "send.


    Si tu ne veux imprimer que après l'envoi, c'est sans doute un peu plus tordu, car il faut tester le boolean de la commande send (pour être sûr de l'envoi) puis cherche la boite des messages envoyés (attention si plusieurs comptes !) et ensuite ouvrir la fenêtre et sélectionner le mail.
    Ma première proposition est bien plus simple.

    Cordialement

  7. #7
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Réunion

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 49
    Par défaut
    Bonjour Pbell et à tous

    BRAVO pour ta bonne réponse. Mais c'est fou comme dysfonctionnement.

    C'est " fou " puisque send courrier est désactivé (2 traits d'union devant l'instruction, ligne grisée claire dans le script).

    J'ai trouvé ton explication subtile et pertinente. J'ai donc mis l'instruction désactivée sous l'appel de la routine "imprimer", et tout fonctionne parfaitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- 2 Imprimer le courrier
    	tell script "Imprimer"
    		Impression()
    	end tell
     
    	--delay 1
    	-- 1- send courrier
    J'en conclue qu'une commande désactivée reste "toujours" exécutée par AppleScript, sans effet visible pour l'homme. Certaines commandes entreraient toute fois en conflit lorsque un script serait appelé par une autre logiciel (Excel pour ce cas) {send rentre en conflit avec la ligne 14 du script Imprimer comme tu l'expliques}; alors que ce conflit serait neutralisé (géré en interne) si le script est exécuter par AppleScript lui-même. Et là, on peut rebondir sur ta remarque

    J'ajoute que Maverick a été particulièrement renforcé en matière de sécurité et il a une tendance forte à "cloisonner" les scripts d'un point de vue autorisation. C'est bien pour la sécurité, mais c'est galère pour les développements car les scripts doivent bien être validés pour l'application qui les appelle.
    et finalement le responsable serait Maverick.

    Je te remercie infiniment pour son suivi dans la discussion, et ta solution qui rend le programme plus professionnel.

    Cordialement

    jfz.

  8. #8
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir Jefmonde,
    Je suis ravi d'avoir résolu ton problème, mais je ne suis pas tout à fait d'accord avec tes explications.
    Pour lever les doutes éventuels qu'elles peuvent susciter, voici quelques précisions :

    L'impact de Maverick :
    Il se fait surtout sentir dans les autorisations pour exécuter un script. Celui-ci, géré en direct via l'éditeur de script, bénéficie des autorisations nécessaires en général.
    Lorsqu'un script est lancé par un autre programme, il semble qu'il soit associé aux privilèges de ce programme, qui parfois sont insuffisants. Pour les plus experts, la solution peut être contrôlée, semble-t-il via les préférences systèmes. A vérifier car je ne suis pas sous Maverick.

    Le second aspect de Maverick (et son prédécesseur) est du à la sauvegarde automatique des documents. Pourquoi ? Tout simplement car Apple a intégré, dans l'éditeur de script, la capacité de sauvegarder un script non compilé (pour faire des sauvegardes automatiques et périodique, même si le script n'est pas compilable). Il en résulte que c'est à l'utilisateur de bien penser à compiler son script dans l'éditeur, puis à le sauvegarder.
    Faute de quoi, vous pensez avoir fait une modification, mais elle n'est que dans le script en clair et pas dans sa version compilée !


    La modification de ton script :
    Je n'ai JAMAIS eu de cas où une instruction mise en commentaire reste exécutée.
    Je ne pense pas non plus que ce soit ton cas. Si tu as mis l'instruction "send" en commentaire, mais qu'elle semble s'exécuter tout de même, vérifie que tu as bien re-compilé (voir Maverick ci-dessus).
    A 99,99% je suis sûr que les signes "--" indiquent bien un commentaire seulement (pas 100% car l'informatique ne sera jamais une science exacte )

    Pour ton script, le problème était bien que "send " était exécuté avant le "print".
    Ceci est indépendant de l'emplacement du script et sous-script.
    Tu peux même faire l'essai dans un seul et même script avec l'éditeur: la suite "Make new outgoing message", "send" et "print" ne fonctionne pas alors que la suite "Make outgoing message", "print" et "send" fonctionne parfaitement.
    Dans la première, une fois le "send" effectué, le print n'a rien de sélectionné à imprimer ... et donc rien pour fonctionner !


    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. script que je n'arrive pas à coder
    Par mussara dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/06/2006, 14h28
  2. Script qui ne s'exécute pas
    Par arizki dans le forum Administration système
    Réponses: 6
    Dernier message: 19/06/2006, 12h19
  3. [AJAX] Script qui plante IE mais pas Firefox
    Par Booyakha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 31/05/2006, 18h40
  4. Page de login -- script PHP qui ne marche pas
    Par Alexlesilex dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 24/04/2006, 16h32
  5. Script CMD qui ne rend pas la main
    Par ipeteivince dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 10/06/2005, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo