Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

Export Footnotes in Pages Range using Grep and Array Causing Exported Duplicates in text File!

Enthusiast ,
Feb 17, 2023 Feb 17, 2023

hi Experts,

Im trying to export footnotes in pages range, it works and no errors but i found the exported (text) file contain duplicates of the results!, maybe something wrong in my logic but i cant catch the logical error!, please help and thanks in advance.

//Export Footnotes in Pages Range

DoFootnotesRange();

function DoFootnotesRange(){
    
    //Array for the Collected Footnotes Text
    var myFoundTexts = [];
    //grep options
    app.findChangeGrepOptions.includeMasterPages = false; 
    app.findChangeGrepOptions.includeFootnotes = true; 
    app.findChangeGrepOptions.includeHiddenLayers = false; 
    app.findChangeGrepOptions.includeLockedLayersForFind = true; 
    app.findChangeGrepOptions.includeLockedStoriesForFind = true; 

    var myDoc = app.activeDocument;
    var pgStart = 0; 
    var pgEnd =  9;
    var pageRange = myDoc.pages.itemByRange(pgStart, pgEnd).textFrames.everyItem().paragraphs.everyItem();

    var myFind = "~F.+$";
    
    //Clear Grep Prefrences
    app.findGrepPreferences = app.changeGrepPreferences = null;
    app.findGrepPreferences.findWhat = myFind;

    try {
        var myDoc = app.activeDocument;
        } catch(e) { exit(); }
        var f = File("~/Desktop/Doc Exported Footnotes in Pages Range .txt");
        f.encoding = "UTF-8";
        f.open("w");

        var myFoundTextParagraphs = pageRange.findGrep();
        
        //First nested loop to grab all the found texts in Range of Paragraphs in Page Range
        for (var i = 0; i < myFoundTextParagraphs.length; i++) {
            for (var j = 0; j < myFoundTextParagraphs[i].length; j++) {
                myFoundTexts.push(myFoundTextParagraphs[i][j]);
            }
        }
       
    //Now Loop to Show Found Text in Array
    for (var k = 0; k < myFoundTexts.length; k++) {
         f.writeln (myFoundTexts[k].contents+"\t"+myFoundTexts[k].parentTextFrames[0].parentPage.name)
        }
        app.findGrepPreferences = app.changeGrepPreferences = null;
        f.close();
        alert("Document Footnotes Exported to Desktop File, "+myFoundTexts.length+" Footnotes Collected!", "Finished");  
}

 

Best
Mohammad Hasanin
TOPICS
Scripting
2.5K
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 2 Correct answers

Enthusiast , Feb 18, 2023 Feb 18, 2023

@m1b @Robert at ID-Tasker , hi all, thanks a lot for your help and suggestions,  i create a new crazy method to fix this! and it works!, here it is :

//Export Footnotes in Pages Range
DoFootnotesRange();

function DoFootnotesRange(){
    
    //Array for the Collected Footnotes Text
    var myFoundTexts = [];
    //grep options
    app.findChangeGrepOptions.includeMasterPages = false; 
    app.findChangeGrepOptions.includeFootnotes = true; 
    app.findChangeGrepOptions.includeHiddenLayers = fals
...
Translate
Guide , Feb 19, 2023 Feb 19, 2023

This seems to me simpler:

 

var myDoc = app.activeDocument,
myFootnotes = myDoc.stories.everyItem().footnotes.everyItem().getElements(),
F = myFootnotes.length,  f;
//---------------------------
var myStart = 1,  myEnd = 8;
//---------------------------
var myTxt = File("~/Desktop/Doc Exported Footnotes in Pages Range .txt");
myTxt.encoding = "UTF-8";
myTxt.open("w");
for ( var f = 0; f < F; f++ ) {
    var myPage = myFootnotes[f].storyOffset.parentTextFrames[0].parentPage.name;
    if ( myPage >=
...
Translate
Community Expert ,
Feb 17, 2023 Feb 17, 2023

Hi @M.Hasanin, so your exported text file shows the same contents and page name multiple times? Could you post a small sample .indd file for us to test with your script? - Mark

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 17, 2023 Feb 17, 2023

 

 

//First nested loop to grab all the found texts in Range of Paragraphs in Page Range

 

 

Why nested loops ? 

 

 

var myFoundTextParagraphs = pageRange.findGrep();

 

 

This should return simple array - not array of arrays ? 

 

 

myFoundTexts.push(myFoundTextParagraphs[i][j]);

 

 

??

This loop will return myFoundTextParagraphs.length² results ?? 

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 17, 2023 Feb 17, 2023

@Robert at ID-Tasker, the result of

myDoc.pages.itemByRange(pgStart, pgEnd).textFrames.everyItem().paragraphs.everyItem().findGrep();

is an array of arrays. It's because of the use of everyItem().

- Mark

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 17, 2023 Feb 17, 2023

Right 😞 missed "[i]" in the inside loop 😞

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 17, 2023 Feb 17, 2023

Why not go through all TextFrames on the range of pages and export their Footnotes? 

 

But then you'll need to sort them by index - or findGrep returns them in the correct order? Or you don't need them organised? 

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Feb 17, 2023 Feb 17, 2023

i did it and it succeeded before for the all book , but the original complete book is near 180 pages and other book near 500 pages so i decide to make it in range!, and no need to sort them, i start thinking to import text file inside indesign and removing duplicates via grep or make a new script for that, thank for your suggestion

Best
Mohammad Hasanin
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Feb 17, 2023 Feb 17, 2023

@Robert at ID-Tasker @m1b 

Thanks a lot for replying me, i found that some results are duplicated!, here is part of book,  the link of 30 page of the book project , download from here (Google Drive) :

True Believer 30 page 

you can found it mixed language footnotes (Arabic and English) - GIF Animation

Some Duplicated Found.gifexpand image

Best
Mohammad Hasanin
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Feb 18, 2023 Feb 18, 2023

@m1b @Robert at ID-Tasker , hi all, thanks a lot for your help and suggestions,  i create a new crazy method to fix this! and it works!, here it is :

//Export Footnotes in Pages Range
DoFootnotesRange();

function DoFootnotesRange(){
    
    //Array for the Collected Footnotes Text
    var myFoundTexts = [];
    //grep options
    app.findChangeGrepOptions.includeMasterPages = false; 
    app.findChangeGrepOptions.includeFootnotes = true; 
    app.findChangeGrepOptions.includeHiddenLayers = false; 
    app.findChangeGrepOptions.includeLockedLayersForFind = true; 
    app.findChangeGrepOptions.includeLockedStoriesForFind = true; 

    var myDoc = app.activeDocument;
    var pgStart = 0; 
    var pgEnd =  9;
    var myFind = "~F.+$";
    
    //Clear Grep Prefrences
    app.findGrepPreferences = app.changeGrepPreferences = null;
    app.findGrepPreferences.findWhat = myFind;

    try {
        var myDoc = app.activeDocument;
        } catch(e) { exit(); }
        var f = File("~/Desktop/Doc Exported Footnotes in Pages Range .txt");
        f.encoding = "UTF-8";
        f.open("w");

        
        //New Method for Pages Range!
        for (var n = pgStart; n <= pgEnd; n++) {
                var pageRange = myDoc.pages[n].textFrames.everyItem();
                var myFoundTextParagraphs = pageRange.findGrep();
                
        //First nested loop to grab all the found texts in Range of Paragraphs in Page Range
        //is an array of arrays. It's because of use of everyItem().
        for (var i = 0; i < myFoundTextParagraphs.length; i++) {
            for (var j = 0; j < myFoundTextParagraphs[i].length; j++) {
                myFoundTexts.push(myFoundTextParagraphs[i][j]);
                }
            }
        }
     
    //Now Loop to Show Found Text in Array
    for (var k = 0; k < myFoundTexts.length; k++) {
         f.writeln (myFoundTexts[k].contents+"\t"+myFoundTexts[k].parentTextFrames[0].parentPage.name)
        }
        app.findGrepPreferences = app.changeGrepPreferences = null;
        f.close();
        alert("Document Footnotes Exported to Desktop File", "Finished");  
}

 

Best
Mohammad Hasanin
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 18, 2023 Feb 18, 2023

@m1b I thought that each instance of everyItem() creates another dimension - in the new version there is only one - so why nested loops ??

 

@M.Hasanin you've misunderstood my idea 😞 I've suggested to just iterate through all TextFrames - and process their collections of Footnotes - not to search every TextFrame - so your code would be much simpler and quicker.

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Feb 19, 2023 Feb 19, 2023

@Robert at ID-Tasker 

Thanks for your reply but can you please give me written code example for doing that ? or algorithm steps

Best
Mohammad Hasanin
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 19, 2023 Feb 19, 2023

Would prefer algorithm as JS isn't my forte 😉

 

1st loop - through pages, 

2nd loop - nested - through TextFrames,

3rd loop - nested - through Footnotes.

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Feb 19, 2023 Feb 19, 2023

@Robert at ID-Tasker Thank you, i will try to apply this algorithm and see what will happened

Best
Mohammad Hasanin
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guide ,
Feb 19, 2023 Feb 19, 2023

This seems to me simpler:

 

var myDoc = app.activeDocument,
myFootnotes = myDoc.stories.everyItem().footnotes.everyItem().getElements(),
F = myFootnotes.length,  f;
//---------------------------
var myStart = 1,  myEnd = 8;
//---------------------------
var myTxt = File("~/Desktop/Doc Exported Footnotes in Pages Range .txt");
myTxt.encoding = "UTF-8";
myTxt.open("w");
for ( var f = 0; f < F; f++ ) {
    var myPage = myFootnotes[f].storyOffset.parentTextFrames[0].parentPage.name;
    if ( myPage >= myStart && myPage <= myEnd ) myTxt.writeln(myFootnotes[f].contents + "\t" + myPage);
}
myTxt.close();
alert("Document Footnotes Exported to Desktop File", "Finished");

 

(^/)  The Jedi

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 19, 2023 Feb 19, 2023

You have used everyItem() twice - but then you are referring to the items as in the single size array?

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 19, 2023 Feb 19, 2023

@Robert at ID-Tasker, the getElements() method of an everyItem() result returns a flat array of the resolved elements. In OP's case they did not use getElements(), because they wanted to use findGrep() method, which Array does not have.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 19, 2023 Feb 19, 2023

Thanks. 

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Feb 19, 2023 Feb 19, 2023

@FRIdNGE  genius method,  yes it is much simpler Jedi!,Thanks a lot

Best
Mohammad Hasanin
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Feb 19, 2023 Feb 19, 2023

@m1b @FRIdNGE 

Can you please Explain what this storyoffset is doing? :

 

 

var myPage = myFootnotes[f].storyOffset.parentTextFrames[0].parentPage.name;

 

i mean how to use StoryOffset correctly and what it is?

 

and thanks in advance 

Best
Mohammad Hasanin
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 19, 2023 Feb 19, 2023

myFootnotes is an array of all the footnotes in your document (it was made earlier in the script)

storyOffset gets the insertionPoint of the footnote

parentTextFrames[0] gets the textFrame that contains that insertionPoint

parentPage gets the page that contains the textFrame

name is the name of the page.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Feb 20, 2023 Feb 20, 2023
LATEST

@m1b 

 thanks for explaining, i know the last three lines, it just first time to concentrate with StoryOffset, not much examples around!, thanks for help, have a best day

Best
Mohammad Hasanin
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines