# Script Automator



## plm222 (8 Mars 2021)

Bonjour a tous,
je débute avec Automator.
J'ai besoin d'un coup de main... si possible !
Tous les mois je recherche suivant un critère AAAAMM les éléments du finder dans un dossier précis.
J'envoie ces éléments par mail à mon comptable.
Le fait est que je dois le faire une 20 aine de fois car j'ai 20 dossiers différents. (je précise qu'il est impératif qu'il y ait autant de mail que de dossier, je ne dois pas en faire qu'un seul)

MA question est donc, est-il possible avec Automator, que ce dernier me demande le critère AAAAMM (Année, Mois) et que ce critère soit utiliser pour faire la 20 aine de routines ?
Est-il possible d'écrire un objet par routine ?

J'espère être assez clair ...
Merci à vous

Phil


----------



## baron (8 Mars 2021)

Bonjour, 

Sans pouvoir t'aider à rédiger le script, je puis au moins te suggérer ceci : une fois le processus au point, tu peux l'enregistrer comme "action de dossier" et puis faire une 20-aine de copies de ce dossier et y transférer le contenu actuel de tes dossiers.

C'est bien peu de chose, je le crains, mais si ça peut déjà t'encourager…


----------



## plm222 (9 Mars 2021)

Merci ! ça ne m'arrange pas car ça me fera réouvrir les 20 scripts pour y changer tous les mois la recherche AAAAMM .


----------



## baron (9 Mars 2021)

Je pense que le processus lui-même gagnerait à être écrit en Apple Script (voire un script shell) mais je ne suis pas assez compétent… 

Tu pourrais demander à un modérateur s'il serait possible de transférer ton sujet dans la section https://forums.macg.co/forums/applescript-et-automator.226/ des forums.


----------



## baron (9 Mars 2021)

Dans l'action "Rechercher les éléments d'Automator, tu as aussi la possibilité de rechercher les éléments dont la date de modification est dans les 31 derniers jours mais il reste la difficulté de lancer l'action à date fixe (seulement une fois par mois). C'est entre autres pour ça que je pense qu'Apple Script serait utile. 

Merci au gentil modérateur.


----------



## plm222 (10 Mars 2021)

Merci Baron, c'est moi qui veut lancer l'action car j'ai des factures pour le  mois M-1 qui arrivent toujours en M.
donc pas besoin de rechercher les éléments dont la date de modification est dans les 31 derniers jour.
Seul le critère fichier commençant par AAAAMM est le bon pour mon cas.Et c'est ce critere dont je veut que le script me demande en début de routine....


----------



## zeltron54 (10 Mars 2021)

Bonsoir,

@plm222 
Je veux bien essayer de te réaliser un script qui fait le job.
Pour cela il faut quelques informations supplémentaires.

Est-ce que tous les fichiers à joindre sont bien dans le même dossier ?
Est-ce que le nom commence par la date AAAAMM à rechercher?
Ou peut on récupérer les éléments qui vont constituer le mail: l'adresse mail ou envoyer, le contenu de 'objet' , le contenu  du mail ?
avec que logiciel tu envois tes mails ? (mail, outlook, autres) ?

Avec ces éléments il devrait être possible d'automatiser l' envoie ...


----------



## plm222 (11 Mars 2021)

Bonjour Zeltron54 et merci à toi d'essayer de m'aider.
Pour répondre à tes questions :

Est-ce que tous les fichiers à joindre sont bien dans le même dossier ?
Chaque structure a un nom different, donc un chemin different,  les factures à rechercher sont dans le répertoire "Facture" classer comme suit : 
/Users/mon nom/Library/Mobile Documents/com~apple~CloudDocs/1-Sauvegarde Philippe/01-MAISONS SCCV/Nom de la structure 1/Facture
et ainsi de suite :
Nom de la structure 2
Nom de la structure 3
Nom de la structure 4
Nom de la structure 5
...
etc...
...

Est-ce que le nom commence par la date AAAAMM à rechercher? --> Oui
Ou peut on récupérer les éléments qui vont constituer le mail: l'adresse mail ou envoyer, le contenu de 'objet' , le contenu du mail ?
L'adresse mail de l'expéditeur est toujours la même (mais pourquoi pas la mettre en variable d'entrée )
Le contenu de l'objet" est "TVA MM/AAAA Nom de la structure"
Le contenu du mail est "Bonjour, veuillez trouver en PJ les factures concernant la "Nom de la structure" pour le Mois de "MM/AAAA"


avec que logiciel tu envois tes mails ? (mail, outlook, autres) ? Principalement Mail
Merci d'avance !
Philippe


----------



## zeltron54 (11 Mars 2021)

Bonjour,
Je t'ai fait un petit applescript qui:
-te demande la date au format AAAAMM

Il explore le dossier mobile documents de ta bibliothèque , dans tous les dossiers et sous dossier et cherche les fichiers dont le nom commence par AAAAMM
Pour chaque fichier il crée et envoi un mail, et te met un message lorsqu'il a terminé.

Il te faut remplacer dans ce script à la ligne 18, 
	
	



```
set toaddresslist to "ZELTRON54@free.fr"
```
l'adresse mail, par l'adresse mail de ton correspondant.

J'ai t'ai mis des commentaires, presqu' à chaque ligne du script, qui explique ce qu'elle fait

dis moi si cela te convient !
Bon tests


```
-- envoi mail avec PJ des fichiers AAAAMM dans /Users/mon nom/Library/Mobile Documents/com~apple~CloudDocs/1-Sauvegarde Philippe/01-MAISONS SCCV/Nom de la structure 1/Facture

tell application "Finder"
    set Chemin to (path to documents folder as text) -- chemin pour récup nom users
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --construit le chemin jusqu'a mobile documents
    set elements to text items of Chemin
    set Chemin to (items 1 thru -3 of elements) & "library:Mobile Documents:" as string -- chemin au format texte du dossier à explorer
    set Chemin to Chemin as alias -- chemin au format mac
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    display dialog "Saisir la date au format AAAAMM" default answer "" -- demande saisi date
  
    set ladate to text returned of result
    set lemois to text items 5 thru 6 of ladate as string -- recup le mois
    set lannee to text items 1 thru 4 of ladate as string -- recup l annee
  
    my inspecter(Chemin, ladate, lemois, lannee)
end tell

on inspecter(un_dossier, ladate, lemois, lannee)
    tell application "Finder"
        set CR to (ASCII character 13) -- initialise un retour ligne -- défini le retour ligne pour préparer le contenu du mail
      
        set toaddresslist to "ZELTRON54@free.fr" -- adresse mail ou envoyer le mail
      
      
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
          
            set lefichier to chaque_fichier
            set nom to name of chaque_fichier --récupère le nom du fichier
            set debutnom to characters 1 thru 6 of nom as string
            if debutnom = ladate then -- si debut du nom egale ladate
              
                set lechemin to chaque_fichier as string -- recup le chemin du fichier en texte
                set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
                set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
                set elements to text items of lechemin
                set structure to (item -3 of elements) as string -- recup le nom de la structure
                set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                --display dialog structure
              
                set objet to "TVA " & ladate & " " & structure -- prepare le contenu objet
                set contenu to "Bonjour, " & CR & CR & "veuillez trouver en PJ les factures concernant la " & structure & " pour le mois de " & lemois & "/" & lannee -- prépare le contenu du mail
              
                tell application "Mail"
                  
                    set newMessage to make new outgoing message with properties {subject:objet, content:contenu} -- prépare le mail
                  
                    tell newMessage
                      
                        make new to recipient at end of to recipients with properties {address:toaddresslist} -- envoi le mail
                        set lapiecejointe to chaque_fichier as alias
                        tell content of newMessage to make new attachment with properties {file name:lapiecejointe} at after last paragraph
                      
                    end tell
                  
                    delay 1
                    send newMessage
                  
                end tell
            end if
        end repeat
      
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier, ladate, lemois, lannee)
        end repeat
    end tell
  
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## plm222 (11 Mars 2021)

Bonjour Zeltron 54, merci, c'est du boulot !!....
le script s'arrete et me note ceci. (il a envoyé 6 mails quand même)
Par contre , j'ai du mal m'exprimer.
Je souhaite un Mail par structure (qui contiendrait  plusieurs fichiers) et non 1 mail par fichier .
Philippe


----------



## zeltron54 (11 Mars 2021)

Bonjour,

L 'erreur signalée provient d'un problème sur le nom du fichier (ou il récupère les 6 premiers caractères du nom), mais le fichier sur lequel il fait le test a un nom de moins de 6 caractères !  Oups !!! je n'avais pas pensé à ce cas. il faut donc que je revois le script de test!

Par contre pour avoir un mail par structure et non par fichier! cela me paraîs plus compliqué ... il faut que je repense à fond le problème...

Dès que j'ai un peu de temps je me penche la dessus!

Edit: je voudrais savoir le nom exact complet du dossier que tu as intitulé "com~apple~CloudDocs"  car les ~ doivent représenter des abrégés du nom (à vérifier).


----------



## plm222 (11 Mars 2021)

Merci bcp !
en fait le tilde s'écrit pour accéder à mon Cloud 
Regarde ici : https://fre.applersg.com/how-access-icloud-drive-from-command-line-mac-os


----------



## zeltron54 (11 Mars 2021)

OK! je ne connaissais pas, je n'utilise pas le cloud...
Par contre si les fichiers à joindre sont dans le cloud, j'espère que ce sera assez rapide en téléchargement, sinon le mail risque de partir avant qu'il ai eu le temps de mettre la pièce jointe...

Bien je regarde, mais je vais être un peu occupé ces prochains jours.


----------



## plm222 (11 Mars 2021)

Les fichiers sont sauvegardés sur le cloud mais ce chemin est bien le chemin du finder sur le disque dur.


----------



## zeltron54 (11 Mars 2021)

Après quelques tests, le chemin va bien chercher les fichiers et dossiers sur le cloud !

Comme je n'utilise pas le cloud  le script met une erreur de dossier non trouvés dès que le chemin arrive après "com~apple~CloudDocs".
Jusqu'à ce dossier pas de problème, dès qu'on ajoute "1-Sauvegarde Philippe" il plante, même si chez moi j'ai ajouté ce dossier dans "com~apple~CloudDocs" sur le disque dur, il va sur le cloud le chercher, donc je ne peux pas faire de tests.

Je suis désolé mais si les fichiers ne sont pas sur le disque dur, je ne sais pas faire .


----------



## plm222 (12 Mars 2021)

zeltron54 a dit:


> Après quelques tests, le chemin va bien chercher les fichiers et dossiers sur le cloud !
> 
> Comme je n'utilise pas le cloud  le script met une erreur de dossier non trouvés dès que le chemin arrive après "com~apple~CloudDocs".
> Jusqu'à ce dossier pas de problème, dès qu'on ajoute "1-Sauvegarde Philippe" il plante, même si chez moi j'ai ajouté ce dossier dans "com~apple~CloudDocs" sur le disque dur, il va sur le cloud le chercher, donc je ne peux pas faire de tests.
> ...


Ils sont sur le disque dur , le chemin est celui précité.çà a bien fonctionné pour 7 fichiers


----------



## zeltron54 (12 Mars 2021)

Je vais continuer à chercher une solution !
Mais pour comprendre le problème, essai depuis une application quelconque d'enregistrer un document dans ce dossier , en faisant "enregistrer sous" et essai de naviguer jusq'à ton dossier, le finder refuse ce choix !

Bon je continu d' essayer d'y accéder autrement, mais le finder refuse le chemin...


----------



## zeltron54 (13 Mars 2021)

Bonjour,

Je te joins un script pour tests...
Ne pas oublier de changer l'adresse d'envoi du mail qui se trouve la 18ième ligne avant la fin.

```
set toaddresslist to "ZELTRON54@free.fr"
```

le script te demande la date AAAAMM et cherche tous les fichiers commençant par cette date dans le dossier factures de chaque structure et les inclus en PJ dans le mail ( 1 par structure).

Bon tests
Dis moi si cela fonctionne comme tu veux.

```
-- envoi mail avec PJ des fichiers AAAAMM dans /Users/mon nom/Library/Mobile Documents/com~apple~CloudDocs/1-Sauvegarde Philippe/01-MAISONS SCCV/Nom de la structure 1/Facture
property pj : ""
property ladate : ""
property lemois : ""
property lannee : ""
property structureencours : ""
property structure : ""
property lechemin : ""
set pj to {}

tell application "Finder"
    set Chemin to (path to documents folder as text) -- chemin pour récup nom users
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --construit le chemin jusqu'a mobile documents
    set elements to text items of Chemin
    set Chemin to (items 1 thru -3 of elements) & "library:Mobile Documents:" as string -- chemin au format texte du dossier à explorer
    set Chemin to Chemin as alias -- chemin au format mac
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    display dialog "Saisir la date au format AAAAMM" default answer "" -- demande saisi date
    
    set ladate to text returned of result
    set lemois to text items 5 thru 6 of ladate as string -- recup le mois
    set lannee to text items 1 thru 4 of ladate as string -- recup l annee
    set structureencours to ""
    
    my inspecter(Chemin, ladate, lemois, lannee)
end tell

on inspecter(un_dossier)
    tell application "Finder"
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            set lefichier to chaque_fichier
            set nom to name of chaque_fichier --récupère le nom du fichier
            
            if (count of nom) > 5 then -- verifier > 5
                
                set debutnom to characters 1 thru 6 of nom as string
                if debutnom = ladate then -- si debut du nom egale ladate
                    
                    set lechemin to chaque_fichier as string -- recup le chemin du fichier en texte
                    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
                    set AppleScript's text item delimiters to {":"}
                    set elements to text items of lechemin
                    set structure to (item -3 of elements) as string -- recup le nom de la structure
                    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                    
                    if structure = structureencours or structureencours = "" then -- verifie si toujours dans meme dossier structure
                        set end of pj to lechemin
                        set structureencours to structure
                    else
                        my envoi()
                        set pj to {}
                        set end of pj to lechemin
                        set structureencours to structure
                    end if
                end if
            end if
        end repeat
        
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter

set nbpj to count pj -- envoi du dernier dossier structure
if nbpj > 0 then
    my envoi()
end if

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

on envoi()
    tell application "Mail"
        set CR to (ASCII character 13) -- initialise un retour ligne -- défini le retour ligne pour préparer le contenu du mail
        
        set toaddresslist to "ZELTRON54@free.fr" -- adresse mail ou envoyer le mail
        
        set objet to "TVA " & ladate & " " & structureencours -- prepare le contenu objet
        set contenu to "Bonjour, " & CR & CR & "veuillez trouver en PJ les factures concernant la " & structureencours & " pour le mois de " & lemois & "/" & lannee -- prépare le contenu du mail
        set nbpj to count pj
        
        set newMessage to make new outgoing message with properties {subject:objet, content:contenu} -- prépare le mail
        
        tell newMessage
            make new to recipient at end of to recipients with properties {address:toaddresslist} -- envoi le mail
            set lapiecejointe to lechemin as alias
            
            repeat with i from 1 to nbpj
                set mapj to item i of pj as alias
                tell content of newMessage to make new attachment with properties {file name:mapj} at after last paragraph
            end repeat
            
            tell content of newMessage to make new attachment with properties {file name:lapiecejointe} at after last paragraph
        end tell
        delay 1
        send newMessage
    end tell
end envoi
```


----------



## zeltron54 (13 Mars 2021)

Un petit bug de corrigé.
Il envoyait les fichiers avec la date même s'il étaient en dehors du dossier "facture".

Le script modifié.


```
-- envoi mail avec PJ des fichiers AAAAMM dans /Users/mon nom/Library/Mobile Documents/com~apple~CloudDocs/1-Sauvegarde Philippe/01-MAISONS SCCV/Nom de la structure 1/Facture
property pj : ""
property ladate : ""
property lemois : ""
property lannee : ""
property structureencours : ""
property structure : ""
property lechemin : ""
set pj to {}

tell application "Finder"
    set Chemin to (path to documents folder as text) -- chemin pour récup nom users
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --construit le chemin jusqu'a mobile documents
    set elements to text items of Chemin
    set Chemin to (items 1 thru -3 of elements) & "library:Mobile Documents:" as string -- chemin au format texte du dossier à explorer
    set Chemin to Chemin as alias -- chemin au format mac
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    display dialog "Saisir la date au format AAAAMM" default answer "" -- demande saisi date
    
    set ladate to text returned of result
    set lemois to text items 5 thru 6 of ladate as string -- recup le mois
    set lannee to text items 1 thru 4 of ladate as string -- recup l annee
    set structureencours to ""
    
    my inspecter(Chemin, ladate, lemois, lannee)
end tell

on inspecter(un_dossier)
    tell application "Finder"
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            set lefichier to chaque_fichier
            set nom to name of chaque_fichier --récupère le nom du fichier
            
            if (count of nom) > 5 then -- verifier > 5
                
                set debutnom to characters 1 thru 6 of nom as string
                if debutnom = ladate then -- si debut du nom egale ladate
                    
                    set lechemin to chaque_fichier as string -- recup le chemin du fichier en texte
                    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
                    set AppleScript's text item delimiters to {":"}
                    set elements to text items of lechemin
                    set structure to (item -3 of elements) as string -- recup le nom de la structure
                    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                    if (item -2 of elements) = "facture" then
                        if structure = structureencours or structureencours = "" then -- verifie si toujours dans meme dossier structure
                            set end of pj to lechemin
                            set structureencours to structure
                        else
                            my envoi()
                            set pj to {}
                            set end of pj to lechemin
                            set structureencours to structure
                        end if
                    end if
                end if
            end if
        end repeat
        
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter

set nbpj to count pj -- envoi du dernier dossier structure
if nbpj > 0 then
    my envoi()
end if

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

on envoi()
    tell application "Mail"
        set CR to (ASCII character 13) -- initialise un retour ligne -- défini le retour ligne pour préparer le contenu du mail
        
        set toaddresslist to "ZELTRON54@free.fr" -- adresse mail ou envoyer le mail
        
        set objet to "TVA " & ladate & " " & structureencours -- prepare le contenu objet
        set contenu to "Bonjour, " & CR & CR & "veuillez trouver en PJ les factures concernant la " & structureencours & " pour le mois de " & lemois & "/" & lannee -- prépare le contenu du mail
        set nbpj to count pj
        
        set newMessage to make new outgoing message with properties {subject:objet, content:contenu} -- prépare le mail
        
        tell newMessage
            make new to recipient at end of to recipients with properties {address:toaddresslist} -- envoi le mail
            set lapiecejointe to lechemin as alias
            
            repeat with i from 1 to nbpj
                set mapj to item i of pj as alias
                tell content of newMessage to make new attachment with properties {file name:mapj} at after last paragraph
            end repeat
            
            tell content of newMessage to make new attachment with properties {file name:lapiecejointe} at after last paragraph
        end tell
        delay 1
        send newMessage
    end tell
end envoi
```


----------



## plm222 (21 Mars 2021)

Bonjour et merci. (désolé de mon retour tardif)
La procédure est tres tres longue.
un mail est parti et après petit popup "erreur de script"
Ne t'embête pas Zeltron 54, je le fais manuellement .
Bon Dimanche et encore merci d'avoir passé du temps !
Philippe


----------



## zeltron54 (21 Mars 2021)

Bonjour,

Il n'y a pas eu d'erreur de script c'est simplement que une boite de dialogue disant que c'était terminé s'est affichée et sa validation n'a pas été effectuée assez vite (il faut afficher le finder)

Le temps d'envoi est long car il y a 1 seconde de délai a chaque fichier trouvé , délai nécessiare pour que mail ait le temps de charger la pièce jointe.


----------

