How to open any menu item by script in InDesign

What if you want to open a menu item by script? For example the Configure plug-ins window. The solution is not on the surface: neither the InDesign Scripting Reference nor the InDesign Scripting Guide say anything about it.

However it is possible to achieve by invoking a menu action by ID. In our particular case we would use:

app.menuActions.itemByID(45313).invoke();

But how can I get the list of all the menu action IDs available in my copy of InDesign? (Note that this list may be a little different for each installation since scripts can be installed as menu items) To get the list create a blank new document and run this script:

var myActions = app.menuActions;
var myActionsList = Array();
var counter = Number(0);
 
for(var i = 0; i < myActions.length; i++){
    myActionsList.push(String(myActions[i].name));
    myActionsList.push(String(myActions[i].area));
    myActionsList.push(String(myActions[i].id));
}
 
var myDoc = app.activeDocument;
var myTextFrame = myDoc.pages[0].textFrames.add();
myTextFrame.geometricBounds = app.activeDocument.pages[0].bounds;
 
var myMenuActionsTbl = myTextFrame.insertionPoints[0].tables.add();
myMenuActionsTbl.columnCount = 3;
myMenuActionsTbl.bodyRowCount = myActions.length;
myMenuActionsTbl.contents = myActionsList;
    

It will add a text frame with table listing all menu items and their IDs. By the way, there are more than 3,200 of them!

Here is the list I generated on my home PC for InDesign CS3 and CS5.

Another and a more reliable approach is to invoke a menu action by name.

You can reference a menu action by locale independent string like this:

var myMenuAction = app.menuActions.item("$ID/Open..."); 

or like so:

var myMenuAction = app.menuActions.item("Open...");
and invoke it:
myMenuAction.invoke();

To get the list of menu actions run this script:

var arr = [];

for (var i = 0; i < app.menuActions.length; i++) {
    arr.push((i + 1) + " - " + app.menuActions[i].name);
}

var str = arr.join("\r");
WriteToFile(str);

function WriteToFile(text) {
    file = new File("~/Desktop/Menu actions.txt");
    file.encoding = "UTF-8";
    file.open("w");
    file.writeln(text); 
    file.close();
}

Here is a list generated from my copy of InDesign CS6 for Windows.

You can also invoke a menu item referencing it by name. For example, to imitate the Sort by Name command in the Character Styles panel we can run this code:

var myMenu = app.menus.item("$ID/CharStylePanelPopup");
var myMenuItem = myMenu.menuItems.item("Sort by Name");
var myMenuAction = myMenuItem.associatedMenuAction;
myMenuAction.invoke();

However, you don't always need the methods described above. For example, to open the Index panel, simply do

app.panels.item("Index").visible = true;

or for locale independent strings use the "$ID/englishname" method:

app.panels.itemByName("$ID/Articles").visible = true;

For example, the German locale for "Articles" is "Artikel", so the above line is the equivalent for the German InDesign to say:

app.panels.itemByName("Artikel").visible = true;

The names of the panels you can set like this can be displayed by the following one-liner:

$.writeln(app.panels.everyItem().name.sort().join('\r'));