2 Replies Latest reply on May 23, 2017 8:18 AM by mikevine1

    FindChangeByList Script Not Working Correctly

    mikevine1 Level 1

      I'm using the FindChangeByList script that is included with InDesign. When I run the script in conjunction with the text file listed below, the prices do not change correctly. Example: original price $6.99 changes to $32.99. It should change to $11.99. Original price $10.99 changes to $36.99. It should change to $16.99. Those price pairs don't even exist in the .txt document.

       

      Here is the .txt file I'm using:

      Dropbox - ScholarsPriceListFinal.txt

       

      Here is the script:

      //FindChangeByList.jsx

      //An InDesign CS4 JavaScript

      /* 

      @@@BUILDINFO@@@ "FindChangeByList.jsx" 2.0.0.0 10-January-2008

      */

      //Loads a series of tab-delimited strings from a text file, then performs a series

      //of find/change operations based on the strings read from the file.

      //

      //The data file is tab-delimited, with carriage returns separating records.

      //

      //The format of each record in the file is:

      //findType<tab>findProperties<tab>changeProperties<tab>findChangeOptions<tab>description

      //

      //Where:

      //<tab> is a tab character

      //findType is "text", "grep", or "glyph" (this sets the type of find/change operation to use).

      //findProperties is a properties record (as text) of the find preferences.

      //changeProperties is a properties record (as text) of the change preferences.

      //findChangeOptions is a properties record (as text) of the find/change options.

      //description is a description of the find/change operation

      //

      //Very simple example:

      //text {findWhat:"--"} {changeTo:"^_"} {includeFootnotes:true, includeMasterPages:true, includeHiddenLayers:true, wholeWord:false} Find all double dashes and replace with an em dash.

      //

      //More complex example:

      //text {findWhat:"^9^9.^9^9"} {appliedCharacterStyle:"price"} {include footnotes:true, include master pages:true, include hidden layers:true, whole word:false} Find $10.00 to $99.99 and apply the character style "price".

      //

      //All InDesign search metacharacters are allowed in the "findWhat" and "changeTo" properties for findTextPreferences and changeTextPreferences.

      //

      //If you enter backslashes in the findWhat property of the findGrepPreferences object, they must be "escaped"

      //as shown in the example below:

      //

      //{findWhat:"\\s+"}

      //

      //For more on InDesign scripting, go to http://www.adobe.com/products/indesign/scripting/index.html

      //or visit the InDesign Scripting User to User forum at http://www.adobeforums.com

      //

      main();

      function main(){

        var myObject;

        //Make certain that user interaction (display of dialogs, etc.) is turned on.

        app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

        if(app.documents.length > 0){

        if(app.selection.length > 0){

        switch(app.selection[0].constructor.name){

        case "InsertionPoint":

        case "Character":

        case "Word":

        case "TextStyleRange":

        case "Line":

        case "Paragraph":

        case "TextColumn":

        case "Text":

        case "Cell":

        case "Column":

        case "Row":

        case "Table":

        myDisplayDialog();

        break;

        default:

        //Something was selected, but it wasn't a text object, so search the document.

        myFindChangeByList(app.documents.item(0));

        }

        }

        else{

        //Nothing was selected, so simply search the document.

        myFindChangeByList(app.documents.item(0));

        }

        }

        else{

        alert("No documents are open. Please open a document and try again.");

        }

      }

      function myDisplayDialog(){

        var myObject;

        var myDialog = app.dialogs.add({name:"FindChangeByList"});

        with(myDialog.dialogColumns.add()){

        with(dialogRows.add()){

        with(dialogColumns.add()){

        staticTexts.add({staticLabel:"Search Range:"});

        }

        var myRangeButtons = radiobuttonGroups.add();

        with(myRangeButtons){

        radiobuttonControls.add({staticLabel:"Document", checkedState:true});

        radiobuttonControls.add({staticLabel:"Selected Story"});

        if(app.selection[0].contents != ""){

        radiobuttonControls.add({staticLabel:"Selection", checkedState:true});

        }

        }

        }

        }

        var myResult = myDialog.show();

        if(myResult == true){

        switch(myRangeButtons.selectedButton){

        case 0:

        myObject = app.documents.item(0);

        break;

        case 1:

        myObject = app.selection[0].parentStory;

        break;

        case 2:

        myObject = app.selection[0];

        break;

        }

        myDialog.destroy();

        myFindChangeByList(myObject);

        }

        else{

        myDialog.destroy();

        }

      }

      function myFindChangeByList(myObject){

        var myScriptFileName, myFindChangeFile, myFindChangeFileName, myScriptFile, myResult;

        var myFindChangeArray, myFindPreferences, myChangePreferences, myFindLimit, myStory;

        var myStartCharacter, myEndCharacter;

        var myFindChangeFile = myFindFile("/FindChangeSupport/FindChangeList.txt")

        if(myFindChangeFile != null){

        myFindChangeFile = File(myFindChangeFile);

        var myResult = myFindChangeFile.open("r", undefined, undefined);

        if(myResult == true){

        //Loop through the find/change operations.

        do{

        myLine = myFindChangeFile.readln();

        //Ignore comment lines and blank lines.

        if((myLine.substring(0,4)=="text")||(myLine.substring(0,4)=="grep")||(myLine.substring(0, 5)=="glyph")){

        myFindChangeArray = myLine.split("\t");

        //The first field in the line is the findType string.

        myFindType = myFindChangeArray[0];

        //The second field in the line is the FindPreferences string.

        myFindPreferences = myFindChangeArray[1];

        //The second field in the line is the ChangePreferences string.

        myChangePreferences = myFindChangeArray[2];

        //The fourth field is the range--used only by text find/change.

        myFindChangeOptions = myFindChangeArray[3];

        switch(myFindType){

        case "text":

        myFindText(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions);

        break;

        case "grep":

        myFindGrep(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions);

        break;

        case "glyph":

        myFindGlyph(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions);

        break;

        }

        }

        } while(myFindChangeFile.eof == false);

        myFindChangeFile.close();

        }

        }

      }

      function myFindText(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions){

        //Reset the find/change preferences before each search.

        app.changeTextPreferences = NothingEnum.nothing;

        app.findTextPreferences = NothingEnum.nothing;

        var myString = "app.findTextPreferences.properties = "+ myFindPreferences + ";";

        myString += "app.changeTextPreferences.properties = " + myChangePreferences + ";";

        myString += "app.findChangeTextOptions.properties = " + myFindChangeOptions + ";";

        app.doScript(myString, ScriptLanguage.javascript);

        myFoundItems = myObject.changeText();

        //Reset the find/change preferences after each search.

        app.changeTextPreferences = NothingEnum.nothing;

        app.findTextPreferences = NothingEnum.nothing;

      }

      function myFindGrep(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions){

        //Reset the find/change grep preferences before each search.

        app.changeGrepPreferences = NothingEnum.nothing;

        app.findGrepPreferences = NothingEnum.nothing;

        var myString = "app.findGrepPreferences.properties = "+ myFindPreferences + ";";

        myString += "app.changeGrepPreferences.properties = " + myChangePreferences + ";";

        myString += "app.findChangeGrepOptions.properties = " + myFindChangeOptions + ";";

        app.doScript(myString, ScriptLanguage.javascript);

        var myFoundItems = myObject.changeGrep();

        //Reset the find/change grep preferences after each search.

        app.changeGrepPreferences = NothingEnum.nothing;

        app.findGrepPreferences = NothingEnum.nothing;

      }

      function myFindGlyph(myObject, myFindPreferences, myChangePreferences, myFindChangeOptions){

        //Reset the find/change glyph preferences before each search.

        app.changeGlyphPreferences = NothingEnum.nothing;

        app.findGlyphPreferences = NothingEnum.nothing;

        var myString = "app.findGlyphPreferences.properties = "+ myFindPreferences + ";";

        myString += "app.changeGlyphPreferences.properties = " + myChangePreferences + ";";

        myString += "app.findChangeGlyphOptions.properties = " + myFindChangeOptions + ";";

        app.doScript(myString, ScriptLanguage.javascript);

        var myFoundItems = myObject.changeGlyph();

        //Reset the find/change glyph preferences after each search.

        app.changeGlyphPreferences = NothingEnum.nothing;

        app.findGlyphPreferences = NothingEnum.nothing;

      }

      function myFindFile(myFilePath){

        var myScriptFile = myGetScriptPath();

        var myScriptFile = File(myScriptFile);

        var myScriptFolder = myScriptFile.path;

        myFilePath = myScriptFolder + myFilePath;

        if(File(myFilePath).exists == false){

        //Display a dialog.

        myFilePath = File.openDialog("Choose the file containing your find/change list");

        }

        return myFilePath;

      }

      function myGetScriptPath(){

        try{

        myFile = app.activeScript;

        }

        catch(myError){

        myFile = myError.fileName;

        }

        return myFile;

      }

       

      Any ideas?

      Mike

        • 1. Re: FindChangeByList Script Not Working Correctly
          [Jongware] Most Valuable Participant

          Your logic is flawed.

           

              Bob needs to pay $6.99 for the furious green idea.

           

          Imagine the script runs through your changes list one line at a time (*). At line 18, it encounters the line with amount "$6.99", which ought to be changed to "$11.99".

          Let's suppose it does so (*).

           

              Bob needs to pay $11.99 for the furious green idea.

           

          The script continues processing the next lines, up to line 27, where it's told to change "$11.99" to "$24.99". There is no reason not to do so, so

           

              Bob needs to pay $24.99 for the furious green idea.

           

          .. and yet it is not done, because line 38 requires it to change "$24.99" to "$36.99". That final amount does not appear in the following lines anymore, so the final result is

           

              Bob needs to pay $36.99 for the furious green idea.

           

          A price raise of 429%; Bob is right to complain.

          Solution: Sort your current list of prices to the reverse: high to low. Then the script starts with changing the highest amount to something higher than in the current list, which, logically, won't appear later on in that same list.

           

          (*) That's actually not a supposition, it's a fact. But pretending to be a computer can sometimes help figuring out why they do what they do. Beep.

          1 person found this helpful
          • 2. Re: FindChangeByList Script Not Working Correctly
            mikevine1 Level 1

            Jongware,

            Sorting the list from high prices to low prices worked on some of my spreads but not others.

            If I have two prices on the same spread that are the same, one gets changed correctly and the other is not changed.

            Example 1:

            $3.49 changed to $6.99 (correct)

            $3.49 changed to $3.49 (wrong)

            Example 2:

            $2.99 should change to $4.75, but it stayed the original price of $2.99.

            THANKS for the idea of sorting from high to low. At least some price changes are working correctly.

            Do you have any ideas why some change correctly and some don't?

            Mike