I need to write script which will be runnable on each macos. It has to create simple dialog with two input boxes OK and CANCEL buttons. I read that applescript can't create dialog with two inputs. What is alternative?
Thanks
It's right, AppleScript can't create dialog with two inputs.
Take a look at the Script Library Dialog Toolkit Plus v1.1.0 on macosautomation.com
Dialog Toolkit Plus is an ASObjC-based script library for showing enhanced dialogs. Add multiple text entry fields, checkboxes, popup menus, radio buttons, path controls, extra buttons, secure fields, images, and rules to dialogs. Dialog Toolkit Plus requires macOS 10.10 or later.
--You could use two sequential dialogs:
set input1 to text returned of (display dialog "Enter the first input:" default answer "" buttons {"OK", "Cancel"} with title "First Input")
set input2 to text returned of (display dialog "Enter the second input:" default answer "" buttons {"OK", "Cancel"} with title "Second Input")
display dialog ("First Input: " & input1 & (return) & "Second Input: " & input2)
Related
I'm looking for assistance with passing a variable from AppleScript to Automator.
I am working on a small automator app. I need to type a number that will be added to the end of a PDF's name. I used "Ask for text" in automator, however, I found out that, first, the pop-up window does not stay at the centre of screen. (27" iMac.), and second, every time after I input a number, I need to use mouse to click OK, the Enter key does not work.
So I turned to AppleScript for help. And here is what I found, a window that let me input the number, then click continue, then pass the number to Automator to add to PDF's name.
Set Value of Variable to storage
Run AppleScript: Ignore this action's input.
on run {input, parameters}
display dialog "Please enter QC Round." default answer "" with icon stop buttons {"Cancel", "Continue"} default button "Continue"
--> Result: {button returned:"Continue", text returned:"MySecretPassphrase"}
return input
end run
Set Value of Variable to Continue
Get Value of Variable to Storage
Rename Finder Items: Add Text
Add:_QC_Continue(Variable) after name
But it does not work. Can anyone help me fix it?
In Automator, an action gets its input from the previous action, and passes its results on to the next action. In a Run AppleScript action, the input is in the input argument to the run handler, and items returned by the handler are what get passed on.
In your example, you are just passing on the input, which doesn't have a value since the action is ignoring its input. The solution is to return the text from the dialog, for example:
on run {input, parameters}
set dialogResult to (display dialog "Please enter QC Round." default answer "" with icon stop buttons {"Cancel", "Continue"} default button "Continue")
return text returned of dialogResult
end run
I have a bit of AS that opens a dialog box and prompts a user for an input, with button options of "cancel" and "send" ("send" is the default button). As it's the default button, "send" activates when I hit the enter/return key on my keyboard. I would like to have "cancel" activate when I hit the escape key on my keyboard. Is there a way to link a keyboard key with a button? I'm looking for a coded solution as opposed to an application setting solution because this piece of AS will be run by another application.
Any help is appreciated, example code is below!
set returnedThings to (display dialog ":message:" default answer "" with icon note buttons {"cancel", "send"} default button "send")
set theMsg to text returned of the returnedThings
set theBtn to button returned of returnedThings
if theBtn is "send" and theMsg is not "" then
-- do application specific tasks
end if
Cancel is linked to the ESC key automatically if it’s capitalized.
I'm making a text game but can't get it to end the script half way through when the user pushes quit. I have tried quit, return and error -128 but none of them work.
The code isn't inside a tell/end tell because I'm not wanting to use an application, but I've tried putting it inside one with finder and that didn't work either..
Any help is appreciated :)
set temp to display dialog "Welcome" buttons {"Play", "Quit"}
if temp = "Quit" then
error number -128
end if
set temp to display dialog "What is your name?" default answer "Joe" buttons {"Submit"}
set userName to text returned of temp
etc. etc.
Another solution: define the cancel button.
display dialog "Welcome" buttons {"Play", "Quit"} cancel button "Quit"
-- no need to check the button returned, the script quit automatically when user cancelled
set temp to display dialog "What is your name?" default answer "Joe" buttons {"Submit"}
set userName to text returned of temp
etc. etc.
You should get button returned:
if button returned of temp = "Quit" then
error number -128
end if
I am using a script that I wrote to automatically write my dynamic IP to a .txt file but my problem is that I cannot get the dialog to close when the quit button is clicked.
set yn to (display dialog "Your ip has been written to the server, the application will re-run in 10 minutes if you DO NOT close this window." buttons {"Quit", "Run again"} giving up after 600)
if yn is equal to "Quit" then
quit
end if
What I ended up doing was
display alert "This is an alert" buttons {"No", "Yes"}
if button returned of result = "No" then
display alert "No was clicked"
else
if button returned of result = "Yes" then
display alert "Yes was clicked"
end if
end if
You can replace the lines "display alert "No/Yes was clicked"" with whatever code you want to run
The simplest way to figure out how to make use of yn's button pressed is to look at yn:
set yn to (display dialog "Your ip has been written to the server, the application will re-run in 10 minutes if you DO NOT close this window." buttons {"Quit", "Run again"} giving up after 600)
return yn
You'll see that yn returns {button returned:"Quit", gave up:false}. This indicates that yn has a property button returned that you can use in your if statement.
Another way to figure this out is to look through the AppleScript dictionary (File > Open Dictionary...) that documents display dialog, which is the StandardAdditions dictionary.
To add as an answer as the original question had a giving up after and I needed to do something in my script if the dialog did exceed past the timeout period. Here is an additional option that considers the timeout:
set dialogTitle to "Star Wars Question"
set theDialog to display alert "Do you think Darh Maul should have his own movie?" buttons {"YES", "NO"} default button "YES" giving up after 10
if button returned of theDialog = "" then
display notification "No decision was made, cancelled dialog" with title dialogTitle
else if button returned of theDialog = "YES" then
display notification "I concur" with title dialogTitle
else if button returned of theDialog = "NO" then
display notification "I find your lack of faith disturbing" with title dialogTitle
end if
First, some notes:
Even used without assigning a variable, dialogs return a result "record" object containing two key-value pairs: button returned and gave up.
To get the selected button's text (other than Cancel), use button returned of result.
When using giving up after n, use either button returned of result (with text value of "" (empty string)) or gave up of result (with boolean value of true or false).
Clicking the "Cancel" button causes an error (number -128 or "User canceled."). To handle the Cancel button, use a try block.
In my first example, I'm providing a Cancel button in multiple places. This demonstrates that the on error code will work regardless of which dialog in the try block returns the Cancel button. If you don't need a Cancel, then just provide a single button such as buttons "OK".
I'm using parens around some text in my examples, but AppleScript does not require these. AppleScript does require quotes around text.
Tested in both Monterey and High Sierra, and using Mar10Josh's answer, with fixes, as the basis for my examples to make it simple and clear...
try
display dialog ("An example dialog.") buttons {"Cancel", "OK"} giving up after 5
if button returned of result = "OK" then
display dialog ("You clicked OK.") buttons {"OK", "Cancel"}
else if gave up of result then
display dialog ("You let the dialog expire.") buttons {"OK", "Cancel"}
end if
-- handle the Cancel button here
on error "User canceled." -- or you can say: on error number -128
display dialog ("You clicked Cancel.") buttons "OK"
end try
Same thing, stated slightly differently to show some other stuff (text without parens, giving up after option, generic error handling):
try
-- uncomment following line to see non-Cancel-related error result ;)
-- error "foobar!"
display dialog "An example dialog." buttons {"OK", "Cancel"} giving up after 5
if button returned of result = "OK" then
display dialog "You clicked OK." buttons "OK"
else if gave up of result then
display dialog "You let the dialog expire." buttons "OK"
end if
-- handle any error that might occur here;
-- errText and errNum are variable names I chose for these values
on error errText number errNum
if errText is "User canceled." then -- or you can say: if errNum is -128
display dialog "You clicked Cancel." buttons "OK"
else
display dialog "Error: " & errText & return & return & "Number: " & errNum buttons "OK"
end if
end try
display dialog ("An example dialog.") buttons {"Cancel", "OK"}
if button returned of result = "Button" then
display dialog ("You clicked Button.")
end
The "Windows Script Host" titlebar caption can be blanked out by replacing "Wscript.Echo" with "Msgbox" but what should I do if I want to see a custom titlebar caption?
When in doubt, read the documentation. You specify the title as the 3rd argument of the MsgBox() function:
MsgBox "Message text", vbOKOnly, "Title"
In Cscript, .Echo displays text in console window.
For Wscript, .Echo displays text in a dialog window.
To customize this window, either code will do:
MsgBox "Your text", 32, "Window Title" or
WScript.CreateObject("WScript.Shell").Popup "Message",, "Some title", 48
For messagebox, user needs to dismiss with button click, or equivalent keyboard shortcut
For popup box, the box can be dismissed either by user, or timeout
The numbers in each command tell script engine what buttons & icons to display in GUI box.