Calculs raynaux v2

Contenu du snippet

c'est un script pour Indesign CS1 à CS6 offrant la possibilité d'effectuer des calculs dans un tableau.
- Soit sur des cellules sélectionnées
- Soit sur toutes les lignes du tableau
-Soit sur toutes les colonnes
Il a été testé sur Mac et PC avec succès. Un petit descriptif est dans le zip.

La version 4 (janvier 2021) est accessible à cette adresse : http://labdal.net

Source / Exemple :

//CALCULS RAYNAUX v2.0.js
//InDesign CS3 JavaScript
/*  
Labdal 2009


*/
//

main();

function main(){
 var myObjectList = new Array;
 if (app.documents.length != 0){
  if (app.selection.length != 0){
   for(var myCounter = 0;myCounter < app.selection.length; myCounter++){
    switch (app.selection[myCounter].constructor.name){
     case "Rectangle":
     case "Oval":
     case "Polygon":
     case "GraphicLine":
     case "TextFrame":
      myObjectList.push(app.selection[myCounter]);
     break;
    }
   }
   if (myObjectList.length == 0){
    NouvelleFenetre(myObjectList);
   }
   else{
    alert ("Vous devez sélectionner un groupe de valeurs et réessayer");
   }
  }
  else{
   alert ("Vous devez sélectionner un groupe de valeurs et réessayer");
  }
 }
 else{
  alert ("Vous devez ouvrir un document, sélectionner un groupe de valeurs et réessayer.");
 }
}

function NouvelleFenetre(){
 var Fenetre = app.dialogs.add({name:"CALCULS RAYNAUX v2.0"});
 var ListeDeroulantSens = ["les cellules selectionnées", "toutes les lignes", "toutes les colonnes"];
 var ListeDeroulantOperation = ["Addition", "Soustraction", "Multiplication","Division"];
 var ListeDeroulantOption = ["Ajouter au résultat :", "Soustraire au résultat :", "Multiplier le résultat par :"  ,"Diviser le résultat par :","Appliquer un % au résultat :","Ajouter un % au résultat :","Soustraire un % au résultat :"];
 var ListeDeroulantDevise = ["€","$","£","¥",""]

 with(Fenetre){
  with(dialogColumns.add()){
   
   var ChoixOperation = enablingGroups.add({staticLabel:"Opération :", checkedState:true});
   with (ChoixOperation){
    with(borderPanels.add()){
     with(dialogColumns.add()){
     var MenuDeroulantOperation = dropdowns.add({stringList:ListeDeroulantOperation, selectedIndex:0});
     }
    }
   }
   
   var ChoixSens = enablingGroups.add({staticLabel:"A effectuer sur :", checkedState:true});
    with (ChoixSens){
    with(borderPanels.add()){
     with(dialogColumns.add()){
     var MenuDeroulantSens = dropdowns.add({stringList:ListeDeroulantSens, selectedIndex:0});
     }
    }
   }
   
   var ChoixOption = enablingGroups.add({staticLabel:"Option :", checkedState:false});
   with (ChoixOption){
    with(borderPanels.add()){
     with(dialogColumns.add()){
     var MenuDeroulantOption = dropdowns.add({stringList:ListeDeroulantOption, selectedIndex:0});
     }
     with (dialogColumns.add()){
      var CaseValeurOption = realEditboxes.add();
     }
    }
   }
   var ChoixDevise = enablingGroups.add({staticLabel:"Devise :", checkedState:false});
   with (ChoixDevise){
    with(borderPanels.add()){
     with(dialogColumns.add()){
     var MenuDeroulantDevise = dropdowns.add({stringList:ListeDeroulantDevise, selectedIndex:0});
     }
    }
   }
   with(borderPanels.add()){
    with(dialogColumns.add()){     
     var ChoixVide = checkboxControls.add({staticLabel:"Ignorer les résultats nuls", checkedState:false});
    }
   }

  }
 }

 var MesChoix = Fenetre.show();
 if (MesChoix == true){
  var Sens = MenuDeroulantSens.selectedIndex;
  var Operation = MenuDeroulantOperation.selectedIndex;
  var Option = MenuDeroulantOption.selectedIndex;
  var ValeurOption = CaseValeurOption.editValue;
  var ValidationOption = ChoixOption.checkedState;
  var ValidationDevise = ChoixDevise.checkedState;
  var OptionDevise = MenuDeroulantDevise.selectedIndex;
  var ValidationVide = ChoixVide.checkedState;
  Fenetre.destroy();
  Calcul(Sens,Operation,Option,ValeurOption,ValidationOption,ValidationDevise,OptionDevise,ValidationVide);
 }
 else{
  Fenetre.destroy();
 }
}

function Calcul(Sens,Operation,Option,ValeurOption,ValidationOption,ValidationDevise,OptionDevise,ValidationVide){
 var Cellule = app.selection[0];
 
 var Tableau = Cellule.parent;
  if (Tableau.constructor.name == "Cell"){
  Cellule = Cellule.parent;
   Tableau = Tableau.parent;
  var NbreCellule = app.selection[0].length;
 }
 var NbreLignes = Tableau.rows.length;
 var NbreColonnes = Tableau.columns.length;
 var NomCellule = Cellule.name;
 var Ligne = NomCellule.split(":")[1];
 var Colonne = NomCellule.split(":")[0];
 var Dernier = -1;
 var Premier = 0;

 if (Sens == 0){
  if (NbreCellule == 0){
   app.select(Tableau.columns[Number(Colonne)].cells.itemByRange(Number(Ligne),Number(Ligne)));
   }
  TotalCellules(app.selection[0].cells,Operation,Option,ValeurOption,ValidationOption,ValidationDevise,OptionDevise,ValidationVide);
 }
 else{  

  if (Sens == 1){
   for (var j =0; NbreColonnes >= j+1 ; j ++){
    app.select(Tableau.rows[Number(j)].cells.itemByRange(Number(Premier),Dernier));
    TotalCellules(app.selection[0].cells,Operation,Option,ValeurOption,ValidationOption,ValidationDevise,OptionDevise,ValidationVide);     
   }
  }
  else{
   for (var j =0; NbreLignes >= j+1 ; j ++){
    app.select(Tableau.columns[Number(j)].cells.itemByRange(Number(Premier),Dernier));
    TotalCellules(app.selection[0].cells,Operation,Option,ValeurOption,ValidationOption,ValidationDevise,OptionDevise,ValidationVide);     
   }
  }
 }
}

function TotalCellules(cells,Operation,Option,ValeurOption,ValidationOption,ValidationDevise,OptionDevise,ValidationVide){

 for (var k = 1; cells.length > k+1; k++){
  if (cells[k].texts[0].contents == "0" && Operation==3){
   if (!confirm("ATTENTION : division par 0 !n Voulez-vous continuer ?")){
    return;
   }
  }
 }
 if (ValidationOption == true && ValeurOption == 0 && (Option == 2 || Option == 3 || Option ==4)){
  if (!confirm("ATTENTION : Vous n'avez pas donné de valeur à l'optionn Vous risquez une multiplication ou pire, une division par 0 !nn Voulez-vous continuer ?")){
   return;
  }
 }
 if (cells[-1].texts[0].contents != ""){
  if (!confirm("Ecraser le contenu de la dernière cellule ?")){
   return;
  }
 }
 var Total = ParseVirgule(cells[0].texts[0].contents);
 for (var j = 1; cells.length > j+1; j++){
  try{
   if (Operation==0) { Total += ParseVirgule(cells[j].texts[0].contents); }
   if (Operation==1) { Total = Total - (ParseVirgule(cells[j].texts[0].contents)); }
   if (Operation==2) { Total = Total * (ParseVirgule(cells[j].texts[0].contents)); }  
   if (Operation==3) { Total = Total / (ParseVirgule(cells[j].texts[0].contents)); }
  }   
  catch (e) {}
 }
 if (ValidationOption == true){
  if (Option == 0) {Total_edit=Total + ValeurOption;}
  if (Option == 1) {Total_edit=Total - ValeurOption;}
  if (Option == 2) {Total_edit=Total * ValeurOption;}
  if (Option == 3) {Total_edit=Total / ValeurOption;}
  if (Option == 4) {Total_edit=(Total * ValeurOption)/100; }
  if (Option == 5) {Total_edit=Total + ((Total * ValeurOption)/100); }
  if (Option == 6) {Total_edit=Total - ((Total * ValeurOption)/100); }
 }
 else{Total_edit=Total;}
 //["€","$","£","¥",""]
 if (ValidationDevise == true){
  if (OptionDevise == 0) {Devise =" €";}
  if (OptionDevise == 1) {Devise =" $";}
  if (OptionDevise == 2) {Devise =" £";}
  if (OptionDevise == 3) {Devise =" ¥";}
  if (OptionDevise == 4) {Devise =" ";}
 }
 else{Devise="";}
 var text = Total_edit.toString();
 var MaReg = new RegExp("[.]","");
 var Resultat = text.replace(MaReg,",");
 if (ValidationVide == 1 && Resultat == 0){
  var Resultat = "";
 }
 cells[-1].texts[0].contents = Resultat+Devise;
}
  

function ParseVirgule(Nombre){
 Nombre=Nombre.split("");
 for (var i=Nombre.length-1;i>=0;i--){
  if(isNaN(Nombre[i])){
   if (Nombre[i]==","){ 
    Nombre [i]=".";
    }
       
   if (Nombre[i]!="."){
    Nombre.splice(i,1);
    } 
   }
  }
 Nombre=Nombre.join("");
 if(Nombre!=""){
  return parseFloat(Nombre);
  }
 return 0;
}

function IsInArray(item,array){
 for(var i=0;i<array.length;i++){
  if(array[i]==item){
   return true
   }
  }
 return false;
}

Conclusion :

Une petite chose bien utile(je crois), merci de me rapporter les (éventuels) bugs, et de me dire si tout fonctionne sur PC.
ET si vous avez des suggestions pour enrichir "la chose " ...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.