AppleScript: ¿cómo establecer variables para un número indeterminado de elementos de la lista?

Soy nuevo en AppleScript. Estoy tratando de crear un script que tome los elementos de la lista de una acción de flujo de trabajo de Automator anterior y los convierta en variables.

Habrá un número indeterminado de elementos de la lista (bueno, entre 1 y 40 en cada ejecución).

Esto funciona para un número determinado de elementos de la lista, digamos tres.

on run {input, parameters}

    set value of variable "F1" of front workflow to item 1 of input
    set value of variable "F2" of front workflow to item 2 of input
    set value of variable "F3" of front workflow to item 3 of input

    return input
end run

Pero si solo hay dos elementos de lista generados a partir de la acción de flujo de trabajo anterior, nos encontramos con problemas.

Entonces, actualicé el script usando ifpara tratar de solucionar este problema.

on run {input, parameters}

    if item 1 exists then
        set value of variable "F1" of front workflow to item 1 of input
    end if
    if item 2 exists then
        set value of variable "F2" of front workflow to item 2 of input
    end if
    if item 3 exists then
        set value of variable "F3" of front workflow to item 3 of input
    end if

    return input
end run

Cuando ejecuto esto, solo F1se completa la primera variable. Los demás se dejan en blanco/no se completan. No estoy seguro de cómo seguir adelante con esto?

¿Alguien puede decirme si estoy en el camino correcto o si hay una mejor manera de hacerlo?

Respuestas (1)

La declaración de variables debe hacerse antes del tiempo de ejecución . El siguiente código AppleScript de ejemplo , ejecutado en el Editor de secuencias de comandos , es para demostrar una forma de hacerlo:

set input to {"one", "two", "three"}

set F1 to missing value
set F2 to missing value
set F3 to missing value
set F4 to missing value

try
    if item 1 of input is not missing value then
        set F1 to item 1 of input
        log "F1 is: " & F1
    end if
    if item 2 of input is not missing value then
        set F2 to item 2 of input
        log "F2 is: " & F2
    end if
    if item 3 of input is not missing value then
        set F3 to item 3 of input
        log "F3 is: " & F3
    end if
    if item 4 of input is not missing value then
        set F4 to item 4 of input
        log "F4 is: " & F4
    end if
end try

log "F4 is still: " & F4

El resultado del registro es:

(*F1 is: one*)
(*F2 is: two*)
(*F3 is: three*)
(*F4 is still: missing value*)

Obviamente, el log comando se está utilizando para mostrar que a las variables se les asignó un nuevo valor , excepto el último porque input listsolo tenía tres elementos . Deberá crear esto para la cantidad de variables que se necesiten, ya que no puede agregarlas después de que haya comenzado la ejecución del código . Mencionaste "entre 1 y 40 cada ejecución" en tu OP.

Eliminaría los log comandos para el código real dentro de cada uno de los bloques if de instrucciones , además de las asignaciones de variables , según corresponda en ese punto de la ejecución del código , si corresponde.

Tenga en cuenta que al envolver el código del grupo de bloques if de instrucciones , que establece el nuevo valor de las variables en función del valor de list item, en una try instrucción cuando hay menos itemsen input list, no genera un error que detenga la ejecución de el código , y continúa con el código restante .

El valor de la variable se asigna inicialmente missing value, sin embargo, ""también se pueden usar (comillas dobles) en su lugar. Me gusta usarlo missing valuea veces, ya que puede ser más fácil leer el código .

NOTA: El código AppleScript de ejemplo que se muestra arriba es solo eso, y está codificado tal como está para demostrar una forma de asignar a las variables un valor de una lista . Que es lo que está en el contexto de, por ejemplo, una acción Ejecutar AppleScript en un flujo de trabajo de Automator . Según cuál sea la fuente de la información y qué se hará con ella, es posible que deba agregar, por ejemplo , u otra coerción según corresponda, en este caso después de , por ejemplo . inputon run {input, parameters} inputas stringas textitem n of inputset F1 to item 1 of input as string