Compartir múltiples archivos en iCloud usando System Events en Applescript: ¿Cómo interceptar una opción?

2

Estoy intentando compartir una carpeta con muchos archivos de Numbers con iCloud, compartiendo cada archivo con un AppleScript y guardando la ruta de cada archivo compartido para poder enviarlo a mis colaboradores. Para hacer eso, uso los eventos del sistema. Llegué al punto en el que puedo compartir los archivos, pero no puedo hacer algo realmente simple.

De forma predeterminada, cuando comparte un archivo, Números le da la opción "Correo" de forma predeterminada en "Invitar con ...". También hay una opción "Copiar enlace". Si encuentro una manera de seleccionar esa opción, puedo hacer que todo lo demás funcione. Sin embargo, a pesar de mis muchos intentos, no pude encontrar una manera de indicar a Eventos del sistema que cambien esa selección predeterminada. Sin embargo, puedo ver qué sintaxis utiliza Automator para la misma acción, pero cuando copio esa sintaxis en Script Editor, la acción no se ejecuta.

Si desea comprender cuál es el problema, suponiendo que tiene un archivo 'test.numbers' en su carpeta de Números de su disco de iCloud, el siguiente script compartirá ese archivo (péguelo en la aplicación 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

=====

Sin embargo, no encontré ninguna manera de hacer el simple paso adicional de cambiar el valor predeterminado de enviar el enlace (verás que la secuencia de comandos pega el enlace en un mensaje.

¿Alguien tiene alguna idea de cómo lograrlo? Probé las siguientes posibilidades, desde una llamada a "Eventos del sistema": --haga clic en la imagen 1 del elemento UI 3 de la fila 1 del área de desplazamiento 1 del elemento UI 1 de la hoja 1 de la ventana "prueba" del proceso de solicitud "Números" --haga clic en el botón "Copiar enlace" de la fila 1 del área de desplazamiento 1 del elemento UI 1 de la hoja 1 de la ventana "prueba" del proceso de solicitud "Números" --haga clic en el elemento 3 de la interfaz de usuario de la fila 1 del área de desplazamiento 1 del elemento 1 de la interfaz de usuario de la hoja 1 de la ventana "prueba" del proceso de solicitud "Números"

Cuando el script no se queja, la acción simplemente no se ejecuta. Para mayor claridad, estoy hablando de seleccionar la opción "Copiar enlace" en la imagen pegada:

Cualquier sugerencia es bienvenida. Gracias,

(Usando OSX El Capitain 10.11.5)

    
pregunta lucabo 27.05.2016 - 18:15

1 respuesta

1

OK, así que respondo a mi propia pregunta. Es posible hacer lo que quería, aunque no encontré una solución satisfactoria.

La respuesta corta es: no pude encontrar una manera de usar applecript con la manipulación directa de la interfaz gráfica (por ejemplo, clics). Encontré una manera usando alternativas clave. Para hacer el trabajo exacto que necesitaba, la siguiente secuencia lo hará:

: después de abrir el documento en Números, abra la ventana de compartir:

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 vez que la ventana desplegable de compartir esté abierta, use la siguiente combinación de teclas

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 respuesta larga es: es un dolor en el cuello por una serie de razones.

Primero, cuando creas un archivo de Números, es un archivo simple. Sin embargo, cuando se comparte, o cuando se guarda en iCloud, se convierte en un paquete. Applescript ve los paquetes como carpetas, por lo que debe verificar antes de hacer algo para saber si se trata de una carpeta o un paquete. Luego puedes continuar con las operaciones de intercambio.

Ahora, no encontré ninguna forma principal de interceptar cuando exactamente un archivo se convierte en un paquete. Es decir, cuando abres un archivo de Números y pides que se comparta, verás que Números te da un mensaje de "preparando el documento para compartir". Esto, encontré, es cuando el archivo se transforma en un paquete. Existe una propiedad que se puede usar para verificar si una ruta determinada corresponde a un paquete o un solo archivo: se podría hacer un bucle mientras (la carpeta del paquete de item_info es falsa) y luego continuar, pero esta propiedad se establece como verdadera. antes de que Numbers haya terminado su propio trabajo de "preparar el documento para compartir". Así que solo pude adivinar cuándo puedo continuar e ir a la parte de compartir del script. Puse un retraso aproximado de 30 segundos cuando un archivo aún no es un paquete, lo que debería dar suficiente tiempo para que Numbers finalice las transformaciones del archivo para compartir:

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

Segundo, debe estar en una buena red, para que todas las operaciones relacionadas con Numbers en iCloud puedan realizarse sin problemas. De lo contrario, iCloud le dará mensajes de error que bloquearán la ejecución de script

En tercer lugar, debes cuidar los archivos .DS_Store y otros archivos que puedan estar dentro de la carpeta donde colocas tus documentos de Numbers para compartir.

Cuarto, si desea identificar dónde se encuentra la carpeta de iCloud con los documentos que se compartirán, desde AppleScript no lo verá como lo ve desde el buscador (es decir, en la unidad de iCloud), pero Hay que buscarlo en / yourUser / Library / Mobile Documents / iCloud Drive / yourfolder.

Con todas estas advertencias, aquí está el script que estoy usando ahora. En mi sistema, funciona. Asume varias cosas:

  1. hay una carpeta en tu iCloud donde están los documentos de Numbers
  2. tiene un archivo en el que desea guardar las rutas de los archivos que se compartirán, para que conozca las rutas que debe comunicar a las personas con las que desea compartir sus archivos. En mi caso, uso un documento de Pages.
  3. los archivos que se compartirán NO ESTÁN ya compartidos. De lo contrario, la secuencia de comandos dará errores.
  4. no te importan los errores ni el estilo. El script no tiene comprobaciones de error. No soy programador.

El script le pedirá que primero identifique la carpeta con los documentos que se compartirán, luego el archivo de Pages donde desea guardar las rutas de los documentos compartidos, y luego abrirá los documentos que se compartirán uno por uno, Compártelos, los guardará, copiará su ruta al documento de Páginas que seleccionó y finalmente saldrá de Números y Páginas. Conceda suficiente tiempo para que el script se ejecute y no interfiera con él. Tenga en cuenta que cuando abre cada archivo de Numbers, puede modificar el script para insertar operaciones específicas que desee realizar en sus archivos, siempre con la misma técnica (por ejemplo, en mi caso, necesito encontrar una celda, buscar un valor, cópielo en otro lugar y guárdelo. Esta parte del procedimiento no se encuentra en el siguiente script. Puede agregar lo que su fantasía lo lleve a inventar como operaciones contorsionadas y complicadas).

Ahora, si alguien encuentra una manera de REVERSAR la operación, no compartir los archivos compartidos, y especialmente, una manera de saber si un archivo ya está compartido o no, para que el script adquiera una generalidad ...

Pego el script a continuación.

-- 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
    
respondido por el lucabo 21.06.2016 - 12:13

Lea otras preguntas en las etiquetas