Skip to main content
Inspiring
April 14, 2023
Answered

Function to close selected file

  • April 14, 2023
  • 2 replies
  • 830 views

hello, I have a script that allows me to select the open files and I would like pressing the OK button to close only the selected ones, but it doesn't work and I don't understand why

var openDocs = app.documents;
var docNames = [];

for (var i = 0; i < openDocs.length; i++) {
  docNames.push(openDocs[i].name);
}

var dialog = new Window("dialog", "Seleziona il file");
var checkGroup = dialog.add("group");
checkGroup.orientation = "column";
checkGroup.alignment = "left";
var checkboxes = [];
for (var i = 0; i < docNames.length; i++) {
  checkboxes[i] = checkGroup.add("checkbox", undefined, docNames[i]);
  checkboxes[i].value = false;
}
var buttonGroup = dialog.add("group");
buttonGroup.orientation = "row";
buttonGroup.alignment = "center";
var selectAllButton = buttonGroup.add("button", undefined, "Seleziona tutto");
selectAllButton.onClick = function() {
  for (var i = 0; i < checkboxes.length; i++) {
    checkboxes[i].value = true;
  }
}
var deselectAllButton = buttonGroup.add("button", undefined, "Deseleziona tutto");
deselectAllButton.onClick = function() {
  for (var i = 0; i < checkboxes.length; i++) {
    checkboxes[i].value = false;
  }
}
var okButton = buttonGroup.add("button", undefined, "OK");
okButton.onClick = function() {
  var selectedDocs = [];
  for (var i = 0; i < checkboxes.length; i++) {
    if (checkboxes[i].value == true) {
      selectedDocs.push(openDocs[i]);
    }
  }
  if (selectedDocs.length == 0) {
    alert("Nessun documento selezionato.");
  } else {
    try {
      for (var i = 0; i < selectedDocs.length; i++) {
        selectedDocs[i].close(SaveOptions.YES);
        while (selectedDocs[i].isValid) {
          // attesa che il documento sia chiuso
        }
      }
      dialog.close();
    } catch (error) {
      alert("Si è verificato un errore durante la chiusura dei documenti: " + error);
    }
  }
}
var cancelButton = buttonGroup.add("button", undefined, "Annulla");
cancelButton.onClick = function() {
  dialog.close();
}

dialog.show();

 

This topic has been closed for replies.
Correct answer rob day

I think the selectedDocs array isn’t right. Try this:

 

var openDocs = app.documents.everyItem().getElements()
var selectedDocs = [];
showDialog()
function showDialog(){
    var dialog = new Window("dialog", "Seleziona il file");
    var checkGroup = dialog.add("group");
    checkGroup.orientation = "column";
    checkGroup.alignment = "left";
    var checkboxes = [];
    for (var i = 0; i < openDocs.length; i++) {
      checkboxes[i] = checkGroup.add("checkbox", undefined, openDocs[i].name);
      checkboxes[i].value = false;
    }
    var buttonGroup = dialog.add("group");
    buttonGroup.orientation = "row";
    buttonGroup.alignment = "center";
    var selectAllButton = buttonGroup.add("button", undefined, "Seleziona tutto");
    selectAllButton.onClick = function() {
      for (var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].value = true;
      }
    }
    var deselectAllButton = buttonGroup.add("button", undefined, "Deseleziona tutto");
    deselectAllButton.onClick = function() {
      for (var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].value = false;
      }
    }
    //Button named "cancel" doesn’t need a close function
    var cancelButton = buttonGroup.add("button", undefined, undefined, {name: "cancel"}); 
    cancelButton.text = "Annulla"; 
    var okButton = buttonGroup.add("button", undefined, "OK");
    okButton.onClick = function() {
      for (var i = 0; i < checkboxes.length; i++) {
        if (checkboxes[i].value == true) {
            $.writeln(checkboxes[i].text)
            //returns the checkboxes text which can be used to get the document by name:
            selectedDocs.push(app.documents.itemByName(checkboxes[i].text));
        }
      }
      if (selectedDocs.length == 0) {
        alert("Nessun documento selezionato.");
      }
      dialog.close();
    }
    dialog.show()
    //after the dialog is closed run closeSelected function
    closeSelected()
}


function closeSelected(){
    for (var i = 0; i < selectedDocs.length; i++){
        selectedDocs[i].close(SaveOptions.YES)
    };
}

 

2 replies

rob day
Community Expert
Community Expert
April 14, 2023

Hi @Samuel22307458169h , You are trying to close the docs before your dialog is closed. Try something like this where the closeSelected is called after the dialog closes :

 

var openDocs = app.documents;
var docNames = [];
for (var i = 0; i < openDocs.length; i++) {
  docNames.push(openDocs[i].name);
}

var selectedDocs = [];
showDialog()
function showDialog(){
    var dialog = new Window("dialog", "Seleziona il file");
    var checkGroup = dialog.add("group");
    checkGroup.orientation = "column";
    checkGroup.alignment = "left";
    var checkboxes = [];
    for (var i = 0; i < docNames.length; i++) {
      checkboxes[i] = checkGroup.add("checkbox", undefined, docNames[i]);
      checkboxes[i].value = false;
    }
    var buttonGroup = dialog.add("group");
    buttonGroup.orientation = "row";
    buttonGroup.alignment = "center";
    var selectAllButton = buttonGroup.add("button", undefined, "Seleziona tutto");
    selectAllButton.onClick = function() {
      for (var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].value = true;
      }
    }
    var deselectAllButton = buttonGroup.add("button", undefined, "Deseleziona tutto");
    deselectAllButton.onClick = function() {
      for (var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].value = false;
      }
    }
    //Button named "cancel" doesn’t need a close function
    var cancelButton = buttonGroup.add("button", undefined, undefined, {name: "cancel"}); 
    cancelButton.text = "Annulla"; 
    var okButton = buttonGroup.add("button", undefined, "OK");
    okButton.onClick = function() {
      for (var i = 0; i < checkboxes.length; i++) {
        if (checkboxes[i].value == true) {
          selectedDocs.push(openDocs[i]);
        }
      }
      if (selectedDocs.length == 0) {
        alert("Nessun documento selezionato.");
      }
      dialog.close();
    }
    dialog.show()
    //after the dialog is closed run closeSelected function
    closeSelected()
}


function closeSelected(){
    for (var i = 0; i < selectedDocs.length; i++){
        selectedDocs[i].close(SaveOptions.NO)
    };   
}

 

Inspiring
April 14, 2023

Hi Rob, thanks for the answer, the script it works only if is selected 1 file, if are selected 2 or more files appear the error below

 

 

rob day
Community Expert
rob dayCommunity ExpertCorrect answer
Community Expert
April 14, 2023

I think the selectedDocs array isn’t right. Try this:

 

var openDocs = app.documents.everyItem().getElements()
var selectedDocs = [];
showDialog()
function showDialog(){
    var dialog = new Window("dialog", "Seleziona il file");
    var checkGroup = dialog.add("group");
    checkGroup.orientation = "column";
    checkGroup.alignment = "left";
    var checkboxes = [];
    for (var i = 0; i < openDocs.length; i++) {
      checkboxes[i] = checkGroup.add("checkbox", undefined, openDocs[i].name);
      checkboxes[i].value = false;
    }
    var buttonGroup = dialog.add("group");
    buttonGroup.orientation = "row";
    buttonGroup.alignment = "center";
    var selectAllButton = buttonGroup.add("button", undefined, "Seleziona tutto");
    selectAllButton.onClick = function() {
      for (var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].value = true;
      }
    }
    var deselectAllButton = buttonGroup.add("button", undefined, "Deseleziona tutto");
    deselectAllButton.onClick = function() {
      for (var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].value = false;
      }
    }
    //Button named "cancel" doesn’t need a close function
    var cancelButton = buttonGroup.add("button", undefined, undefined, {name: "cancel"}); 
    cancelButton.text = "Annulla"; 
    var okButton = buttonGroup.add("button", undefined, "OK");
    okButton.onClick = function() {
      for (var i = 0; i < checkboxes.length; i++) {
        if (checkboxes[i].value == true) {
            $.writeln(checkboxes[i].text)
            //returns the checkboxes text which can be used to get the document by name:
            selectedDocs.push(app.documents.itemByName(checkboxes[i].text));
        }
      }
      if (selectedDocs.length == 0) {
        alert("Nessun documento selezionato.");
      }
      dialog.close();
    }
    dialog.show()
    //after the dialog is closed run closeSelected function
    closeSelected()
}


function closeSelected(){
    for (var i = 0; i < selectedDocs.length; i++){
        selectedDocs[i].close(SaveOptions.YES)
    };
}

 

BarlaeDC
Community Expert
Community Expert
April 14, 2023

Hi,

 

Can you be a bit more explicit around the "it doesn't work" bit, what happens? is there an error, is it displaying a dialog or is it just doing nothing?

Inspiring
April 14, 2023

Yes, when i press OK button appear an error and do not happen nothing

 

An error occurred while closing documents:
Error: The request could not be handled due to a window
modal dialogue or an active alert.