[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Zellen nach Wertigkeit des Inhalts Farben zuweisen

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

Zellen nach Wertigkeit des Inhalts Farben zuweisen

wycom
Beiträge gesamt: 49

27. Sep 2012, 10:09
Beitrag # 1 von 19
Bewertung:
(6757 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen,

besteht die Möglichkeit per Skript, Zellen (Zellfarbe soll geändert werden; nicht Textfarbe in den Zellen) in einer Tabelle nach Wertigkeit des Inhalts, unterschiedliche Farben zuzuweisen?

Z.B. Zellen mit den Ziffern von 0-59 sollen Rot werden. Mit Ziffern 60-79 Gelb und 80-100 Grün. Es sollen aber nur die entsprechenden Ziffern gefunden werden (nicht 1059 oder 275)

Per GREP geht es nicht. Da finde ich die Zahlenbereiche, kann aber nichts automatisch ändern. Per Skript bin ich absoluter Neuling und aufgeschmissen.

Schon mal vielen Dank für Tipps und evtl. Hilfe.

Ulrich Döllken
X

Zellen nach Wertigkeit des Inhalts Farben zuweisen

-hans-
Beiträge gesamt: 748

27. Sep 2012, 12:14
Beitrag # 2 von 19
Beitrag ID: #501645
Bewertung:
(6717 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen,

ich würde drei Zellenformate erstellen: Rot, Gruen, Gelb.

Dann geht's bei mir z.B. so:
Code
app.findGrepPreferences = NothingEnum.nothing;  
app.changeGrepPreferences = NothingEnum.nothing;

var grepSearchs = [["\\<[0-5]{1}[0-9]{1}\\>", 'Rot'], ["\\<[6-7]{1}[0-9]{1}\\>", 'Gruen'], ["\\<[8-9]{1}[0-9]{1}\\>|\\<100\\>", 'Gelb']]; //0-59 sollen Rot werden., 60-79 Gelb und 80-100 Grün

var docTables = app.activeDocument.stories.everyItem().tables.everyItem().getElements();

o = docTables.length;
for(var i = 0; i < o;i++){
myTable = docTables[i];
l = grepSearchs.length;
while(l--){
app.findGrepPreferences.findWhat = grepSearchs[l][0];
var foundList = myTable.findGrep();
f = foundList.length;
while(f--){foundList[f].parent.appliedCellStyle = grepSearchs[l][1];}
}
}

app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;


Mag auch anders klappen :)


als Antwort auf: [#501634]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

wycom
Beiträge gesamt: 49

27. Sep 2012, 12:49
Beitrag # 3 von 19
Beitrag ID: #501647
Bewertung:
(6701 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Prima... es funktioniert. War nur ein kleiner Dreher drin. Gelb und Grün waren vertauscht.

Code
app.findGrepPreferences = NothingEnum.nothing;   
app.changeGrepPreferences = NothingEnum.nothing;

var grepSearchs = [["\\<[0-5]{1}[0-9]{1}\\>", 'Rot'], ["\\<[6-7]{1}[0-9]{1}\\>", 'Gelb'], ["\\<[8-9]{1}[0-9]{1}\\>|\\<100\\>", 'Gruen']]; //0-59 sollen Rot werden., 60-79 Gelb und 80-100 Grün

var docTables = app.activeDocument.stories.everyItem().tables.everyItem().getElements();

o = docTables.length;
for(var i = 0; i < o;i++){
myTable = docTables[i];
l = grepSearchs.length;
while(l--){
app.findGrepPreferences.findWhat = grepSearchs[l][0];
var foundList = myTable.findGrep();
f = foundList.length;
while(f--){foundList[f].parent.appliedCellStyle = grepSearchs[l][1];}
}
}

app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;


So funktioniert es... Bin begeistert. Ich weiß zwar noch nicht genau wie es funktioniert, werde mich aber einlesen. Ganz vielen Dank. :)

Viele Grüße
Ulrich


als Antwort auf: [#501645]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

Hans Haesler
  
Beiträge gesamt: 5826

27. Sep 2012, 12:51
Beitrag # 4 von 19
Beitrag ID: #501649
Bewertung:
(6699 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ulrich,

herzlich willkommen in der Skriptwerkstatt auf HDS! :-)

Wie meistens bei solchen Anfragen, wäre es gut, über ein Testdokument verfügen zu können.
Enthalten die Zellen nur Zahlen? Oder ist in einer Zelle nebst der Zahl auch Text enthalten?

Ich sehe, dass Hans-Gerd inzwischen eine Lösung gepostet hat. Meine hat einen anderen Ansatz. Deshalb veröffentliche ich sie auch.

Das folgende Script erwartet, dass die einzufärbenden Zellen nur Ziffern enthalten. Text oder leere Zellen werden ignoriert.
Wichtig ist, dass die Farbfelder "_Rot", "_Gelb", und "_Gruen" definiert sind.
Dann die Tabelle auswählen (alle Zellen sind ausgewählt) und das Script starten.

Code
//ZellenEinfaerben_501d.js 

var curTable = app.selection[0];

if (curTable.constructor.name != "Table") {
alert ("Bitte eine Tabelle auswählen.", "Stop");
exit();
}

var textList = curTable.cells.everyItem().texts[0].contents;

for (var c=0; c<textList.length; c++) {
var curText = textList[c];
if (curText != "") {
var curNumber = curText*1;
if (curNumber >-1 && curNumber <60) {
curTable.cells[c].fillColor = "_Rot";
}
else if (curNumber >59 && curNumber <80) {
curTable.cells[c].fillColor = "_Gelb";
}
else if (curNumber >79 && curNumber <101) {
curTable.cells[c].fillColor = "_Gruen";
}
}
}

Getestet mit CS5 unter Mac OS X 10.6.8.

Zwar nebensächlich aber gut zu wissen:
– Welche Version von InDesign?
– Mac OS X oder Windows?

Gruss, Hans


als Antwort auf: [#501645]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

wycom
Beiträge gesamt: 49

27. Sep 2012, 13:07
Beitrag # 5 von 19
Beitrag ID: #501652
Bewertung:
(6676 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

habe ich ausprobiert. Funktioniert fast perfekt. Das einzige was mir bei dem Skript aufgefallen ist, das Zellen, in denen eine 4stellige Ziffer steht, die mit 00 beginnt, z.B. 0013, auch umgefärbt wird. Aber sonst perfekt. Viele Wege führen nach Rom. :-)

In der Tabelle sind auch Texte (Städtenamen) enthalten.
Sonst nur 1- bis 4stellige Ziffern.

Ganz vielen Dank, das war genau das was ich gesucht habe. Ich muss mich da unbedingt einlesen. Da öffnen sich ja ganz neue Welten für mich :-)

Viele Grüße
Ulrich

Getestet mit CS5.5 unter Mac OS X 10.6.8.


als Antwort auf: [#501649]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

-hans-
Beiträge gesamt: 748

27. Sep 2012, 13:07
Beitrag # 6 von 19
Beitrag ID: #501653
Bewertung:
(6675 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
ups,

das Grep für Rot sollte wohl
Code
"\\<[0-5]{1}[0-9]{0,1}\\> 

sein, damit 1 bis 9 auch eingefärbt werden. sorry


als Antwort auf: [#501647]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

Hans Haesler
  
Beiträge gesamt: 5826

27. Sep 2012, 13:42
Beitrag # 7 von 19
Beitrag ID: #501656
Bewertung:
(6614 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ulrich,

zwei (oder mehr) führende Nullen könnten so abgefangen werden:

Code
//ZellenEinfaerben_502d.js 

var curTable = app.selection[0];

if (curTable.constructor.name != "Table") {
alert ("Bitte eine Tabelle auswählen.", "Stop");
exit();
}

var textList = curTable.cells.everyItem().texts[0].contents;

for (var c=0; c<textList.length; c++) {
var curText = textList[c];
if (curText != "") {
if (curText.slice(0,2) != "00") {
var curNumber = curText*1;
if (curNumber >-1 && curNumber <60) {
curTable.cells[c].fillColor = "_Rot";
}
else if (curNumber >59 && curNumber <80) {
curTable.cells[c].fillColor = "_Gelb";
}
else if (curNumber >79 && curNumber <101) {
curTable.cells[c].fillColor = "_Gruen";
}
}
}
}

Aber nimm ruhig den Code von Hans-Gerd. :-)

Gruss, Hans


als Antwort auf: [#501652]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

wycom
Beiträge gesamt: 49

27. Sep 2012, 13:57
Beitrag # 8 von 19
Beitrag ID: #501660
Bewertung:
(6604 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Habe deinen Code verwendet. Funktioniert jetzt auch perfekt. Die Möglichkeit mit den Zellenformaten von Hans-Gerd ist auch prima, allerdings in dem Fall mit etwas Nacharbeit verbunden, da die Zellen um die es geht unterschiedliche Ausrichtungen haben. Bei der Anwendung des Zellenformates werden die Ausrichtungen und Abstände überschrieben.

Ich bin ziemlich von den Socken Dank der prompten Hilfe.
Das so ein paar Zeilen Text einem so die Arbeit erleichtern können.

Das Buch "InDesign automatisieren: Keine Angst vor Skripting, GREP & Co" habe ich mir zum Einstieg bestellt. Mal schauen wie weit ich damit für den Anfang komme. Jetzt möchte ich auch verstehen was die Zeilen bedeuten :-) Wobei die Übersetzung einiges erklärt. Ich möchte aber auch wissen wie man es anwendet.
Wenn ihr noch einen verständlichen Referenztitel über Javascript für Anfänger kennt, dann lasst es mich bitte wissen.

Nochmals ganz vielen Dank :)

Viele Grüße
Ulrich


als Antwort auf: [#501656]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

Hans Haesler
  
Beiträge gesamt: 5826

27. Sep 2012, 15:03
Beitrag # 9 von 19
Beitrag ID: #501665
Bewertung:
(6543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ulrich,

bitteschön.

Ich glaube, das genannte Buch von Gregor Fellenz ist mehr als ausreichend (habe es aber immer noch nicht erstanden).

Nachfolgend nochmals das Script. Dieses Mal mit Erklärungen versehen:

Code
//ZellenEinfaerben_502d.js 

// der Variablen 'curTable' die Auswahl des Anwenders zuweisen
var curTable = app.selection[0];

// den Namen des Konstruktors prüfen
if (curTable.constructor.name != "Table") {
// falls nicht "Table": eine Warnung zeigen ...
alert ("Bitte eine Tabelle auswählen.", "Stop");
// ... und die Ausführung abbrechen
exit();
}

// der Variablen 'textList' den Inhalt aller Zellen zuweisen
// das Ergebnis ist ein Array (= eine Liste) von Strings (= Text)
// z.B. ["0", "1", "2", "3"]
var textList = curTable.cells.everyItem().texts[0].contents;

// eine Schleife durch die Liste

// der Startwert des automatischen Zählers 'c' ist Null: var c=0;
// damit wird das erste Element der Liste adressiert
// (JavaScript-Zählweise: 0 ist 1, 1 ist 2, 2 ist 3 usw.)

// c<textList.length bedeutet: solange der Wert von 'c' kleiner als die Länge
// der Liste (= die Anzahl Elemente) ist, geht es auf einen weiteren Duchgang

// mit c++ wird der Wert des Zählers bei jedem Umgang um 1 erhöht
for (var c=0; c<textList.length; c++) {
// der Variablen 'curText' das aktuelle Element zuweisen
var curText = textList[c];
// Textketten (= eine Folge von Zeichen) werden mit An- und Abführungszeichen eingefasst: "text"
// deshalb ist "" eine Textkette ohne Inhalt
// if (= wenn) der Inhalt von 'curText' nicht eine leere Textkette ist
// das Ausrufezeichen gefolgt von einem Gleichheitszeichen bedeutet "ist nicht"
// testen, ob das keine leere Zelle war (sonst wird alles übersprungen und
// das nächste Element der Liste wird drangenommen)
if (curText != "") {
// mit slice(0,2) werden das erste und das zweite Zeichen des aktuellen Strings
// mit der Textkette "00" verglichen. Ist keine Übereinstimmung, dann werden die
// nächsten Zeilen ausgeführt. Falls die Kette aber mit "00" beginnt, werden die
// Zeilen übersprungen
if (curText.slice(0,2) != "00") {
// die aktuelle Textkette wird mit eins multipliziert (und dadurch von einem String
// in eine Zahl verwandelt) und der Variablen 'curNumber' zugewiesen
// diese Umwandlung ist notwendig, damit die folgenden Tests zuverlässig funktionieren
var curNumber = curText*1;
// im ersten if-Test wird geprüft, ob die aktuelle Zahl grösser als minus eins und
// kleiner als 60 ist (so werden alle Zahlen von 0 bis 59 akzeptiert)
// ein Test ist immer von Klammern eingefasst. Das Grösser-als-Zeichen ist dieses >
// das Kleiner-als-Zeichen ist jenes < und für das 'und' werden zwei & verwendet
if (curNumber >-1 && curNumber <60) {
// bei einer Übereinstimmung wird dem Hintergrund der Zelle 'c' "_Rot" zugewiesen
curTable.cells[c].fillColor = "_Rot";
}
// falls der Wert grösser als 59 und kleiner als 80 ist, wird "_Gelb" zugewiesen usw.
else if (curNumber >59 && curNumber <80) {
curTable.cells[c].fillColor = "_Gelb";
}
else if (curNumber >79 && curNumber <101) {
curTable.cells[c].fillColor = "_Gruen";
}
}
}
}

Es gäbe noch viel zu erklären. Aber im Buch wird sicher Grundlegendes behandelt.

Zitat Ich bin ziemlich von den Socken Dank der prompten Hilfe.
Das so ein paar Zeilen Text einem so die Arbeit erleichtern können.

Kleiner Hinweis: http://hilfdirselbst.org/...amp;read_category=31 :-)

Besten Dank im voraus.

Gruss, Hans


als Antwort auf: [#501660]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

-hans-
Beiträge gesamt: 748

27. Sep 2012, 17:50
Beitrag # 10 von 19
Beitrag ID: #501683
Bewertung:
(6503 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hab's auf fillColor anstatt cellStyle geändert und kurz auskommentiert. (Nicht so schön wie Hans ;-) )
Code
//letzte Grepsuche löschen 
app.findGrepPreferences = NothingEnum.nothing;
//Array der Grepsuchen mit dazugehöriger Farbe
var grepSearchs = [["\\<[0-5]{1}[0-9]{0,1}\\>", '_Rot'], ["\\<[6-7]{1}[0-9]{1}\\>", '_Gelb'], ["\\<[8-9]{1}[0-9]{1}\\>|\\<100\\>", '_Gruen']]; //0-59 sollen Rot werden., 60-79 Gelb und 80-100 Grün

//Array aller Tabellen des Dokumentes
var docTables = app.activeDocument.stories.everyItem().tables.everyItem().getElements();
//Bestimmung der Länge des Arrays docTables
o = docTables.length;
//Schleife durch alle Tabellen
for(var i = 0; i < o;i++){
//eine einzelne Tabelle
myTable = docTables[i];
//Bestimmung der Länge des Arrays greSearchs
l = grepSearchs.length;
//while-Schleife durch grepSearchs
while(l--){
//festlegen der aktuellen Grepsuche
app.findGrepPreferences.findWhat = grepSearchs[l][0];
//ausführen der Grepsuche. Treffer werden in einem Array gesichert
var foundList = myTable.findGrep();
f = foundList.length;
//while-Schleife durch die Treffer mit Zuweisung der Zielfarbe. Parent des Treffers ist die Zelle ...
while(f--){foundList[f].parent.fillColor = grepSearchs[l][1];}
}
}
//letzte Grepsuche löschen
app.findGrepPreferences = NothingEnum.nothing;



Allgemein JS im Netz + leicht verständlich:
http://de.selfhtml.org/javascript/index.htm und z.B. http://www.w3schools.com/js/default.asp


als Antwort auf: [#501665]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

Hans Haesler
  
Beiträge gesamt: 5826

27. Sep 2012, 20:03
Beitrag # 11 von 19
Beitrag ID: #501696
Bewertung:
(6450 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans-Gerd,

die Zellen mit den Zahlen 6, 7, 8 und 9 werden immer noch nicht rot eingefärbt.

Gruss, Hans


als Antwort auf: [#501683]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

-hans-
Beiträge gesamt: 748

27. Sep 2012, 20:36
Beitrag # 12 von 19
Beitrag ID: #501699
Bewertung:
(6439 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi,

der sollte gehen '\\<[0-5]{1}[0-9]{0,1}\\>|\\<[6-9]\\>', oder?
Bin für guten Grep-Rat offen :)


als Antwort auf: [#501696]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

Hans Haesler
  
Beiträge gesamt: 5826

27. Sep 2012, 20:51
Beitrag # 13 von 19
Beitrag ID: #501700
Bewertung:
(6422 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans-Gerd,

ja, der geht! :-)

Jetzt kann Ulrich wählen:
– Variante Hans-Gerd: Färbt Zellen ein, auch wenn nebst der Nummer noch Text vorhanden ist.
– Variante Hans: Färbt Zellen nur ein, wenn eine Zahl alleine drin steht.

Gruss, Hans


als Antwort auf: [#501699]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

wycom
Beiträge gesamt: 49

18. Mär 2013, 11:08
Beitrag # 14 von 19
Beitrag ID: #509994
Bewertung:
(5576 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

du hast mir vor längerer Zeit mal sehr mit diesem Skript geholfen.
Jetzt wollte ich es mal als Anfänger um eine weitere Funktion ergänzen. Es soll zusätzlich leere Zellen mit der Farbe "Gruen 30%" füllen.
Ich habe dein Skript mal um 2 Zeilen ergänzt.

Code
var curTable = app.selection[0];  

if (curTable.constructor.name != "Table") {
alert ("Bitte eine Tabelle auswählen.", "Stop");
exit();
}

var textList = curTable.cells.everyItem().texts[0].contents;

for (var c=0; c<textList.length; c++) {
var curText = textList[c];
if (curText != "") {
if (curText.slice(0,2) != "00") {
var curNumber = curText*1;
if (curNumber >-1 && curNumber <60) {
curTable.cells[c].fillColor = "_Rot";
}
else if (curNumber >59 && curNumber <80) {
curTable.cells[c].fillColor = "_Gelb";
}
else if (curNumber >79 && curNumber <101) {
curTable.cells[c].fillColor = "_Gruen";
}
else if (curNumber =null) {
curTable.cells[c].fillColor = "_Gruen 30%";
}
}
}
}


Beschreibt "null" in diesem Falle nicht "keine" Ziffer? Oder muss ich den Inhalt anders definieren?
Habe das Skript ausprobiert. Es ändert sich nichts, spuckt aber auch keine Fehlermeldung aus.

Viele Grüße
Ulrich


als Antwort auf: [#501700]

Zellen nach Wertigkeit des Inhalts Farben zuweisen

Hans Haesler
  
Beiträge gesamt: 5826

18. Mär 2013, 12:00
Beitrag # 15 von 19
Beitrag ID: #509996
Bewertung:
(5535 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ulrich,

ob eine Zelle leer ist (oder nicht), wird mit diesem Test festgestellt:

Code
if (curText != "") { 

Der Operator != bedeutet: ist nicht.
Links davon ist die Variable curText und rechts davon "" (= ein Anführungs- und ein Abführungszeichen; und nichts dazwischen = eine leere Textkette).
Also: Wenn der aktuelle Zelleninhalt, keine leere Textkette ist, dann werden die Farben zugewiesen, falls sie den Zahlen entsprechen.

Deshalb kann man am Ende ein else einfügen. Das bedeutet sonst.
Also: Die aktuelle Zelle ist leer. Und das entsprechende Farbfeld wird zugewiesen:

Code
var curTable = app.selection[0]; 

if (curTable.constructor.name != "Table") {
alert ("Bitte eine Tabelle auswählen.", "Stop");
exit();
}

var textList = curTable.cells.everyItem().texts[0].contents;

for (var c=0; c<textList.length; c++) {
var curText = textList[c];
if (curText != "") {
if (curText.slice(0,2) != "00") {
var curNumber = curText*1;
if (curNumber >-1 && curNumber <60) {
curTable.cells[c].fillColor = "_Rot";
}
else if (curNumber >59 && curNumber <80) {
curTable.cells[c].fillColor = "_Gelb";
}
else if (curNumber >79 && curNumber <101) {
curTable.cells[c].fillColor = "_Gruen";
}
}
}
else {
curTable.cells[c].fillColor = "_Gruen 30%";
}

}

Ausnahmsweise habe ich es nicht ausprobiert.

Gruss, Hans


als Antwort auf: [#509994]
X