Automation & Scripting

RSS for tag

Learn about scripting languages and automation frameworks available on the platform to automate repetitive tasks.

Automation & Scripting Documentation

Posts under Automation & Scripting subtopic

Post

Replies

Boosts

Views

Activity

AppIntent, should I delete previous donations to the system and how?
Hi, In my application I am donating AppIntent instances that I have to the system using the donate() API. I recently came across this article that talks about deleting donations but it does not mention how to handle AppIntent instances. I am wondering when working with dynamic AppIntents (with different properties that can change in the future), should I be worried about "outdated" donated AppIntent instances? And if yes how can I delete previously donated AppIntent instances.
0
0
176
Mar ’25
Displaying an email in mail preview pane by message ID
Hi, I want to open an email message with AppleScript. Everything is working correctly, but in the Mail app, instead of focusing on targetMessage, it highlights the email after the target message. When I use: tell targetMessage to open the correct email opens in new window but the wrong email is highlighted in the Mail app list. tell application "Mail" activate set targetAccount to missing value repeat with anAccount in every account if name of anAccount is "AccountName" then set targetAccount to anAccount exit repeat end if end repeat if targetAccount is not missing value then set targetBox to missing value repeat with aBox in mailboxes of targetAccount if name of aBox is "MailboxName" then set targetBox to aBox exit repeat end if end repeat if targetBox is not missing value then set targetMessage to missing value set oneWeekAgo to (current date) - (7 * days) set filteredMessages to (every message of targetBox whose date received ≥ oneWeekAgo) repeat with aMessage in filteredMessages try if message id of aMessage is "MessageID" then set targetMessage to aMessage exit repeat end if end try end repeat if targetMessage is not missing value then if (count of message viewers) > 0 then set mailViewer to message viewer 1 else set mailViewer to make new message viewer end if tell mailViewer set selected mailboxes to {targetBox} delay 0.2 set selected messages to {targetMessage} end tell return "Found" else return "Message Not found" end if else return "Folder Not found" end if else return "Account Not found" end if end tell Why is this behavior happening?
1
0
186
Mar ’25
Does DynamicOptionsProvider work on watchOS?
I'm curious, why DynamicOptionsProvider is available on watchOS? Is there any way to present options to the user? For example in Emoji Rangers project: struct EmojiRangerSelection: AppIntent, WidgetConfigurationIntent { static let intentClassName = "EmojiRangerSelectionIntent" static var title: LocalizedStringResource = "Emoji Ranger Selection" static var description = IntentDescription("Select Hero") @Parameter(title: "Selected Hero", default: EmojiRanger.cake, optionsProvider: EmojiRangerOptionsProvider()) var hero: EmojiRanger? struct EmojiRangerOptionsProvider: DynamicOptionsProvider { func results() async throws -> [EmojiRanger] { EmojiRanger.allHeros } } func perform() async throws -> some IntentResult { return .result() } } On watchOS we usually use recommendations() to give the user predefined choice of configured widgets. Meanwhile in AppIntentProvider recommendations are empty: struct AppIntentProvider: AppIntentTimelineProvider { ... func recommendations() -> [AppIntentRecommendation<EmojiRangerSelection>] { [] } } Does it imply that there's a way to use DynamicOptionsProvider on watchOS somehow? BTW, WidgetConfiguration.promptsForUserConfiguration() is one of the methods that are not available on watchOS. And also, the Emoji Ranger project doesn't show widgets (complications) on watchOS out of the box.
0
2
244
Mar ’25
Using Automator
Hi Here is my problem. I have a large number of portrait pictures in my adobe lightroom catalogue which I need to email to the subjects of the portraits. These peoples names and email addresses are stored in my pictures metadata and I am able to export the pictures with accompanying text or CSV files containing the names &amp; addresses. What I want to do is export the pictures in bulk and automagically create and send individual emails for each picture, preferably with the persons name in the salutation at the start of the email. I have done some googling trying to find a solution to this. I think that I need to use automator. (The lightroom option of mailing directly from within the programme isn't going to do the job, each mail would need to be addressed and written by hand each time). I have been playing around with it, but can see no way to populate the email address field or add the attachment. Can anyone help me out, with even just the basic outline, of how this would be achieved please?
0
0
121
Mar ’25
Start multiple Live Activities in the perform() of App Intents
In my case, when two functions that start each Live Activity(not connected each other) are performed in LiveActivityIntent's perform(), it seems that only one will start. (It's the same to start independently with two Task{}) And, set one to 'opensIntent' and separate it by opening another LiveActivityIntent, the result is same. Also, every time I tap the Intent directly in the shortcut app, one activity will end within a matter of seconds, even if there are two for a while. But, If openAppWhenRun to true, it seem to works without any problems. I would appreciate it if you could give me a tip to fix this problem.
0
0
143
Mar ’25
syntax errors when working with folders that have “‘“ in it such as “greg’s folder"
I'm unable to fix syntax errors when using folders such as “greg’s folder" error "86:87: syntax error: Expected “"” but found unknown token. (-2741)" number 1 i’ve created an apple script to run python tool to extract “.rpa” files. the script works well except to selecting games that are in a folder with “‘". any ideas to properly to this? thank you. -- Function to escape special characters in POSIX paths for safe shell execution on escapePOSIXPath(originalPath) set AppleScript's text item delimiters to "'" set pathParts to text items of originalPath set AppleScript's text item delimiters to "'\\''" set escapedPath to pathParts as text set AppleScript's text item delimiters to "" -- Reset delimiters -- Wrap in single quotes return "'" & escapedPath & "'" end escapePOSIXPath -- Get the current app's POSIX path set currentAppPath to POSIX path of (path to me) -- Construct the expected path for rpatool.py set scriptPath to currentAppPath & "Contents/Resources/Scripts/rpatool.py" -- Check if rpatool.py exists set scriptExists to do shell script "test -e " & quoted form of scriptPath & " && echo true || echo false" if scriptExists is "false" then -- Ask user to select the rpatool.py file display dialog "rpatool.py was not found. Please select its location." set rpaToolFile to choose file with prompt "Select the rpatool.py script" of type {"public.python-script"} set scriptPath to POSIX path of rpaToolFile end if -- Escape the path for safe execution set scriptPath to escapePOSIXPath(scriptPath) -- Prompt user to select the game application set appFile to choose file with prompt "Select the Game app with RPA files" of type {"com.apple.application"} set appPath to POSIX path of appFile set gameFolderPath to appPath & "/Contents/Resources/autorun/game" -- Check if the 'game' folder exists set gameFolderExists to do shell script "test -d " & quoted form of gameFolderPath & " && echo true || echo false" if gameFolderExists is "false" then display dialog "The 'game' folder was not found in the selected app's directory. Exiting..." return end if -- Find all .rpa files in the game folder set fileList to paragraphs of (do shell script "find " & quoted form of gameFolderPath & " -name '*.rpa' -type f") -- Check if .rpa files exist if fileList is {} then display dialog "No .rpa files found in the 'game' folder. Exiting..." return end if -- Open Terminal and change directory set firstCommand to "cd " & quoted form of gameFolderPath do shell script "osascript -e " & quoted form of ("tell application \"Terminal\" to do script \"" & firstCommand & "\"") -- Process each .rpa file in Terminal display dialog "Extraction will start in Terminal and will process " & (count of fileList) & " .rpa files." repeat with aFile in fileList set aFile to escapePOSIXPath(aFile) set extractionCommand to "python3 " & scriptPath & " -x " & aFile -- Execute in Terminal try do shell script "osascript -e " & quoted form of ("tell application \"Terminal\" to do script \"" & extractionCommand & "\" in front window") delay 0.5 do shell script "osascript -e " & quoted form of "tell application \"Terminal\" to activate" on error errMsg display dialog "Error executing command: " & errMsg end try end repeat Test Run with error: tell current application path to current application --> alias "Macintosh HD:Users:Greg:Downloads:Ren'Py:RPA Extractor Mac 2.9.scpt" do shell script "test -e '/Users/Greg/Downloads/Ren'\\''Py/RPA Extractor Mac 2.9.scptContents/Resources/Scripts/rpatool.py' && echo true || echo false" --> "false" end tell tell application "Script Editor" display dialog "rpatool.py was not found. Please select its location." --> {button returned:"OK"} choose file with prompt "Select the rpatool.py script" of type {"public.python-script"} --> alias "Macintosh HD:Users:Greg:Downloads:Ren'Py:Test Game:rpatool.py" choose file with prompt "Select the Game app with RPA files" of type {"com.apple.application"} --> alias "Macintosh HD:Users:Greg:Downloads:Ren'Py:Test Game:Test Game.app:" end tell tell current application do shell script "test -d '/Users/Greg/Downloads/Ren'\\''Py/Test Game/Test Game.app//Contents/Resources/autorun/game' && echo true || echo false" --> "true" do shell script "find '/Users/Greg/Downloads/Ren'\\''Py/Test Game/Test Game.app//Contents/Resources/autorun/game' -name '*.rpa' -type f" --> "/Users/Greg/Downloads/Ren'Py/Test Game/Test Game.app//Contents/Resources/autorun/game/code.rpa /Users/Greg/Downloads/Ren'Py/Test Game/Test Game.app//Contents/Resources/autorun/game/fonts.rpa /Users/Greg/Downloads/Ren'Py/Test Game/Test Game.app//Contents/Resources/autorun/game/sounds.rpa" do shell script "osascript -e 'tell application \"Terminal\" to do script \"cd '\\''/Users/Greg/Downloads/Ren'\\''\\'\\'''\\''Py/Test Game/Test Game.app//Contents/Resources/autorun/game'\\''\"'" --> error "73:74: syntax error: Expected “\"” but found unknown token. (-2741)" number 1 Result: error "73:74: syntax error: Expected “\"” but found unknown token. (-2741)" number 1
2
0
171
Mar ’25
A script to open files from Finder in Vim
Here is an AppleScript script to make it possible double-click files in Finder so that they will be opened in Vim, by Normen Hansen: https://github.com/normen/vim-macos-scripts/blob/master/open-file-in-vim.applescript (it must be used from Automator). I try to simplify it and also to make it possible to use it without Automator. To use my own version, you only need to save it as application instead, like this: osacompile -o open-with-vim.app open-with-vim.applescript and then copy it to /Applications and set your .txt files to be opened using this app. Here it is, it alsmost works: -- https://github.com/normen/vim-macos-scripts/blob/master/open-file-in-vim.applescript -- opens Vim with file or file list -- sets current folder to parent folder of first file on open theFiles set command to {} if input is null or input is {} or ((item 1 in input) as string) is "" then -- no files, open vim without parameters set end of command to "vim;exit" else set firstFile to (item 1 of theFiles) as string tell application "Finder" to set pathFolderParent to quoted form of (POSIX path of ((folder of item firstFile) as string)) set end of command to "cd" &amp; space &amp; (pathFolderParent as string) set end of command to ";hx" -- e.g. vi or any other command-line text editor set fileList to {} repeat with i from 1 to (theFiles count) set end of fileList to space &amp; quoted form of (POSIX path of (item i of theFiles as string)) end repeat set end of command to (fileList as string) set end of command to ";exit" -- if Terminal &gt; Settings &gt; Profiles &gt; Shell &gt; When the shell exits != Don't close the window end if set command to command as string set myTab to null tell application "Terminal" if it is not running then set myTab to (do script command in window 1) else set myTab to (do script command) end if activate end tell return end open The only problem is the if block in the very beginning: if input is null or input is {} or ((item 1 in input) as string) is "" then What is wrong here? How to make it work? (Assuming it already works fine if AppleScript is used using Automator.)
0
0
175
Mar ’25
Interacting with the Notes application
Hello, Relatively new to AppleScripts in current gen (I've used it back in 2010s) and would like some help if someone can point me in the right direction. Is AppleScript the best/only way to interact with Notes application? (I'm on Sequioa) 1.1 I've tried to use LLM to generate a Swift app, but it still calls out to AppleScripts, so I'm wondering if I'm missing something. 1.2 If I'm going down a rabbit hole, I'd like to stop since I want to finish this quick task and move on and or fall deeply in love with AppleScripts... whichever comes first. Is There a better way to write notes? Script Editor is still a minimal IDE, I'd love to find something that will do some auto completion/suggestions because the documentation in the Script Editor is still a tad weak. (I'm used to interpreted languages like bash, ruby, etc...) where if I don't understand something I just dig into the code instead of turse documentation that just exposes public end points and does not tell you much more :( My problem: I'd like to set up a cron that periodically checks my notes, and cleans up the shared notes. Basically it's a shared set of notes that have checklist on it and cleans up. (weekly chores etc...) I want to read the notes, find out which ones have been marked checked. Reset the ones that are done, leave unfinished ones alone and reset the old ones. This is how far I've gotten: let appleScript = """``` tell application "Notes" set targetNote to note "\Test" of default account return body of targetNote end tell That works like a charm, Kind of dumb because I rather use and ID of the note not the name :( It returns the following <div><b><span style=\\"font-size: 24px\\">Test</span></b></div> <div><br></div> <ul> <li> Not Done</li> <li>Done</li> <li>Not Done yet</li> </ul> <div><br></div> <div>Single line</div> Which is a good start! Issues: There is no way to tell which Item is marked "Checked" and which one is not :( Any helps is greatly appreciated!
1
0
245
Mar ’25
Language choice sometimes pops up during Recovery
Sometimes, during Recovery, when choosing "Options" I'm presented with the Language chooser before going into the Recovery options. Other times the process moves directly into Recovery options, without any language choice. I'm running in recovery mode, after completing a fresh installation of macOS (including setting a language) and fully shutting down the OS via the menu. This happens seemingly randomly, which affects the ability to automate the process. So far I've only seen it on macOS 15. Is there some logic to why this language chooser pops up, and any way I can make it consistent (in either direction)?
3
0
341
Feb ’25
Auto Dial - 911
My app monitors users heart beats and if critical reading is noticed, it auto -dials 911 for emergency and ambulance help. I was under the impression that auto-dial may not be permitted or possible on the platform. Can anyone confirm and provide any additional guidance on if it is possible in the newer SDK/API stack or using any 3rd party service ? Thank you in advance!!
0
0
275
Feb ’25
HomeKit Location issues when the First Person comes home
I want to create automations when the first person comes Home. When Setting up the Automation on the owner device everything seems to be correct. Yet the Automation doesn‘t Wort properly. my girlfriend is listed as admin. when she has a Look at the Automation, the Location of my phone is unknown. the issue is that this leads To the following behaviour. When i come House the Automation Checks if my girlfriend is Home. All Good. When my Grilfriend comes Home the Automation doesn‘t Check where i am But directly execut the Automation.
1
0
335
Feb ’25
How to access comments and their associated text in iWork documents via AppleScript/ScriptingBridge?
Hi all, I’m developing a Mac OS application with XCode that interacts with iWork documents (Pages, Numbers, Keynote) using ScriptingBridge (and maybe AppleScript). Right now I started with Pages, assuming if it works for Pages, it will likely be similar for Numbers and Keynote. While I can successfully access and modify the main body text (e.g. the “body text” property in a Pages document), I’m having major difficulties accessing the comments (or annotations) within these documents. There are many aspects, but right now what I’m trying to achieve: For a Pages document, I need to scan the document and extract, for each comment: The content of the comment (i.e. the comment’s text). The text that is being commented on. For Numbers, similarly, I need to retrieve the commented cell’s content and the associated comment. For Keynote, the same as Pages, except I manage to get the Presenter Notes. Once done, I could replace the content accordingly. What I’ve tried: Using AppleScript commands such as: every comment of document "Test" Accessing properties like content or range of a comment. Attempting various syntaxes (including using class specifiers) to force AppleScript to recognize comments. Using ScriptingBridge in my Swift code, but I couldn’t find any mapping for a “comment” object in the Pages dictionary. However, all these attempts result in errors such as “cannot convert …” or “this class is not key value coding-compliant for the key …” which leads me to believe that the iWork scripting dictionaries may not expose comments (or annotations) in a scriptable way. Questions: Is there a supported way to access the comments (and the associated commented text) in an iWork document via AppleScript or ScriptingBridge? If so, what is the proper syntax or property name to use? (For example, should I be looking for a class named “comment”, “annotation”, or perhaps something else?) If direct access via AppleScript/ScriptingBridge is not possible, what alternative approaches would you recommend for programmatically extracting comment data from iWork documents? I apologize if my post isn't clear, it is translated from French. Any insights or examples would be greatly appreciated. Thank you!
3
0
279
Feb ’25
struggling with app automation
hi so im trying to create a simple app that has two pressable buttons that turn a spa mode on and off wishing another app so far I have the UI figured out the app works the only issue is right now when I press spa on I have setup so it opens Siri Shortcuts and enables the shortcut is there a way to make the app revert back to mine after the action is done? or is there another way to open the other app and navigate to the button within that app and enable it behind my app
0
0
294
Feb ’25
Automator error when running Watch Me Do-created script
Hi everyone, I'm trying to use Automator to batch process PDF files. I have hundreds of academic journal article PDFs whose page sizes vary from 5x7 inches to A4 format (8.27 x 11.69 inches). I want to scale all the PDFs to US Letter size (8.5 x 11.0 inches) such that smaller originals remain 100% scale but are centered on the larger page and larger originals are scaled down to fit the page. Manually opening a PDF in Preview.app, scaling it to US Letter paper, and using the Save as PDF option is producing the desired output for me. I captured my workflow using the Watch Me Do action in Automator, then adjusted it into the following AppleScript. -- a Get Specified Finder Items action to specify the input PDFs precedes this script on run {input, parameters} repeat with filePath in input -- Open the file in Preview tell application "Preview" open filePath activate end tell -- Give Preview some time to open the file delay 2.0 -- Press ⌘P set timeoutSeconds to 0.25 set uiScript to "keystroke \"p\" using command down" my doWithTimeout(uiScript, timeoutSeconds) -- Click the “Scale to Fit:” radio button. delay 2.0 set timeoutSeconds to 2.0 set uiScript to "click radio button \"Scale to Fit:\" of radio group 1 of group 1 of group 2 of scroll area 2 of splitter group 1 of sheet 1 of window 1 of application process \"Preview\"" my doWithTimeout(uiScript, timeoutSeconds) -- Click the “&lt;fill in title&gt;” menu button. delay 4.0 set timeoutSeconds to 2.000000 set uiScript to "click menu button 1 of group 2 of splitter group 1 of sheet 1 of window 1 of application process \"Preview\"" my doWithTimeout( uiScript, timeoutSeconds ) -- Save as PDF… delay 2.0 set timeoutSeconds to 2.0 set uiScript to "click menu item 2 of menu 1 of splitter group 1 of sheet 1 of window 1 of application process \"Preview\"" my doWithTimeout(uiScript, timeoutSeconds) -- Click the “Save” button. delay 8.0 set timeoutSeconds to 2.0 set uiScript to "click UI Element \"Save\" of sheet 1 of sheet 1 of window 1 of application process \"Preview\"" my doWithTimeout(uiScript, timeoutSeconds) -- Press ⌘W to close the file delay 0.25 set timeoutSeconds to 2.0 set uiScript to "keystroke \"w\" using command down" my doWithTimeout(uiScript, timeoutSeconds) end repeat return input end run on doWithTimeout(uiScript, timeoutSeconds) set endDate to (current date) + timeoutSeconds repeat try run script "tell application \"System Events\" " &amp; uiScript &amp; " end tell" exit repeat on error errorMessage if ((current date) &gt; endDate) then error "Can not " &amp; uiScript end if end try end repeat end doWithTimeout My problem arises at the Save as PDF step. When this action runs, I see the PDF menu pop open: but the Save as PDF... menu item doesn't get clicked. Instead, I get an error: Can anyone advise on how to overcome this error?
1
0
346
Feb ’25
Add the ability to remove/delete chats in the ChatGPT app using shortcuts
So Recently I’ve been making shortcuts and I noticed that I can prompt chatgpt with shortcuts to add extra functionality, I like this idea but there is 1 flaw with it and that is there is no ability to remove chats automatically, I suppose this would be fine except every time the shortcut is run it creates a new chat, usually I would have made it to remove the chat after the shortcut is finished, but since I can’t the chats would pile up as there is no way of getting rid of them automatically and it would be tedious to manually delete all the chats. also sorry if I chose the wrong topic and subtopic, I couldn’t find a topic about shortcuts
1
0
420
Feb ’25
"Not authorized to send Apple events to Terminal
We are trying to open an application "xyz.app" It worked fine until 15.1.1 versions. But facing issues with 15.2 and 15.3 The application is working fine when we navigate to xyz.app/Contents/MacOS/ and run applet in this directory. But the error "Not authorized to send Apple events to Terminal" occurs when we are trying to open the app directly. We have tried with all the available solutions like giving full disk access to terminal and application, adding my application to automation in privacy and security tabs in settings. Any help would be appreciated. Thanks!
1
0
380
Feb ’25
Shortcuts Automation Trigger Transaction Timeouts
Description The Shortcut Automation Trigger Transaction frequently times out, ultimately causing the shortcut automation to fail. Please see the attached trace for details. Additionally, the Trigger is activated even when the Transaction is declined. Details In the trace I see the error: [WFWalletTransactionProvider observeForUpdatesWithInitialTransactionIfNeeded:transactionIdentifier:completion:]_block_invoke Hit timeout waiting for transaction with identifier: <private>, finishing. Open bug report: FB14035016
13
17
1.7k
Feb ’25
Check to make sure iTunes is playing - AppleEvent timed out. (-1712)
Hi folks, I've got some music that I want playing on iTunes all the time on an older system, but it'll sometimes stop. I tried making a Applescript to check and play the music/playlist again if it stops, but I keep getting a timeout error. This is the AppleScript: repeat tell application "iTunes" if player state is paused then tell application "iTunes" to play end if delay 30 end tell end repeat I get this error: AppleEvent timed out. iTunes got an error: AppleEvent timed out. (-1712) I can't figure out why I'm getting a timeout error... anyone have any ideas?
1
0
337
Feb ’25
AppleScript help
Hello everyone, I would like to use AppleScript to transform a .csv file. To make things easier to understand, I'm attaching two files: 1- The original file in csv format 2- The file as I'd like it to look after I've run it through the script. Here are the steps involved 1-Open the file in numbers (Note: the file is located in the download folder). 2-Delete the first 6 lines 3-Delete all font styles and cell colors 4-Combine all cells in the nature of operation column of the same operation belonging to the same date in the first cell of the operation, deleting all spaces in the text is not necessary for each operation. 5- Delete all empty lines. I hope I've made my request clear. If any of you have the knowledge to do this, if it can be done at all, I'd be very grateful for their help in writing the script. Thank you in advance. 1.csv 2.csv
0
0
344
Feb ’25