This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
action:Execute_a_JavaScript_For_Automation [2017/04/05 16:42] JMichaelTX Provide better JXA example script |
action:Execute_a_JavaScript_For_Automation [2023/09/12 22:49] peternlewis [Script Results] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | The //Execute a JavaScript For Automation action// executes a specified JavaScript, either from a file or text. | + | ====== Execute JavaScript for Automation Action ====== |
+ | |||
+ | The //Execute a JavaScript For Automation action// executes the specified script, either from a file or text. | ||
+ | |||
+ | ===== Script Results ===== | ||
The results of the script can be: | The results of the script can be: | ||
Line 12: | Line 16: | ||
*Asynchronously ignored — the action runs while the macro continues on. | *Asynchronously ignored — the action runs while the macro continues on. | ||
- | JavaScript For Automation scripts are executed in the background via osascript. This means they are not allowed to do user interaction. You can work around this by asking an application like System Events to do the user interaction for you. | + | By default, errors are not included in the output, and the output is trimmed of white space. These can be adjusted in the action (gear) ⚙ menu. |
- | You can access Keyboard Maestro variables by using environment variables or by using the Keyboard Maestro Engine application (7.1+). | + | ===== Modern Syntax ===== |
- | ### Example JXA Script | + | In version 11.0, scripts default to Modern Syntax, which essentially wraps the script in: |
- | ** Shows how to Get/Set Keyboard Maestro Variables, and Get/Set the System Clipboard.** | + | |
+ | ```javascript | ||
+ | (function () { | ||
+ | … | ||
+ | })() | ||
+ | ``` | ||
+ | |||
+ | This helps keep your script from interacting with the web page in unexpected ways. A result of this is that you need to return values to the action using the `return` syntax. So a trivial action would be: | ||
+ | |||
+ | ```javascript | ||
+ | return "Hello"; | ||
+ | ``` | ||
+ | |||
+ | You can turn Modern Syntax on or off in the popup menu next to the script. | ||
+ | |||
+ | ===== Get/Set Keyboard Maestro Variables ===== | ||
+ | |||
+ | ==== Global Variables ==== | ||
+ | |||
+ | |||
+ | ** Example JXA Script shows how to Get/Set Keyboard Maestro //Global// Variables, and Get/Set the System Clipboard.** | ||
```javascript | ```javascript | ||
Line 59: | Line 83: | ||
``` | ``` | ||
- | --- | + | |
+ | Local and Instance variables are available (as described below), but Password variables are not. | ||
+ | |||
+ | ==== Local & Instance Variables ==== | ||
+ | |||
+ | **How To Get/Set Keyboard Maestro Local & Instance Variables** | ||
+ | |||
+ | Keyboard Maestro Ver 8 introduced [[manual:Variables#Instance_Variables_v8|Local and Instance Variables]]. In order to get or set these, you need to use different parameters in the JXA get/set methods. Here is an example. | ||
+ | |||
+ | ```javascript | ||
+ | var app = Application.currentApplication() | ||
+ | app.includeStandardAdditions = true | ||
+ | |||
+ | var kmInst = app.systemAttribute("KMINSTANCE"); | ||
+ | var kmeApp = Application("Keyboard Maestro Engine") | ||
+ | |||
+ | var myLocalVar = kmeApp.getvariable("Local__MyVar", {instance: kmInst}); | ||
+ | kmeApp.setvariable("Local__FromJXA", {instance: kmInst, to: "Set in JXA Script"}) | ||
+ | ``` | ||
+ | |||
+ | ===== Displaying User Dialogs ===== | ||
+ | |||
+ | JavaScript For Automation scripts are executed in the background via osascript. In order to have user interaction in the script, you will need to use a reference to the "current application". For example: | ||
+ | |||
+ | ```javascript | ||
+ | 'use strict'; | ||
+ | (function run() { // this will auto-run when script is executed | ||
+ | |||
+ | // --- SET CURRENT APP VARIABLE NEEDED FOR DIALOGS & StandardAdditions.osax --- | ||
+ | var app = Application.currentApplication() | ||
+ | app.includeStandardAdditions = true | ||
+ | |||
+ | var MsgStr = "This is an example of JXA Display Dialog" | ||
+ | var TitleStr = "Dialog Title" | ||
+ | var AnswerStr = "NONE" | ||
+ | |||
+ | app.beep() | ||
+ | var oAns = app.displayDialog(MsgStr, | ||
+ | { | ||
+ | withTitle: TitleStr | ||
+ | ,withIcon: "caution" | ||
+ | ,buttons: ["Cancel","OK"] | ||
+ | ,defaultButton: "OK" | ||
+ | ,cancelButton: "Cancel" | ||
+ | }) | ||
+ | |||
+ | //--- Script is stopped here if user chooses "Cancel" --- | ||
+ | |||
+ | var BtnStr = oAns.buttonReturned | ||
+ | |||
+ | return ("Btn: " + BtnStr) | ||
+ | |||
+ | } // END of function run() | ||
+ | )(); | ||
+ | ``` | ||
**For more information, see:** | **For more information, see:** |