[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Per Skript auf alle Notizen zugreifen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Per Skript auf alle Notizen zugreifen

flobuc
Beiträge gesamt: 246

13. Okt 2011, 10:26
Beitrag # 1 von 12
Bewertung:
(4288 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

kennt jemand von euch einen eleganten Weg alle Notizen in einem Dokument per Skript anzusprechen?

Bisher bin ich über alle Stories und dann über alle Notes der Story gelaufen. Der Weg über Story.notes erkennt aber keine Notizen in Tabellenzellen. Das bedeutet man muss noch über alle Tabellen und da wieder über alle Zellen laufen.
Das würde zwar funktionieren, ergibt aber einen sehr unschönen Code.
Gibt es keine Möglichkeit hier schnell und einfach auf alle Notizen zuzugreifen???

Über "Suchen/Ersetzen" funktioniert auch nicht, weil nach Notizen nicht gesucht werden kann.

Gruss

Flo
X

Per Skript auf alle Notizen zugreifen

Martin Fischer
  
Beiträge gesamt: 12668

13. Okt 2011, 10:45
Beitrag # 2 von 12
Beitrag ID: #482239
Bewertung:
(4277 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Florian,

Antwort auf: Über "Suchen/Ersetzen" funktioniert auch nicht, weil nach Notizen nicht gesucht werden kann.


Aber man kann den Inhalt ersetzen. ;-)
Code
app.notePreferences.findAndReplaceNoteContents = true; 


Im Ernst, hilft vielleicht getElements()?
Code
var story_notes = app.activeDocument.stories.everyItem().notes.everyItem().getElements(); 
var table_notes = app.activeDocument.stories.everyItem().tables.everyItem().cells.everyItem().notes.everyItem().getElements();



als Antwort auf: [#482235]

Per Skript auf alle Notizen zugreifen

WernerPerplies
Beiträge gesamt: 2693

13. Okt 2011, 10:45
Beitrag # 3 von 12
Beitrag ID: #482240
Bewertung:
(4275 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Flo,

Zitat Bisher bin ich über alle Stories und dann über alle Notes der Story gelaufen. Der Weg über Story.notes erkennt aber keine Notizen in Tabellenzellen. Das bedeutet man muss noch über alle Tabellen und da wieder über alle Zellen laufen.


Also ich mache das auch so und sehe das Problem mit dem unschönen Code nicht, aber was ist mit table.notes, bzw. story.tables[index].notes?
(nicht getestet)


als Antwort auf: [#482235]

Per Skript auf alle Notizen zugreifen

Gerald Singelmann
  
Beiträge gesamt: 6261

13. Okt 2011, 11:06
Beitrag # 4 von 12
Beitrag ID: #482246
Bewertung:
(4259 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat was ist mit table.notes, bzw. story.tables[index].notes


gips nich.

Ich bin meistens zu der Einstellung übergegangen: "Wenn ich keine Zeit zum Nachschlagen habe, sollte ich auch nicht antworten."

Notizen können auch in einer Tabelle in einer Tabelle in einer Tabelle sein. Es braucht also eine Rekursion. Für die, die das noch nie gemacht haben:
Code
//*********************************************************************** 
//
// get all notes of document
//Description:Sammelt alle Notizen auch aus verschachtelten Tabellen in ein Array
//
// [Ver: 0.1] [Author: Gerald Singelmann] [Modif: 11-10-13]
// [Lang: DE] [Req: InDesign CS5] [Creat: 11-10-13]
//
// Bugs & Feedback : gerald{at}cuppascript{dot}com
// www.cuppascript.com
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
//*********************************************************************

#target indesign

get_notes();

function get_notes() {
var all_notes = new Array();
var doc = app.activeDocument;
var stories = doc.stories.everyItem().getElements();
for (var n = 0; n < stories.length; n++) {
get_notes_of_x( stories[n] );
}
alert (all_notes.length );

function get_notes_of_x( x ) {
if (x.constructor.name == "Story") {
for (var n = 0; n < x.notes.length; n++) {
all_notes.push( x.notes[n] );
}
for (var n = 0; n < x.tables.length; n++) {
get_notes_of_x( x.tables[n] );
}
}
if (x.constructor.name == "Table") {
for (var n = 0; n < x.cells.length; n++) {
get_notes_of_x( x.cells[n] );
}
}
if (x.constructor.name == "Cell") {
for (var n = 0; n < x.notes.length; n++) {
all_notes.push( x.notes[n] );
}
for (var n = 0; n < x.tables.length; n++) {
get_notes_of_x( x.tables[n] );
}
}
}
return all_notes;
}



als Antwort auf: [#482240]
(Dieser Beitrag wurde von Gerald Singelmann am 13. Okt 2011, 11:07 geändert)

Per Skript auf alle Notizen zugreifen

WernerPerplies
Beiträge gesamt: 2693

13. Okt 2011, 11:23
Beitrag # 5 von 12
Beitrag ID: #482252
Bewertung:
(4240 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Entweder reden wir aneinander vorbei, oder bei mir ist das anders:

Zitat table.notes, bzw. story.tables[index].notes

Kurzform für:
app.activeDocument.stories[0].tables[0].notes[0]

So etwas gibt's bei mir.

Aber Sie meinen sicherlich etwas
anderes.


als Antwort auf: [#482246]

Per Skript auf alle Notizen zugreifen

flobuc
Beiträge gesamt: 246

13. Okt 2011, 11:32
Beitrag # 6 von 12
Beitrag ID: #482254
Bewertung:
(4230 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

danke für die Antworten.
Ich dachte ja an sowas wie document.allNotes oder so. Eine Suche nach Notizen wäre auch nichts schlecht, auch für nicht Skripter. Naja man kann nicht alles haben.

@Herrn Singelmann: Vielen Dank für den fertigen Code. Der ist kompakt und gut.

Gruss

Flo


als Antwort auf: [#482246]

Per Skript auf alle Notizen zugreifen

WernerPerplies
Beiträge gesamt: 2693

13. Okt 2011, 14:55
Beitrag # 7 von 12
Beitrag ID: #482284
Bewertung:
(4161 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Herr Singlemann,

ihr Einwand "geschachtelte Tabellen" spricht natürlich gegen die Ermittlung der Notes über
Zitat app.activeDocument.stories[0].tables[0].notes

weil hier nur die Notes der aktuellen Tabelle geliefert werden und für die enthaltenen Tabellen auf jeden Fall die Zellen durchlaufen werden müssen.

Rekursion ist hier natürlich ein Mittel der Wahl, aber in diesem Fall ziehe ich eine andere Lösung vor:

Code
main() 

function main()
{
var notesOfDocument = getNotesOfStories(app.activeDocument.stories);
alert(notesOfDocument.length);
}
function getNotesOfStories(stories)
{
var allNotesOfStories = new Array();
for (var i = 0; i<stories.length; i++) addElement(allNotesOfStories, getNotesOfStory(stories[i]));
return allNotesOfStories;
}
function getNotesOfStory(story)
{
var allNotesOfStory = new Array();
addElement(allNotesOfStory, story.notes);
addElement(allNotesOfStory, getNotesOfTables(story.tables));
return allNotesOfStory;
}
function getNotesOfTables(tables)
{
var allNotesOfTables = new Array();
for (var i = 0; i<tables.length; i++) addElement(allNotesOfTables, getNotesOfTableCells(tables[i].cells));
return allNotesOfTables
}
function getNotesOfTableCells(cells)
{
var allNotesOfCells = new Array();
for (var i = 0; i<cells.length; i++) addElement(allNotesOfCells, getNotesOfCell(cells[i]));
return allNotesOfCells;
}
function getNotesOfCell(cell)
{
var allNotesOfCell= new Array();
addElement(allNotesOfCell, cell.notes);
addElement(allNotesOfCell, getNotesOfTables(cell.tables));
return allNotesOfCell;
}
function addElement(/*collecttion/array*/ o, whichElements)
{
for (var i =0 ; i < whichElements.length; i++)
{
o.push(whichElements[i])
}
}



Beide Lösungen führen bei mir zum gleichen Ergebnis und zum gleichen Problem, bei dem Sie mir vielleicht helfen können:

Ich lese den Text einer Note so aus:
all_notes[0].texts[0].contents, dass klappt aber nur bei Notes aus Stories, bei Tabellen versagt diese Logik.

Vielleicht haben Sie ja einen Tipp für mich.


als Antwort auf: [#482246]

Per Skript auf alle Notizen zugreifen

gfellenz
Beiträge gesamt: 120

13. Okt 2011, 15:56
Beitrag # 8 von 12
Beitrag ID: #482289
Bewertung:
(4142 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo,

es scheint ein Bug von InDesign zu sein. Innerhalb von Tabellen wird zwar die Anzahl der Notizen in der Sammlung Notes angezeigt, aber sie lassen sich nicht referenzieren.

Wenn man Geralds Code in Zeile 53 anpasst, funktionierts:
Code
all_notes.push( x.texts[0].notes[n] ); 



Code
//*********************************************************************** 
//
// get all notes of document
//Description:Sammelt alle Notizen auch aus verschachtelten Tabellen in ein Array
//
// [Ver: 0.1] [Author: Gerald Singelmann] [Modif: 11-10-13]
// [Lang: DE] [Req: InDesign CS5] [Creat: 11-10-13]
//
// Bugs & Feedback : gerald{at}cuppascript{dot}com
// www.cuppascript.com
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
//*********************************************************************

#target indesign

get_notes();

function get_notes() {
var all_notes = new Array();
var doc = app.activeDocument;
var stories = doc.stories.everyItem().getElements();
for (var n = 0; n < stories.length; n++) {
get_notes_of_x( stories[n] );
}
alert (all_notes.length );

function get_notes_of_x( x ) {
if (x.constructor.name == "Story") {
for (var n = 0; n < x.notes.length; n++) {
all_notes.push( x.notes[n] );
}
for (var n = 0; n < x.tables.length; n++) {
get_notes_of_x( x.tables[n] );
}
}
if (x.constructor.name == "Table") {
for (var n = 0; n < x.cells.length; n++) {
get_notes_of_x( x.cells[n] );
}
}
if (x.constructor.name == "Cell") {
for (var n = 0; n < x.notes.length; n++) {
all_notes.push( x.texts[0].notes[n] );
}
for (var n = 0; n < x.tables.length; n++) {
get_notes_of_x( x.tables[n] );
}
}
}
return all_notes;
}



als Antwort auf: [#482284]

Per Skript auf alle Notizen zugreifen

WernerPerplies
Beiträge gesamt: 2693

13. Okt 2011, 16:19
Beitrag # 9 von 12
Beitrag ID: #482293
Bewertung:
(4131 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gregor,

danke, in meiner Routine müsste dann diese Funktion so geändert werden:
Code
function getNotesOfCell(cell) 
{
var allNotesOfCell= new Array();
cell.notes;
addElement(allNotesOfCell, cell.texts[0].notes);
addElement(allNotesOfCell, getNotesOfTables(cell.tables));
return allNotesOfCell;
}


Jetzt stellt sich mir hier nur die Frage, kann es mehrere Textobjekte geben und muss deshalb eventuell auch noch über diese Objekte geschleift werden?


als Antwort auf: [#482289]

Per Skript auf alle Notizen zugreifen

flobuc
Beiträge gesamt: 246

13. Okt 2011, 16:48
Beitrag # 10 von 12
Beitrag ID: #482296
Bewertung:
(4116 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Herr Fischer,


da haben Sie mich noch auf etwas gestossen, was schwer nach InDesign-Bug aussieht.

Antwort auf: Aber man kann den Inhalt ersetzen. ;-)
Code
app.notePreferences.findAndReplaceNoteContents = true; 



Die von Ihnen angesprochenen Option hat bei mir zweifelhafte Auswirkungen.

Und zwar werden bei der Grep-Suche (über Skript) Begriffe, die eine Notiz beinhalten, abhängig von oben genannten Parameter, gefunden oder nicht gefunden.
Bei der Suche über InDesign-GUI passt alles.

Ich kann das ganz leicht reproduziern:
Neues InDesign-Dokument, neuer Textrahmen, dort den Text "Seite 1" platzieren, irgendwo in dem Wort "Seite" eine neue Notiz anlegen (Inhalt der Notiz egal) und dann folgendes Skript ausführen:


Code
app.notePreferences.findAndReplaceNoteContents = true;  

app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findChangeGrepOptions.includeFootnotes = true;
app.findChangeGrepOptions.includeHiddenLayers = false;
app.findChangeGrepOptions.includeLockedLayersForFind = false;
app.findChangeGrepOptions.includeLockedStoriesForFind = false;
app.findChangeGrepOptions.includeMasterPages = false;
app.findGrepPreferences.findWhat = "Seite \\d";
var allMatches = app.activeDocument.findGrep(true);

alert(allMatches.length);


Abhängig von "findAndReplaceNoteContents" wird der Text gefunden oder nicht.

Da muss ich bei meinen Grep-Suchen in Zukunft aufpassen.

Gruss

Flo


als Antwort auf: [#482239]

Per Skript auf alle Notizen zugreifen

Martin Fischer
  
Beiträge gesamt: 12668

14. Okt 2011, 08:24
Beitrag # 11 von 12
Beitrag ID: #482334
Bewertung:
(4074 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Florian,

Antwort auf: Abhängig von "findAndReplaceNoteContents" wird der Text gefunden oder nicht.


Danke für den interessanten Hinweis.

Meine Tests haben ergeben, dass dieser Fehler bei InDesign CS5 (7.0.4, Mac) in Erscheinung tritt, wenn app.notePreferences.findAndReplaceNoteContents = true.

In InDesign CS4 (6.0.6) klappt's immer. Das Muster wird unabhängig von der Einstellung von app.notePreferences.findAndReplaceNoteContents gefunden.


@Gerald: Herzlichen Dank für Dein schönes Konstrukt für die rekursive Ermittlung der Notizen. Dieses Skelett lässt sich auch wunderbar für andere Objekte, die rekursiv zu ermitteln sind, verwenden. Es findet einen guten Platz in meinem Archiv.

@Gregor: Dank auch Dir für den kleinen Eingriff bei den Zellen.

Wie kommt es, dass in den Zellen (cells) zwar die Anzahl (length) der Notizen ermittelt werden kann, die Notizen selbst aber erst über das Textobjekt (texts[0]) gefasst werden?

Code
for (var n = 0; n < x.notes.length; n++) {  
all_notes.push( x.texts[0].notes[n] );


Konsequenterweise müsste die Schleife doch eigentlich folgendermaßen lauten:
Code
for (var n = 0; n < x.texts[0].notes.length; n++) {   
all_notes.push( x.texts[0].notes[n] );


Im DOM sind bei der Klasse cell wie auch bei der Klasse text notes als Kinder ausgewiesen.
Offensichtlich ist es sicherer, bei einer cell zusätzlich das enthaltene text-Objekt anzusprechen, um Notizen und womöglich auch andere text-Objekte (Kinder der cell) zu ermitteln.

edit:
------
Sorry, beim nochmaligen Lesen des Beitrags von Gregor stelle ich fest, dass er genau auf diesen Sachverhalt bereits hingewiesen hat. ;-)
Zitat es scheint ein Bug von InDesign zu sein. Innerhalb von Tabellen wird zwar die Anzahl der Notizen in der Sammlung Notes angezeigt, aber sie lassen sich nicht referenzieren.



als Antwort auf: [#482296]
(Dieser Beitrag wurde von Martin Fischer am 14. Okt 2011, 08:38 geändert)

Per Skript auf alle Notizen zugreifen

gfellenz
Beiträge gesamt: 120

14. Okt 2011, 11:00
Beitrag # 12 von 12
Beitrag ID: #482363
Bewertung:
(4034 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo martin,

konsequenterweise sollte man deine schleife verwenden und die eigenschaft length über texts[0] ermitteln.

Code
for (var n = 0; n < x.texts[0].notes.length; n++) {    
all_notes.push( x.texts[0].notes[n] );


ich hatte das nur schnell hingebastelt, weil mich der sachverhalt interessierte...

gregor


als Antwort auf: [#482334]
X

Aktuell

InDesign / Illustrator
axaio_PR_Bild_300x300_10_22

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
02.02.2023

Prozesse optimieren und effizient gestalten

Zürich
Donnerstag, 02. Feb. 2023, 08.00 - 10.00 Uhr

Digitalisierung, Webauftritt

Digitalisierung mitgestalten - Worauf kommt es an? Wie wichtig ist die Webseite? Webseite mit Word Press? Interne Prozesse optimieren

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: Birol Isik, E-Mailinfo AT bkcc DOT ch

https://digitalisierung-heute.ch/digitalisierung-informationstag-schweiz/

Veranstaltungen
01.03.2023 - 09.03.2023

Online
Mittwoch, 01. März 2023, 00.00 Uhr - Donnerstag, 09. März 2023, 00.00 Uhr

Online Webinar

Wie gehen wir mit diesen Veränderungen um? Was ist notwendig, damit wir die Digitalisierung im Unternehmen klappt? Veränderungsprozesse verstehen und entsprechend handeln Mitarbeiter als Botschafter Webseite mit WordPress erstellen SEA /SEO (Ads aufschalten)

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: B. Isik, E-Mailinfo AT snfa DOT ch

https://www.fernstudiumfitness.ch/digitalisierung-schweiz/