Ich versuche, einen Ordner mit vielen Numbers-Dateien für iCloud freizugeben, indem ich jede Datei mit einem AppleScript freigebe und den Pfad jeder freigegebenen Datei speichere, damit ich sie an meine Mitarbeiter senden kann. Dazu verwende ich Systemereignisse. Ich habe den Punkt erreicht, an dem ich die Dateien freigeben kann, aber ich kann etwas wirklich Einfaches nicht tun.
Wenn Sie eine Datei freigeben, gibt Ihnen Numbers standardmäßig die Option „Mail“ unter „Einladen mit …“ . Es gibt auch eine Option "Link kopieren". Wenn ich eine Möglichkeit finde, diese Option auszuwählen, kann ich alles andere zum Laufen bringen. Trotz meiner vielen Versuche konnte ich jedoch keine Möglichkeit finden, System Events anzuweisen, diese Standardauswahl zu ändern. Ich kann zwar sehen, welche Syntax Automator für dieselbe Aktion verwendet, aber wenn ich diese Syntax in den Skripteditor kopiere, wird die Aktion nicht ausgeführt.
Wenn Sie verstehen möchten, was das Problem ist, vorausgesetzt, Sie haben eine 'test.numbers'-Datei in Ihrem Numbers-Ordner Ihrer iCloud-Festplatte, wird das folgende Skript diese Datei freigeben (fügen Sie sie in die Skript-Editor-App ein):
=====
tell application "Finder"
open POSIX file "/Users/[
XXXPUT HERE YOUR USER NAME
]/Library/Mobile Documents/com~apple~Numbers/Documents/test.numbers"
end tell
delay 2
tell application "System Events"
tell process "Numbers"
delay 1
tell menu bar 1
tell menu bar item "Share"
tell menu "Share"
delay 1
click menu item "Share Link via iCloud…"
delay 1
end tell
end tell
end tell
click button "Share Spreadsheet" of UI element 1 of sheet 1 of window "test"
delay 5
end tell
delay 5
tell process "Numbers"
tell menu bar 1
tell menu bar item "Numbers"
tell menu "Numbers"
delay 1
click menu item "Quit Numbers"
end tell
end tell
end tell
end tell
end tell
=====
Ich habe jedoch keine Möglichkeit gefunden, den einfachen zusätzlichen Schritt zum Ändern des Standardwerts zum Versenden des Links auszuführen (Sie werden sehen, dass das Skript den Link in eine Nachricht einfügt.
Hat jemand eine Ahnung, wie man das erreicht? Ich habe die folgenden Möglichkeiten ausprobiert, von einem Aufruf zu "Systemereignissen": --klicken Sie auf Bild 1 von UI-Element 3 von Zeile 1 von Scrollbereich 1 von UI-Element 1 von Blatt 1 von Fenster "Test" von Anwendungsprozess "Numbers" - -Button "Link kopieren" der Zeile 1 des Scrollbereichs 1 des UI-Elements 1 des Blatts 1 des Fensters "Test" des Anwendungsprozesses "Zahlen" anklicken --das UI-Element 3 der Zeile 1 des Scrollbereichs 1 des UI-Elements 1 anklicken Blatt 1 des Fensters „Test“ des Bewerbungsverfahrens „Zahlen“
Wenn sich das Skript nicht beschwert, wird die Aktion einfach nicht ausgeführt. Aus Gründen der Übersichtlichkeit spreche ich davon, die Option "Link kopieren" im eingefügten Bild auszuwählen:
Jeder Vorschlag ist willkommen. Danke,
(mit OSX El Capitain 10.11.5)
OK, also beantworte ich meine eigene Frage. Es ist möglich, das zu tun, was ich wollte, obwohl ich keine zufriedenstellende Lösung gefunden habe.
Die kurze Antwort lautet: Ich konnte keine Möglichkeit finden, Applescript mit der direkten Manipulation der grafischen Oberfläche (z. B. Klicks) zu verwenden. Ich habe einen Weg gefunden, indem ich Schlüsselalternativen verwendet habe. Um genau die Arbeit zu erledigen, die ich benötigte, reicht die folgende Sequenz aus:
-- Öffnen Sie nach dem Öffnen des Dokuments in Numbers das Teilen-Fenster:
tell application "System Events"
tell process "Numbers"
delay 1
tell menu bar 1
tell menu bar item "Share"
tell menu "Share"
delay 1
click menu item "Share Link via iCloud…"
end tell
end tell
end tell
end tell
-- sobald das Freigabe-Dropdown-Fenster geöffnet ist, verwenden Sie die folgende Tastenkombination
tell application "System Events"
--add tabs
delay 1
key code 48
delay 1
key code 48
delay 1
-- use arrows to move to the right part of the 'Share' window
key code 124
delay 1
key code 124
delay 3
-- click return
key code 36
delay 8
-- save the file and close it
keystroke "s" using {command down}
delay 4
keystroke "w" using {command down}
Die lange Antwort lautet: Es ist aus einer Reihe von Gründen ein Schmerz im Nacken.
Erstens, wenn Sie eine Numbers-Datei erstellen, handelt es sich um eine einfache Datei. Wenn es jedoch geteilt oder in iCloud gespeichert wird, wird es zu einem Paket. Applescript betrachtet Pakete als Ordner, daher müssen Sie vor jeder Aktion prüfen, ob es sich um einen Ordner oder ein Paket handelt. Dann können Sie mit den Freigabevorgängen fortfahren.
Jetzt habe ich KEINE prinzipielle Möglichkeit gefunden, abzufangen, wann genau eine Datei zu einem Paket wird. Das heißt, wenn Sie eine Numbers-Datei öffnen und um Freigabe bitten, sehen Sie, dass Numbers Ihnen die Meldung „Vorbereitung des Dokuments zur Freigabe“ ausgibt. Ich habe festgestellt, dass dies der Fall ist, wenn die Datei in ein Paket umgewandelt wird. Es gibt eine Eigenschaft, die man verwenden kann, um zu prüfen, ob ein gegebener Pfad einem Paket oder einer einzelnen Datei entspricht: man könnte while (Paketordner der item_info ist falsch) durchlaufen und dann fortfahren, aber diese Eigenschaft wird auch auf wahr gesetzt bevor Numbers seine eigene Arbeit zum „Vorbereiten des Dokuments zum Teilen“ beendet hat. Daher konnte ich nur raten, wann ich fortfahren und zum Freigabeteil des Skripts gehen kann. Ich habe eine ungefähre Verzögerung von 30 Sekunden festgelegt, wenn eine Datei noch kein Paket ist.
if (this_package_folder is false) and (this_extension is in the extension_list) then
delay 30
end if
Zweitens müssen Sie sich in einem guten Netzwerk befinden, damit alle Vorgänge im Zusammenhang mit Numbers in iCloud reibungslos ausgeführt werden können – andernfalls gibt Ihnen iCloud Fehlermeldungen aus, die die Ausführung des Skripts blockieren
Drittens müssen Sie sich um die .DS_Store-Dateien und andere Dateien kümmern, die sich möglicherweise in dem Ordner befinden, in dem Sie Ihre gemeinsam zu nutzenden Numbers-Dokumente abgelegt haben.
Viertens, wenn Sie herausfinden möchten, wo sich der iCloud-Ordner mit den zu teilenden Dokumenten befindet, sehen Sie ihn in AppleScript nicht so, wie Sie ihn im Finder sehen (dh im iCloud Drive), aber Sie müssen nachsehen dafür in /yourUser/Library/Mobile Documents/iCloud Drive/yourfolder.
Mit all diesen Einschränkungen ist hier das Skript, das ich jetzt verwende. In meinem System funktioniert es. Es setzt mehrere Dinge voraus:
Das Skript fordert Sie auf, zuerst den Ordner mit den freizugebenden Dokumenten zu identifizieren, dann die Pages-Datei, in der Sie die Pfade der freigegebenen Dokumente speichern möchten, und öffnet dann die freizugebenden Dokumente nacheinander und gibt sie frei. speichert sie, kopiert ihren Pfad in das ausgewählte Pages-Dokument und beendet schließlich Numbers and Pages. Geben Sie dem Skript genügend Zeit, um es auszuführen, und stören Sie es nicht. Beachten Sie, dass Sie beim Öffnen jeder Numbers-Datei das Skript so ändern können, dass Sie bestimmte Operationen einfügen, die Sie für Ihre Dateien ausführen möchten, immer mit derselben Technik (in meinem Fall muss ich beispielsweise eine Zelle finden, find einen Wert, kopieren Sie ihn an eine andere Stelle und speichern Sie ihn Dieser Teil des Verfahrens ist nicht im folgenden Skript enthalten.
Nun, wenn jemand einen Weg findet, die Operation RÜCKZUGEBEN, die freigegebenen Dateien aufzuheben und insbesondere festzustellen, ob eine Datei BEREITS freigegeben ist oder nicht, damit das Skript Allgemeingültigkeit erlangt ....
Ich füge das Skript unten ein.
-- Beginning of the script
global f
property extension_list : {"numbers"}
tell application "Finder"
set source_folder to choose folder with prompt "Please select directory."
set posixSource_Folder to POSIX path of source_folder
tell application "System Events"
set these_items to POSIX path of disk items of folder posixSource_Folder
end tell
my createList(these_items)
end tell
on createList(these_items)
tell application "System Events"
tell application "Finder"
set f to (choose file with prompt "Choose a file where to store the paths")
end tell
end tell
set posixF to POSIX path of f
delay 2
tell application "Finder" to open file f
delay 1
repeat with i from 1 to the count of these_items
set this_item to item i of these_items
set the item_info to info for this_item
set this_extension to the name extension of item_info
if folder of the item_info is true and (package folder of the item_info is false) and (this_extension is not in the extension_list) then
process_folder(this_item)
else
if (this_extension is in the extension_list) then
process_item(this_item)
end if
end if
end repeat
close_files()
end createList
-- this sub-routine processes folders
on process_folder(this_folder)
-- set these_items to list folder this_folder without invisibles
set posix_this_folder to POSIX path of this_folder
tell application "System Events"
set these_items to POSIX path of disk items of folder posix_this_folder
end tell
repeat with i from 1 to the count of these_items
--set this_item to alias ((this_folder as Unicode text) & (item i of these_items))
set the item_info to info for this_item
set this_extension to the name extension of item_info
--if folder of the item_info is true and (this_extension is not in the extension_list) then
if folder of the item_info is true and (package folder of the item_info is false) and (this_extension is not in the extension_list) then
process_folder(this_item)
else
if (package folder of the item_info is true) and (this_extension is in the extension_list) and (alias of the item_info is false) then
process_item(this_item)
end if
end if
end repeat
end process_folder
-- this sub-routine processes files
on process_item(this_item)
set the item_info to info for this_item
set this_extension to the name extension of item_info
set this_package_folder to the package folder of item_info
set Posix_Item to POSIX path of this_item
set Posix_File to POSIX file Posix_Item
delay 1
--opening the Numbers file
tell application "Finder" to open Posix_File
delay 3
-- going to Numbers and making the file shared
tell application "System Events"
tell process "Numbers"
delay 1
tell menu bar 1
tell menu bar item "Share"
tell menu "Share"
delay 1
click menu item "Share Link via iCloud…"
end tell
end tell
end tell
end tell
-- extra time allowed for non packages
delay 3
end tell
if (this_package_folder is false) and (this_extension is in the extension_list) then
delay 30
end if
--tabs
tell application "System Events"
delay 1
key code 48
delay 1
key code 48
delay 1
-- arrows
key code 124
delay 1
key code 124
delay 3
-- returns
key code 36
-- leave some time for Numbers to actually share the file. Maybe you need more time for your system.
delay 8
-- saving and closing documents
keystroke "s" using {command down}
delay 4
keystroke "w" using {command down}
-- Now returning to the file where the paths have to be pasted
tell application "Finder" to open file f
delay 2
-- pasting the local Unix path
keystroke "v" using {command down}
delay 1
key code 48
delay 2
-- pasting the iCloud remote path of the shared document
set the clipboard to Posix_Item
delay 1
keystroke "v" using {command down}
delay 1
key code 48
key code 36
delay 1
keystroke "s" using {command down}
end tell
end process_item
--closing files
on close_files()
tell application "System Events"
tell process "Numbers"
tell menu bar 1
tell menu bar item "Numbers"
tell menu "Numbers"
delay 1
click menu item "Quit Numbers"
end tell
end tell
end tell
end tell
tell application "Finder" to open file f
delay 2
keystroke "q" using {command down}
delay 1
end tell
end close_files
-- end of the script