Compartir múltiples archivos en iCloud usando Eventos del sistema en Applescript: ¿Cómo interceptar una opción?

Estoy tratando de 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 Eventos del sistema. Llegué al punto en que puedo compartir los archivos, pero no puedo hacer algo realmente simple.

Por defecto, cuando compartes un archivo Numbers te da la opción "Correo" por defecto en el apartado "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 la manera de decirle a Eventos del sistema que cambie esa selección predeterminada. Sin embargo, puedo ver qué sintaxis usa 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 la carpeta Números de su disco iCloud, la siguiente secuencia de comandos compartirá ese archivo (péguelo en la aplicación Editor de secuencias de comandos):

=====

    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 forma de realizar el simple paso adicional de cambiar el valor predeterminado de enviar el enlace por correo (verá que el script 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 3 de la IU de la fila 1 del área de desplazamiento 1 del elemento 1 de la IU de la hoja 1 de la ventana "prueba" del proceso de aplicación "Números" - -haga clic en el botón "Copiar enlace" de la fila 1 del área de desplazamiento 1 del elemento 1 de la IU de la hoja 1 de la ventana "prueba" del proceso de aplicación "Números" --haga clic en el elemento 3 de la IU de la fila 1 del área de desplazamiento 1 del elemento 1 de la IU de hoja 1 de la ventana "prueba" del proceso de aplicación "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:

Ventana desplegable de enlace compartido predeterminado

Cualquier sugerencia es bienvenida. Gracias,

(Usando OSX El Capitán 10.11.5)

Respuestas (1)

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

La respuesta corta es: no pude encontrar ninguna forma de usar applescript 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 funcionará:

-- 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 para 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 de cuello por una serie de motivos.

Primero, cuando crea un archivo de Numbers, 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 hacer una verificación antes de hacer nada para saber si lo que está tratando es una carpeta o un paquete. A continuación, puede pasar a las operaciones de uso compartido.

Ahora, no encontré NINGUNA forma principal de interceptar cuándo exactamente un archivo se convierte en un paquete. Es decir, cuando abre un archivo de Numbers y solicita que se comparta, verá que Numbers le da un mensaje de "preparando el documento para compartir". Encontré que esto es cuando el archivo se transforma en un paquete. Hay una propiedad que uno puede usar para verificar si una ruta dada corresponde a un paquete o un solo archivo: uno podría hacer un bucle while (la carpeta del paquete de item_info es falsa) y luego continuar, pero esta propiedad también se establece como verdadera antes de que Numbers haya terminado su propio trabajo de "preparación del documento para compartir". Así que solo pude adivinar cuándo puedo continuar e ir a la parte del guión para compartir. Pongo un retraso aproximado de 30 segundos cuando un archivo aún no es un paquete,

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

En segundo lugar, debe estar en una buena red, para que todas las operaciones relacionadas con Numbers en iCloud se puedan realizar sin problemas; de lo contrario, iCloud le dará mensajes de error que bloquearán la ejecución del script.

En tercer lugar, debe cuidar los archivos .DS_Store y otros archivos que pueden estar dentro de la carpeta donde coloca sus documentos de Numbers para compartir.

En cuarto lugar, si desea identificar dónde está la carpeta de iCloud con los documentos para compartir, desde AppleScript no la verá como la ve desde el buscador (es decir, en iCloud Drive), pero tendrá que buscar para ello en /yourUser/Library/Mobile Documents/iCloud Drive/yourfolder.

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

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

El script le pedirá que primero identifique la carpeta con los documentos a compartir, luego el archivo de Pages donde desea guardar las rutas de los documentos compartidos, y luego abrirá los documentos a compartir uno por uno, los compartirá, los guardará, copiará su ruta al documento de Pages que seleccionó y finalmente saldrá de Numbers y Pages. Dé suficiente tiempo para que se ejecute el script y no interfiera con él. Tenga en cuenta que cuando abre cada archivo de Numbers, puede modificar el script para que inserte operaciones específicas que desea que se realicen en sus archivos, siempre con la misma técnica (por ejemplo, en mi caso necesito encontrar una celda, encontrar un valor, cópielo en otro lugar y guárdelo. Esta parte del procedimiento no se encuentra en el siguiente script.

Ahora, si alguien encuentra una forma de INVERTIR la operación, dejando de compartir los archivos compartidos, y especialmente, una forma de saber si un archivo YA está compartido o no, para que el script adquiera 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