0 votos

Cómo abrir un libro de Excel que termina con una cadena específica usando Applescript

Soy nuevo en Applescript y estoy intentando abrir un xlsx archivo que termina como DK.xlsx. He intentado utilizar el siguiente código, pero no funciona. ¿Qué estoy haciendo mal? Por favor, ayuda.

set sourcefilepath to "Macintosh HD:Users:nprabu:Documents:Work:Project:Q1 2018:"

set sourcefile to name of every file of sourcefilepath whose name ends with "DK.xlsx"

tell application "Microsoft Excel"

    open workbook workbook file name sourcefile

end tell

0 votos

¿Por qué no usas la función de búsqueda de Finders?

0 votos

Antes de intentar abrir sourcefile por qué no intentar sacar el nombre de sourcefile para ver lo que se asigna? Un cuadro de diálogo de la ventana sería suficiente y es sólo para fines de depuración.

0 votos

@nprabu ¿Lograste solucionarlo?

3voto

qarma Puntos 71

Debido a que eres nuevo en AppleScript y a que el script que diste tenía una miríada de errores rudimentarios, esta respuesta es bastante larga ya que me pareció apropiado explicar cómo corregir el script y por qué surgieron los errores en primer lugar.

Sin embargo, en beneficio de cualquier lector para el que esto sea TL;DR Aquí están dos tres versiones del script en su forma completa, cada una de las cuales difiere en la forma en que se buscan los archivos y el comando que se envía a Excel para abrirlo/los.

Descargo de responsabilidad: No he podido probar completamente los scripts, ya que no poseo una copia de Microsoft Excel . He formulado estos fragmentos basándome en un versión en línea del diccionario AppleScript . Si encuentras algún error de script, tus comentarios me ayudarán a corregirlo.

① Esta versión utiliza el open workbook como en su original script, que sólo acepta una única referencia de archivo. Por lo tanto, la búsqueda realizada devolverá el archivo único que encuentre primero con la terminación de nombre de archivo apropiada. Nota: Vea a continuación por qué el Excel y por qué he proporcionado una segunda versión del script si este fuera el caso:

    set sourcefilepath to "Macintosh HD:Users:nprabu:Documents:Work:Project:Q1 2018:"

    try
        tell application "Finder" to set sourcefile to ¬
            (the first file in the folder sourcefilepath whose ¬
                name ends with "DK.xlsx") as text
    on error
        return display notification ¬
            "No filenames ending in \"DK.xlsx\"" with title "File Not Found"
    end try

    tell application "Microsoft Excel" to ¬
        open workbook workbook file name sourcefile

② Esta versión utiliza el estándar open que acepta uno o varios file o alias objetos. Utilice esta versión si necesita abrir varios archivos fácilmente o si la versión anterior del script no consigue abrir el archivo:

    set sourcefilepath to "Macintosh HD:Users:nprabu:Documents:Work:Project:Q1 2018:"

    tell application "Finder" to set sourcefiles to ¬
        (every file in the folder sourcefilepath whose ¬
            name ends with "DK.xlsx") as alias list

    if sourcefiles is {} then return display notification ¬
        "No filenames ending in \"DK.xlsx\"" with title "File Not Found"

    tell application "Microsoft Excel" to open the sourcefiles

③ Apéndice: script:

Gracias a @usuario3439894 para probar estos scripts y reportar algunos comportamientos extraños de Microsoft Excel sobre cómo responde a la norma open (véase el hilo de comentarios adjunto a esta respuesta).

Esencialmente, se comporta como se espera si Excel no se está ejecutando, y abrirá varios archivos (en segundo plano). Sin embargo, si Excel ya está abierto, sólo abrirá un archivo de una lista de archivos dada, y el que elige para abrir es aparentemente aleatorio.

Por lo tanto, añado esta tercera versión del script como una aproximación menos elegante a la apertura de múltiples archivos, pero que seguramente hará frente a Excel de la personalidad:

    set sourcefilepath to "Macintosh HD:Users:nprabu:Documents:Work:Project:Q1 2018:"

    tell application "Finder" to set sourcefiles to ¬
        (every file in the folder sourcefilepath whose ¬
            name ends with "DK.xlsx") as alias list

    if sourcefiles is {} then return display notification ¬
        "No filenames ending in \"DK.xlsx\"" with title "File Not Found"

    tell application "Microsoft Excel"
        activate -- Bring Excel into focus

        -- This loops through the list of files and
        -- opens them one at a time
        repeat with sourcefile in sourcefiles
            open the sourcefile
        end repeat
    end tell

Puedes, por supuesto, intentar reemplazar open the sourcefile con open workbook workbook file name (sourcefile as text) en caso de que ese comando funcione en su versión, pero por lo demás estará bien usando open .


Un desglose detallado

Recuperación de su(s) archivo(s)

Los primeros errores de tu script original surgen de esta línea:

set sourcefile to name of every file of sourcefilepath ¬
    whose name ends with "DK.xlsx"

(He dividido el código en dos líneas para facilitar la lectura; esto no afecta al modo en que AppleScript ejecuta los comandos).

▸ En primer lugar, es necesario enviar este comando a una aplicación que pueda manejar objetos de archivo y carpeta. Las dos opciones que tiene son Buscador y Eventos del sistema . Buscador es adecuado y más comúnmente utilizado para los comandos de archivo. Para enviar un comando a Buscador simplemente se añade un tell al principio de la línea:

tell application "Finder" to set sourcefile to ¬
    name of every file of folder sourcefilepath ¬
    whose name ends with "DK.xlsx"

También es necesario especificar que sourcefilepath es un objeto de carpeta, lo que he hecho añadiendo el especificador de objeto folder delante de la variable.

Su pregunta, junto con la elección del nombre de la variable AppleScript, implica que desea abrir un solo archivo. Sin embargo, el comando que acabamos de ver dice Buscador para conseguir every file que siempre devolverá un lista de elementos (aunque puede ser una lista que contenga un solo elemento), en lugar de un solo elemento. Si hay varios archivos cuyos nombres terminan en "DK.xlsx", entonces todos ellos serán devueltos en esta lista. Esto causará problemas a la hora de abrir los archivos con Excel 's open workbook que sólo puede manejar un archivo por declaración de comando.

Si está razonablemente seguro de que sólo hay un nombre de archivo que termina en "DK.xlsx", puede cambiar every a first :

tell application "Finder" to set sourcefile to ¬
    the name of the first file of folder sourcefilepath ¬
    whose name ends with "DK.xlsx"

(He prefijado algunos términos con the para hacerla más legible; AppleScript se las arregla felizmente con o sin the estar presente).

La otra consideración es que open workbook requiere que se especifique la ruta completa del archivo. Sin embargo, al solicitar que Buscador devuelve sólo el name de los archivos, sólo se le darán los nombres de los archivos sin la ruta. Para recuperar la ruta completa, elimine la solicitud de la name y en su lugar recuperar el objeto archivo, que luego puede coaccionar en texto:

tell application "Finder" to set sourcefile to ¬
    (the first file of folder sourcefilepath ¬
    whose name ends with "DK.xlsx") as text

▸ Si resulta que, efectivamente, desea recuperar varios archivos que terminan en el sufijo "DK", entonces lo mejor es forzar el lista de objetos de archivo en un alias list (que es una lista de alias). Esto es para que podamos utilizar el estándar open en lugar de open workbook ya que el primero puede aceptar una lista de múltiples alias de archivos, lo que le permite abrir muchos archivos con un solo comando.

tell application "Finder" to set sourcefile to ¬
    (every file of folder sourcefilepath ¬
    whose name ends with "DK.xlsx") as alias list

Abrir el o los archivos en Excel

No ha mencionado qué versión de Microsoft Excel que está utilizando, que puede resultar ser información pertinente. Este La pregunta del foro de 2009 es de un usuario que dice tener problemas al utilizar el open workbook comando.

PERO... Supongamos por ahora que el comando se trabajar con su versión, y que sólo desea abrir un único archivo. La sintaxis tal y como la tienes es correcta, y el ajuste que mencioné anteriormente para recuperar la ruta completa del archivo evitará el open workbook para evitar que se produzca un error debido a una mala referencia a un archivo. Una nota de estilo: puedes escribir el comando tell y el open workbook en una sola línea, y luego eliminar el end tell línea:

tell application "Microsoft Excel" to open workbook workbook file name sourcefile

Ninguna forma es mejor que la otra, así que es una elección personal.

▸ El post del foro que mencioné anteriormente que informaba de un mal funcionamiento open workbook también citó el mismo problema al utilizar el comando estándar open de mando. Sin embargo, este El post de Stack Overflow proporciona la causa probable, y me tranquiliza que este open funcionará cuando el open workbook puede no hacerlo.

Básicamente, de la misma manera que el Buscador necesita que se especifique explícitamente que un objeto carpeta es un folder , Excel necesita que se especifique explícitamente que el objeto archivo es un file (o alias ):

tell application "Microsoft Excel" to open file sourcefile

▸ El beneficio de esta open es que puede aceptar listas de alias para abrir muchos archivos a la vez. Por lo tanto, si decide mantener la versión del Buscador que recupera varios archivos, asegúrese de coaccionarla a un alias list , que luego puedes usar así:

tell application "Microsoft Excel" to open sourcefile

Tenga en cuenta que el file está ausente cuando se abren varios archivos, porque la variable sourcefile ya es del tipo correcto, es decir alias list .

Comentarios finales

Las versiones finales del script que suministré al principio son ligeramente diferente en la forma en que decidí aplicar los cambios que he detallado aquí. También me pareció prudente incluir un manejo de errores básico en caso de que no se pudiera encontrar un archivo, lo que arrojaría un error y podría llevar a preguntarse si el código era defectuoso.

Si ves que el archivo se abre con éxito en Excel pero que permanezca en segundo plano oculto detrás de otras aplicaciones, puedes añadir este comando al script para llevar Excel en el primer plano y hacer que sea la aplicación enfocada:

tell application "Microsoft Excel" to activate

o-combinándolo con el existente Excel comandos:

tell application "Microsoft Excel"
    activate
    open file sourcefile
end tell

Si necesitas que te aclare algo de esto o si tienes alguna otra pregunta menor relacionada con esto, deja un comentario y te responderé. Si esto te resulta útil o si resuelve tu problema, considera seleccionar esta respuesta o cualquier otra que resulte más útil para que otros visitantes del foro sepan que este tema ha sido tratado y puedan beneficiarse de él si tienen un problema similar.

0 votos

Esto puede ser un problema de la versión de Excel, sin embargo con cuando Excel ya está abierto, sólo abre uno de los archivos en el list y no necesariamente el primer archivo. Con Excel aún abierto, si cierras el único archivo de la lista que abrió y ejecutas de nuevo el script se abre un archivo diferente pero de nuevo sólo un archivo de la lista, y así sucesivamente. Lo cual resulta un comportamiento realmente extraño. Usando un repeat bucle en el list es una solución.

1 votos

@user3439894 Gracias por probarlo por mí. Lo he probado con otras aplicaciones, como TextEdit y Keynote (ambas aplicaciones de Apple, eso sí), y ha hecho lo que esperaba y quería que hiciera. Es una pena que Excel no es conforme. Parece que voy a tienen para utilizar un repeat bucle. Por cierto, ¿cómo se comporta cuando Excel ¿No está ya abierto? Es Excel una de esas aplicaciones que insiste en que activate ¿primero?

0 votos

Con Excel cerrado y probando con una lista de 3 archivos, abre los tres, y Excel está en segundo plano a menos que activate se utiliza.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X