Teilen mehrerer Dateien in iCloud mithilfe von Systemereignissen in Applescript: Wie kann eine Option abgefangen werden?

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:

Standard-Link-Dropdown-Fenster zum Teilen

Jeder Vorschlag ist willkommen. Danke,

(mit OSX El Capitain 10.11.5)

Antworten (1)

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:

  1. Es gibt einen Ordner in Ihrer iCloud, in dem sich Ihre Numbers-Dokumente befinden
  2. Sie haben eine Datei, in der Sie die Pfade der Dateien speichern möchten, die freigegeben werden sollen, damit Sie die Pfade kennen, die Sie denen mitteilen müssen, mit denen Sie Ihre Dateien teilen möchten. In meinem Fall verwende ich ein Pages-Dokument.
  3. die zu teilenden Dateien SIND NICHT bereits geteilt. Andernfalls gibt das Skript Fehler aus.
  4. Sie kümmern sich nicht um Fehler und Stil. Das Skript hat keine Fehlerprüfungen. Ich bin kein Programmierer.

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