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
¿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 desourcefile
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?