2016-09-03 2 views
0

Ich habe eine riesige Tabelle mit vielen Zeilen, die denselben Namen, aber unterschiedliche Elemente in jeder Zeile haben. Wenn ich folgende
rows = table.rows.whose (searchFilter)()
Und wenn ich rows.length, dann bekomme ich die richtige Nummer für die Suche. Die Arrays haben jedoch nur eine mehrfach wiederholte erste Zeile. Ich nehme an, es liegt daran, dass alle Zeilen denselben Namen haben und deren Objektbezeichner basierend auf byName() zurückgegeben werden. Ich kann filtern, indem ich jede Zeile mit JavaScript durchführe, aber es dauert wirklich sehr lange. Deren scheint den richtigen viel schneller zu filtern, gibt aber falsche Zeilen zurück. Gibt es einen Workaround dafür?
Danke!AppleScript JXA-Filtertabelle mit vielen Zeilen mit demselben Namen, aber verschiedenen Elementen

Antwort

0

Sie sagen nicht, welche App Sie scripten (was helfen würde), aber es klingt, als wäre es kein JXA-Problem, sondern ein Programm, da es die Zielanwendung ist, die entscheidet, ob Sie zurückkommen -Index, Name oder By-ID-Spezifizierer. Nur By-ID-Spezifizierer sind garantiert sowohl stabil als auch einzigartig (ihr einziger Nachteil besteht darin, dass die ID-Werte im Gegensatz zu den anderen nicht lesbar sind), aber viele Apps geben By-Index- oder Name-Formulare zurück; Ersteres ist ein Problem, wenn Elemente sich bewegen, letzteres, wenn Elementnamen nicht eindeutig sind.

Ich denke, Ihre einzige praktische Option ist es, die Zeilenwerte zu finden, dann zählen Sie selbst, um Ihre eigenen Index-Spezifizierer zu erstellen, wenn eine Reihe von Zeilenwerten Ihren Anforderungen entspricht. Auf diese Weise senden Sie immer noch nur ein paar Apple-Ereignisse insgesamt (d. H. Eine AE, um alle Werte aus einer einzelnen Spalte abzurufen), anstatt mehrere Ereignisse pro Zeile zu senden. Die Handhabung einer AE ist eine teure Operation. Wenn Sie also weniger komplexe Abfragen verwenden, um die gleichen Daten abzurufen, wird das viel billiger sein als die Verwendung vieler einfacher, selbst wenn Sie die Daten noch selbst sammeln es in die Form, die Sie eigentlich wollen.

z.B. In Apple [1], könnte man so etwas schreiben:

tell app "Whatever" 
    set allFoos to get value of cell "foo" of every row of theTable 
    set allBars to get value of cell "bar" of every row of theTable 
    set foundRefs to {} 
    repeat with i from 1 to length of allNames 
     if item i of allFoos is myFoo and item i of allBars is myBar then 
      set end of foundRefs to row i of theTable 
     end if 
    end repeat 
end tell 
-- foundRefs list now contains by-index refs to the matched rows 

(Here's another example wenn es den Punkt hilft illustrieren.)

Herauszufinden, wie der entsprechenden Code in JXA zu schreiben, von links nach jemandem dumm genug zu benutze das kaputte POS an erster Stelle. [2]

-

[1] Ironischerapple Listen haben O(n) Leistungsnachschlag wegen crappy interne Implementierung (wie Array Typ JS, AS-Listen tatsächlich Vektor-Arrays sind, sollten so sein O(1), aber sie bekommen, um tatsächlich Verhalten auf diese Weise erfordert kludging in zusätzlichen AS-Code, um die Laufzeit zu umgehen, um das beschissene Bit zu umgehen). Der gezeigte AppleScript-Code wird also abnormal schlecht funktionieren, aber sein Zweck ist hier nur, den allgemeinen Algorithmus zu demonstrieren, nicht ein Produktionsskript, also werde ich es nicht mit kludgy crap [2] verschleiern.

[2] Es gibt einen Grund, warum ich Poxen sowohl auf AS- als auch auf JXA-Häuser rufe, und halte mich selbst daran, appscript zu benutzen. Blame Apple, um eine ihrer größten, benutzerfreundlichsten Innovationen (Endbenutzer-Desktop-Automatisierung) direkt auf den Abfluss zu pissen und nicht einmal zu bemerken, dass sie es geschafft haben.

+0

Vielen Dank für die Antwort! Das ist sehr vielversprechend !!! Danke, dass Sie auf SwiftAE hingewiesen haben. Es wird praktisch! – chibop

+0

SwiftAE ist Alphaware und nicht voll funktionsfähig, also benutze es nicht für den Moment (Swifts Typsystem ist problematisch, daher funktioniert das Entpacken der Liste und der Aufzeichnungsergebnisse noch nicht, und ich muss es auch noch mit Swift3 fertigstellen).Ich weise nur auf seine Dokumentation als Referenz hin, weil es, obwohl es nicht großartig ist, immer noch viel informativer ist als alles auf Apples Website. – foo

+0

Bekam es. Die Lösung funktioniert vollkommen! Es spart viel Zeit! Vielen Dank! – chibop

Verwandte Themen