How do I add a Name Prefix to a Contact using AppleScript? - macos

Apple's Contacts App had a defined field for a name prefix (e.g. "Dr.").
Using AppleScript if I retrieve the name property, the prefix is included. However, there does not appear to be/exist a prefix property. There IS a suffix property which I am able to read and write, but I need to be able to specifically WRITE (e.g. add) a prefix to a contact.
Any/All help would be appreciated!!

In the AppleScript dictionary (⇧⌘L ) for Contacts, look at the properties of the class Person.
If you have added a Prefix to the contact via, e.g., Contacts > Card > Add Field, then it is assigned to the title property.
Example AppleScript code:
tell application "Contacts"
set theContact to the first person ¬
whose title is not missing value
return title of theContact
end tell

#HirsuteJim, here is setting the prefix programatically:
tell application "Contacts"
set title of person 1 to "Dr. "
save
quit -- optional
end tell

Thanks to #user3439894 I ended up with:
tell application "Contacts"
tell every person in group "ALG"
set title to "(ALG)"
delete suffix
save
end tell
end tell

Related

How do I make a Pop-Up Menu from my Contacts Group names, using AppleScript and Numbers?

Please note: The site is not letting me post this question unless I incorrectly format it i.e. the two middle sections of "code" which aren't actually code. I've done my best to edit it, to fix it, and I apologise if the formatting is poor.
I’ve found and adjusted two scripts, which run, individually. This is my first AppleScript project, and I’d like help joining them together to MAKE ONE SCRIPT.
I want Script 2 to use the result from Script 1.
e.g. set menuItems to (Script 1 Result names)
I made a dummy testGroup in my Contacts. The Pop-Up Menu only needs the names. I will use the corresponding email addresses later, in another script.
I hope this is clear enough. Thanks in advance for your help.
Script 1
--returns Contacts testGroup’s names and email addresses
set myList to ""
tell application "Contacts" to repeat with p in people in group "testGroup"
if emails of p is {} then
set e to ""
else
set e to value of email 1 of p
end if
set myList to myList & name of p
end repeat
Script 1 Result needs parsing...
"Joe BloggsMolly MousePeter Pan"
to this...
{"Joe Bloggs", "Molly Mouse", "Peter Pan"}
so I can use it in Script 2 menuItems below.
Script 2 MUST use names from Script 1 Result, like this
-- Make Pop-Up Menu in Numbers spreadsheet which is already open.
set menuItems to {"Joe Bloggs", "Molly Mouse", "Peter Pan"}
tell application "Numbers"
activate
tell the first table of the active sheet of document 1
tell cell "A3"
set value to item 1 of menuItems
set the format to pop up menu
end tell
end tell
end tell
tell application "System Events"
tell application process "Numbers"
set frontmost to true
tell window 1
click radio button "Cell" of radio group 1
repeat with i from 2 to (count menuItems)
click button 1 of group 1 of scroll area -1
keystroke (item i of menuItems)
end repeat
end tell
end tell
end tell
The first script is going through the items of a list list to create a string, while the second script is just wanting the list. Since the Contacts application will give you a list of names, the first script isn't needed at all - the menuItems of the second script can just be set with:
tell application "Contacts" to set menuItems to the name of people in group "testGroup"

Get property of items in list

I want to quickly create a list of all of the names of every menu item in the menu bar tree for an app.
tell application "System Events"
tell first process where name is "Script Editor"
set menuContents to entire contents of menu bar 1
return name of menuContents
end tell
end tell
This code throws error number -1728, which means the following according to documentation.
The referenced object doesn’t exist. This is a run-time resolution error,
such as when attempting to reference a third object when only two
objects exist.
EDIT:
I'm not completely sure, but it seems that the problem arises because entire contents dereferences the UIElements from their source. Properties of UIElements might be referenced by pointer, which means that the UIElements don't have access to them once dereferenced.
You cannot use return name of menuContents because menuContents, in the context of your code, is a list and a list object does not have a name property.
The properties of a list object are: class, length, rest and reverse
So, any of the following are valid commands:
return class of menuContents
return length of menuContents
return rest of menuContents
return reverse of menuContents
The elements of list objects are: item
To get the name property of each item in the list, use the following example:
set menuNames to {}
tell application "System Events"
tell application process "Script Editor"
set menuContents to entire contents of menu bar 1
repeat with thisItem in menuContents
set end of menuNames to name of thisItem
end repeat
end tell
end tell
return menuNames
See the list class reference it the AppleScript Language Guide.

Applescript - get note from Notes.app

can someone explain this weird behaviour to me? I am trying to get a note named "TEST" but even when I run this command:
tell application "Notes"
activate
set theName to get name of the first note
display dialog theName
set theNote to the note whose name is theName
end tell
Dialog will correctly display name (that is a "TEST").
But this code resulted with an error: "Can’t get note whose name = \"TEST\"."
What am I doing wrong?
Drop the "whose name is" and you should get what you're after.
e.g,
tell application "Notes"
activate
set theName to get name of the first note
display dialog theName
set theNote to the note theName
end tell

Change iChat settings with applescript?

Is there a way to create a script that will change the preferences of iChat to run the script when a message is received?
In other words, I want to make a script to change the iChat preferences to enable the "Message Received.applescript" i have created. Wow, this is confusing. Let me simply this.
I want a script that does this:
Activate iChat
Open iChat Preferences
Move to "Alerts" tab
select event "Message Received"
turn on "Run applescript"
select a certain script from the script folder called "Message Receive.applescript"
please help?
You just need to edit iChat's plist file. defaults is a bit awkward for nested values so use System Events instead:
tell application "System Events"
set EventActions to property list item "EventActions" of property list file ((path to preferences folder from user domain as text) & "com.apple.iChat.plist")
repeat with e in {property list item "MessageNotification" of EventActions, property list item "SubsequentMessage" of EventActions}
make new property list item at end of e with properties {name:"RunAppleScript", value:true}
make new property list item at end of e with properties {name:"iChatAppleScriptsKey", value:{"~/Library/Scripts/iChat/Message Received.scpt"}}
end repeat
end tell
This will attach "Message Received.scpt" to both initial text invitations and subsequent messages - you could simplify it if you only wanted it for subsequent messages. Also note you may need to relaunch iChat for the change to take effect.

Processing list of selected text in automator with applescript

While trying to make an automator action that opens multiple tabs from selected text as input I ran into an applescript issue I wasn't able to solve for awhile. This includes the answer and I'm posting this here because I just wasn't able to find documentation on how to handle data in "input" for a receives selected "text" in "any application" automator action, everything is for files which comes in as a list already.
When putting an applescript action in, you get:
on run {input, parameters}
the problem here is that input isn't in a list format and trying to do anything with it breaks the script or throws an error. ie I can't do:
repeat with URL in input
set this_URL to URL
So how can I treat a list of selected text as a list of items?
the solution is first treat input as a string then break apart every paragraph.
on run {input, parameters}
set inputText to input as string
set URL_list to every paragraph of inputText
Without treating input "as string" first before doing "every paragraph of" it won't work.
Here's the end working script, replace the "some_url" with your own. You'll be able to select several lines of text in an editor and treat each one as a parameter to your fixed url opening each in a new safari tab. This could be expanded upon by having each line be delimited for multiple params on the url.
on run {input, parameters}
set inputText to input as string
set URL_list to every paragraph of inputText
tell application "Safari"
activate
repeat with URL in URL_list
set this_URL to URL
# extra processing of URL could be done here for multiple params
my new_tab()
set tab_URL to "http://some_url.com?data=" & this_URL
set the URL of document 1 to tab_URL
end repeat
end tell
return input
end run
on new_tab()
tell application "Safari" to activate
tell application "System Events"
tell process "Safari"
click menu item "New Tab" of ¬
menu "File" of menu bar 1
end tell
end tell
end new_tab
As an example say you had the list and had a service of the above using "http://stackoverflow.com/posts/" & this_URL
6318162
6318163
6318164
you could now select them click services and choose your "StackOverflow - view questions" service and it'll append and open each one in a new safari tab. In my case I needed to verify multiple dns entries in our server as still valid and do a bunch of whois lookups.
I was looking for the same thing, just for files as input from Automator to AppleScript.
ddowns's trick didn't work for that, but ended up using this, hope it's helpful for someone looking for solving the same issue I ran into:
on run {input, parameters}
-- create empty list
set selectedFiles to {}
-- add each list item to the empty list
repeat with i in input
copy (POSIX path of i) to end of selectedFiles
end repeat
-- show each item (just for testing purposes of course)
repeat with currentFile in selectedFiles
display dialog currentFile as text
end repeat
end run
As Hanzaplastique says, for AppleScript within Automator, you don't need the Safari AppleScript because there's an Action for that. I use the following Actions:
Extract URLs from Text (actually the 'Extract Data from Text' Action)
Run AppleScript
Display Webpages
I use it as a Workflow added to the Services menu so that I can right-click on selected text in an email and open multiple URLs in Safari tabs.
In particular, I get Server / WordPress updates in an email but the URLs are just the top level of the domains and I want to jump to the plugins page of WordPress. So, my AppleScript (with thanks to Hanzaplastique) is:
on run {input, parameters}
set AppleScript's text item delimiters to {return & linefeed, return, linefeed, character id 8233, character id 8232}
-- create empty list
set selectedFiles to {}
-- add each list item to the empty list
repeat with i in input
set AppleScript's text item delimiters to {" "}
set i to i & "/wp-admin/plugins.php"
copy i to end of selectedFiles
end repeat
return selectedFiles
end run
I found I needed the 'return selectedFiles'. The always mysterious (to me) text delimiters may not be necessary and come from the previous version which only pulled out a single URL.

Resources