Condivisione di più file su iCloud utilizzando System Events in Applescript: Come intercettare un'opzione?

2

Sto provando a condividere una cartella con molti file di Numbers con iCloud, condividendo ogni file con un AppleScript e salvando il percorso di ogni file condiviso in modo che possa inviarlo ai miei collaboratori. Per farlo, utilizzo System Events. Sono arrivato al punto in cui posso condividere i file, ma non posso fare qualcosa di veramente semplice.

Per impostazione predefinita, quando condividi un file Numbers ti fornisce l'opzione "Mail" per impostazione predefinita in "Invita con ...". C'è anche un'opzione "Copia link". Se trovo un modo per selezionare quell'opzione, posso ottenere che tutto il resto funzioni. Tuttavia, nonostante i miei numerosi tentativi, non ho trovato alcun modo per dire a System Events di cambiare quella selezione predefinita. Tuttavia, posso vedere quale sintassi Automator utilizza per la stessa azione, ma quando copio la sintassi in Script Editor, l'azione non viene eseguita.

Se vuoi capire qual è il problema, supponendo di avere un file 'test.numbers' nella tua cartella Numbers del tuo disco iCloud, il seguente script lo condividerà (incollalo nell'app Script Editor):

=====

    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

=====

Tuttavia, non ho trovato alcun modo di fare il semplice passo in più per modificare il valore predefinito di mailing del link (vedrai che lo script incolla il link in un messaggio.

Qualcuno ha qualche idea su come ottenerlo? Ho provato le seguenti possibilità, da una chiamata a "Eventi di sistema": - Fai clic sull'immagine 1 dell'elemento UI 3 della riga 1 dell'area di scorrimento 1 dell'elemento UI 1 del foglio 1 della finestra "test" del processo di applicazione "Numeri" - Fai clic sul pulsante "Copia link" della riga 1 dell'area di scorrimento 1 dell'elemento UI 1 del foglio 1 della finestra "test" del processo di applicazione "Numeri" - Fai clic sull'elemento UI 3 della riga 1 dell'area di scorrimento 1 dell'elemento UI 1 del foglio 1 della finestra "test" del processo di applicazione "Numeri"

Quando lo script non si lamenta, l'azione non viene semplicemente eseguita. Per chiarezza, sto parlando della selezione dell'opzione "Copia link" nell'immagine incollata:

Qualsiasi suggerimento è benvenuto. Grazie,

(Utilizzo di OSX El Capitain 10.11.5)

    
posta lucabo 27.05.2016 - 18:15
fonte

1 risposta

1

OK, quindi rispondo alla mia stessa domanda. È possibile fare ciò che volevo, anche se non ho trovato una soluzione soddisfacente.

La risposta breve è: non ho trovato modo di utilizzare il applescript con la manipolazione diretta dell'interfaccia grafica (ad esempio i clic). Ho trovato un modo usando le alternative chiave. Per fare il pezzo esatto di lavoro di cui avevo bisogno, la seguente sequenza farà:

- dopo aver aperto il documento in Numbers, apri la finestra di condivisione:

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

- una volta aperta la finestra a discesa Condividi, usa la seguente combinazione di tasti

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}

La risposta lunga è: è un dolore al collo per una serie di motivi.

Innanzitutto, quando crei un file Numbers, è un file semplice. Tuttavia, quando è condiviso, o quando viene salvato in iCloud, diventa un pacchetto. Applescript vede i pacchetti come cartelle, quindi devi fare qualche controllo prima di fare qualsiasi cosa per sapere se ciò che stai trattando è una cartella o un pacchetto. Quindi puoi passare alle operazioni di condivisione.

Ora, non ho trovato alcun modo principale per intercettare quando esattamente un file diventa un pacchetto. Cioè, quando apri un file di Numbers e chiedi di condividerlo, vedrai che Numbers ti offre un messaggio di "preparazione del documento da condividere". Questo, ho trovato, è quando il file viene trasformato in un pacchetto. C'è una proprietà che si può usare per verificare se un dato percorso corrisponde a un pacchetto oa un singolo file: si può eseguire il ciclo while (la cartella del pacchetto di item_info è false) e poi continuare, ma questa proprietà diventa impostata come vero pozzo prima che Numbers abbia terminato il proprio "preparare il documento per condividere" il lavoro. Quindi ho potuto solo indovinare quando posso continuare e andare alla parte di condivisione della sceneggiatura. Metto un brusco ritardo di 30 secondi quando un file non è ancora un pacchetto, che dovrebbe dare un sacco di tempo a Numbers per completare le sue trasformazioni del file da condividere:

if (this_package_folder is false) and (this_extension is in the extension_list) then
    delay 30
end if

In secondo luogo, devi essere su una buona rete, in modo che tutte le operazioni relative a Numbers in iCloud possano essere eseguite senza problemi - altrimenti, iCloud ti darà dei messaggi di errore che bloccheranno l'esecuzione del lo script

In terzo luogo, devi occuparti dei file .DS_Store e di altri file che potrebbero trovarsi nella cartella in cui hai messo i tuoi documenti di Numbers da condividere.

In quarto luogo, se vuoi identificare dove si trova la cartella iCloud con i documenti da condividere, da dentro AppleScript non lo vedrai come lo vedi dal Finder (cioè, nell'unità iCloud), ma lo farai devi cercarlo in / yourUser / Library / Mobile Documents / iCloud Drive / yourfolder.

Con tutti questi avvertimenti, ecco la sceneggiatura che sto usando ora. Nel mio sistema, funziona. Presuppone diverse cose:

  1. c'è una cartella nel tuo iCloud in cui i tuoi documenti di Numbers sono
  2. si dispone di un file in cui si desidera salvare i percorsi dei file che verranno condivisi, in modo da conoscere i percorsi che si devono comunicare a quelli con cui si desidera condividere i file. Nel mio caso, utilizzo un documento di Pages.
  3. i file da condividere NON SONO già condivisi. Altrimenti, lo script darà errori.
  4. non ti preoccupi degli errori e dello stile. Lo script non ha controlli di errore. Non sono un programmatore.

Lo script ti chiederà di identificare prima la cartella con i documenti da condividere, quindi il file di Pages in cui desideri salvare i percorsi dei documenti condivisi e quindi aprirà i documenti da condividere uno per uno, condividili, li salverà, copierà il loro percorso nel documento di Pages che hai selezionato e alla fine uscirà da Numbers and Pages. Dare un sacco di tempo per l'esecuzione dello script e non interferire con esso. Si noti che quando si apre ciascun file di Numbers, è possibile modificare lo script in modo da inserire operazioni specifiche che si desidera eseguire sui file, sempre con la stessa tecnica (ad esempio, nel mio caso ho bisogno di trovare una cella, trovare un valore, copialo da qualche altra parte e salvalo.Questa parte della procedura non è nello script seguente.È possibile aggiungere qualsiasi cosa la fantasia ti porta ad inventare come operazioni contorte e complicate).

Ora, se qualcuno trova un modo per REVERSE l'operazione, annullando la condivisione dei file condivisi e, soprattutto, un modo per dire se un file è GIÀ condiviso o meno, in modo che lo script acquisisca generalità ....

Incollo lo script qui sotto.

-- 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
    
risposta data 21.06.2016 - 12:13
fonte

Leggi altre domande sui tag