Published January 5, 2022
Hello. I've always wanted to learn AppleScript in order to replace my Mac tracking apps and save a bit of money. Over this break, I had time to do that. And it seems to be about as hard as I expected it to be, which is to say it's simple to the point of being hard to learn. Here's an example
Applescripts is written in this natural language sort of format. You expect that makes it easier to learn and read and write, but it doesn't unless you know the syntax. Much like how a Python aficionado would find it difficult to explain to a newbie how they know of all the different built-in functions, I find it similarly hard to learn the types and values that variables can take on in an AppleScript.
I've written a few atomic scripts and tips I wanted to share, and I'll show them in this post. Like usual, examples of other scripts helped me learn how to write my own. For Applescripts, I had an interesting problem that my example code wouldn't work when I began to switch in my own variables. This leads me to tip #1
Everyone has a default name for trash variables that will be replaced by something more descriptive later, and mine happens to be "yes". However, if you name your variables yes in your Applescript, you are going to have a bad time. The script throws a funky error that doesn't mention that yes is a built-in word that cannot be assigned.
This means when you try to write a more complicated Applescript and want to be a good little SWE who uses objects and functions, you will encounter various forum posts which tell you that AS is not meant for this stuff and you should give up. Maybe I just phrased my problem poorly, but my desire to make functions is solved perfectly by subroutines, which nobody mentioned until I saw it on an Applescripts blog.
There are also not AppleScript blogs in the same way that there are Javascript/CSS blogs. Being Apple fans, each of the AS tutorial websites is written in a legible fashion. However they are nowhere as smooth as those CSS blogs showing live examples of X property. I understand that this is because scripts cannot be played online, but it still makes it hard when they show no pictures of what the output is supposed to look like.
OK, onto the examples.
############ Get current spotify usage on getSpotify() set retList to {""} if application "Spotify" is running then tell application "Spotify" if player state is playing then set tr to current track set retList to {name of tr, artist of tr, player position, (duration of tr) / 1000, id of tr} end if end tell end if return retList end getSpotify
My problem with learning from example Applescript I read online is that the examples are not clearly cross-applicable and the errors you get are not helpful. I can read this code perfectly fine, and you probably can too — but it's a trap to trick you into thinking you know how to write it! This took me like an hour because I kept naming my variable yes, but even when I stopped that it still took me a while to realize "application "x"" is not replaceable with a macro like it would be in C.
########## get current date/time formatted as a sortable string on date_format(adate) -- Old_date is text, not a date. set {year:y, month:m, day:d, time:t} to adate set delim to "." set yada to (y as string) & delim & (m as integer) & delim & d & delim & t return yada end date_format
Here you'll note that I did not include the word "yes" as my variable, but notice how similar it is to the current variable "yada". Wonder how that happened...
Remixed from Stack Overflow
############ Get URL and name of focused app set windowTitle to "" tell application "System Events" set frontApp to first application process whose frontmost is true set frontAppName to name of frontApp tell process frontAppName tell (1st window whose value of attribute "AXMain" is true) set windowTitle to value of attribute "AXTitle" end tell end tell set appfilepath to POSIX path of application file of frontApp end tell
Remixed from Stack Overflow, [1] [2]
############ Get URL of current chrome/safari/preview/finder tab set currentTabUrl to "" if (frontAppName = "Safari") or (frontAppName = "Webkit") then tell application "Safari" to set currentTabUrl to URL of front document else if (frontAppName = "Google Chrome") or (frontAppName = "Google Chrome Canary") or (frontAppName = "Chromium") then tell application "Google Chrome" to set currentTabUrl to URL of active tab of front window else if (frontAppName = "Preview") then tell application "Preview" to set currentTabUrl to path of front document else if (frontAppName = "Finder") then tell application "Finder" if exists Finder window 1 then set currentDir to target of Finder window 1 as alias else set currentDir to desktop as alias end if set currentTabUrl to POSIX path of currentDir end tell end if
That's all I got for now. I'm going to try to run a continuous log of my current laptop's "context", so I need file appending eventually. Until then, cya later!