L'erreur de paramètre est due au fait que l'un des paramètres que vous envoyez à la fonction save
est erronée. Le site f
est le paramètre attachment
pour être sauvé - c'est bien.
Le problème est le second paramètre, qui, comme vous l'avez dit, est un POSIX file
(un chemin composé de barres obliques, par ex. /Users/hitzg/Desktop/some_file.txt
).
Cependant, la variable saveAsName
est dérivé de saveToFolder
qui obtient le chemin du fichier à partir de l choose folder
commande. Cette commande renvoie un chemin HFS (composé de deux-points, par ex. Macintosh HD:Users:hitzg:Desktop:some_file.txt
).
La solution consiste donc simplement à décider du type de format de chemin d'accès au fichier que vous allez choisir, et à vous y tenir. Vous pouvez SOIT utiliser les chemins posix, et changer cette ligne du script (raccourci pour la lisibilité) de ceci :
set saveToFolder to (choose folder) as string
à ça :
set saveToFolder to POSIX path of (choose folder)
OU utiliser les chemins HFS, et changer cette ligne du script :
save f in POSIX file saveAsName
à ça :
save f in file saveAsName
Cela corrige votre erreur de paramètre, mais je n'ai pas testé le reste de votre script pour voir comment il se comporte. En le lisant, il n'y a pas d'erreurs flagrantes, donc je n'anticipe pas d'autres problèmes majeurs.
ADDENDUM
J'aimerais proposer quelques modifications à votre script original qui, selon moi, rationalise le code tout en le rendant plus efficace et performant. Votre script existant est excellent, cependant avec une utilisation stratégique de l'AppleScript whose
on peut éliminer le premier des repeat
tout en améliorant les performances de la seconde.
set saveToFolder to (choose folder) as text
tell application "Microsoft Outlook"
set srcFolder to mail folder "Inbox" of exchange account "FOO"
set selectedMessages to a reference to (messages of srcFolder whose ¬
class of attachments contains attachment and ¬
"From: First Last <scanner@some.some>" is in headers)
set attFiles to a reference to attachments of selectedMessages
set [n, m] to [count selectedMessages, count attFiles]
repeat with f in the attFiles
set savePath to saveToFolder & name of f
save f in file savePath
end repeat
end tell
display alert "" & m & " attachments were saved" message ¬
"These belonged to " & n & " messages" as ¬
informational buttons {"OK"} default button 1
L'élément clé de cette version du script est la mise en œuvre de l'option whose
filtre ici :
set selectedMessages to a reference to (messages of srcFolder whose ¬
class of attachments contains attachment and ¬
"From: First Last <scanner@some.some>" is in headers)
Au lieu de rechercher dans tous les messages de votre boîte de réception les messages envoyés par un expéditeur particulier, puis de saisir les pièces jointes, le premier critère du filtre sélectionne instantanément les seuls messages de votre boîte de réception qui comportent des pièces jointes ; les messages sans pièces jointes sont superflus pour nos besoins, nous n'avons donc même pas besoin de les prendre en considération. Le deuxième critère spécifie que les e-mails doivent provenir d'une personne spécifique, bien que l'option address of sender
ne peut malheureusement pas être incorporé dans le filtre, donc à la place, j'ai utilisé les en-têtes du message pour m'assurer qu'il contient le code approprié. "From: ..."
chaîne.
Pour formater cette chaîne, il suffit d'obtenir le headers
pour un message de l'expéditeur spécifique, et parcourez-le jusqu'à ce que vous tombiez sur quelques lignes qui ressemblent à ceci :
From: First Last <scanner@some.some>
Subject: Hello World!
Thread-Topic: Hello Again
Thread-Index: AdQD5jaiEJ7GiUlKRYeD5LaN3BaSpA==
Date: Thu, 14 Jun 2018 13:22:53 +0000
Message-ID: <B64BBE7A4C13095094C6A44D85FA3FDB5085651F@ABCD-mail.somemailbox.foo.com>
Il sera à peu près au milieu du texte de l'en-tête. Ensuite, assurez-vous que votre texte de filtre correspond au "From:"
(copier-coller), car il sera très certainement le même dans tous les courriels de cet expéditeur, à moins qu'il n'ait changé son nom et son prénom à un moment donné (ce qui peut, bien sûr, être absent).
Un filtre un peu plus souple, si vous craignez que les noms et prénoms aient pu changer au fil du temps, consisterait simplement à filtrer les données de la base de données. headers
pour voir s'ils contiennent seulement l'adresse e-mail "scanner@some.some"
. Étant donné que vous ne chercherez que dans votre boîte de réception, il est raisonnable de supposer que toute occurrence de cette adresse électronique dans l'en-tête d'un message de la boîte de réception signifie que le message provient de cette adresse ou qu'il a été envoyé en copie à cette adresse ainsi qu'à vous-même :
set selectedMessages to a reference to (messages of srcFolder whose ¬
class of attachments contains attachment and ¬
"<scanner@some.some>" is in the headers)
Le reste du script est plus ou moins le même, avec la correction de l'erreur de paramètre implémentée.
Après avoir testé le script sur mon système, il a fonctionné comme prévu et s'est montré très efficace. Le goulot d'étranglement de la vitesse pour moi était de devoir télécharger chaque pièce jointe afin de l'enregistrer, il y avait donc une considération de transfert de données lors de l'exécution contre mon dossier de courrier Exchange.
Lorsqu'on l'exécute par rapport à un dossier de courrier local contenant des pièces jointes déjà téléchargées, l'enregistrement des pièces jointes est pratiquement instantané.
0 votes
J'ai eu un problème différent avec Applescript+Outlook et j'ai appris qu'il existe une voie rapide vers le support Microsoft. Malheureusement, ils n'ont rien pu faire (ils ont dit que mon problème était dû à la conception) mais je pense que cela vaut la peine d'essayer. Si vous obtenez une réponse de Microsoft, vous pouvez répondre vous-même à cette question. Allez dans Outlook, allez dans le menu Apple, choisissez Aide->CheckForUpdates. De là, vous pouvez rejoindre le programme "Insider Fast". Faites-le. (Vous pouvez vous désinscrire plus tard). Ensuite, retournez dans le menu Aide d'Outlook et vous trouverez une nouvelle option "Contacter le support" qui lance une session de chat avec Microsoft. Cela vaut la peine d'essayer.
0 votes
@jay613 merci pour la suggestion. Je vais voir si je peux trouver le temps de le faire.
0 votes
Avez-vous essayé de commenter des lignes individuelles pour voir si une ligne particulière
set …
est à l'origine du problème ?0 votes
@TimothyMueller-Harder Je n'ai pas essayé. Mais je ne suis pas sûr de comprendre exactement ce que vous voulez dire. Si je commente n'importe quel
set ...
ligne alors cela générerait un problème supplémentaire, non ? L'erreur est causée par lesave ...
ligne.0 votes
Désolé, j'ai mal lu le code ! Vous avez raison, bien sûr.