Variable de exportación de AppleScript a Numbers / Excel / SQL

0

Me gustaría que AppleScript agregue una nueva fila en un número o en una hoja de Excel (o en una base de datos SQL)

Tengo mis datos guardados en una lista que puedo recuperar con

set myDateFromPlist to value of property list item "myDate" of p_list

la idea es crear una base de datos o una hoja con todas las variables en la misma fila (y agregue una nueva fila con más datos cuando vuelva a ejecutar el script

por ejemplo

fecha | var1 | var2 | var3 fecha | var1 | var2 | var3

Lo que intenté hasta ahora

tell application "Numbers"
    activate
    try
        if not (exists document 1) then error number 1000
        tell document 1
            try
                tell active sheet
                    set the selectedTable to ¬
                        (the first table whose class of selection range is range)
                    tell the selectedTable to add row below last row
                    tell the selectedTable to set value of first cell to myDateFromPlist
                    tell the selectedTable to set value of second cell to myTimeFromPlist
                    tell the selectedTable to set value of third cell to theIDFromPlist

                end tell
            on error
                error number 1001
            end try
            tell selectedTable
                -- editing statements go here
            end tell
        end tell

los problemas con eso:

1: los números deben estar abiertos (pero supongo que eso podría ser un requisito de todos modos)

2: los datos siempre se agregan a la primera fila

    
pregunta Kevin 10.03.2018 - 13:51

2 respuestas

1

Asignación de filas para la entrada de datos

Para obtener datos agregados a una nueva fila, estaba en el camino correcto con su primer script donde escribió tell the selectedTable to add row below last row . Simplemente tuvo que hacer referencia a esta fila recién creada cuando configuró los valores de cell 1 , cell 2 y cell 3 , a los que, de lo contrario, se hacía referencia como pertenecientes a selectedTable en lugar de un row específico en el selectedTable :

    set dataToAdd to {¬
        myDateFromPlist, ¬
        myTimeFromPlist, ¬
        theIDFromPlist}

    tell application "Numbers" to tell ¬
        the front document to tell ¬
        the active sheet to tell ¬
        table 1

        set R to add row below last row

        tell R to ¬
            repeat with i from 1 to count dataToAdd

                set value of cell i to ¬
                    item i in dataToAdd

            end repeat
    end tell

Decidí ajustar la configuración de los valores de celda dentro de un bucle repeat porque, en teoría, podría tener 50 celdas para asignar valores a, y esto ahorra un poco de escritura, además de hacer que el código sea un poco más fácil leer.

Sin embargo, tenga en cuenta que cell i dentro del bucle repeat es, en sí mismo, parte de una declaración tell R , donde R es la referencia al nuevo row que se acaba de crear. Esto le dice al script que es cell i de este nuevo row a los que se les deben asignar los valores almacenados en dataToAdd , y no simplemente a cell i de table 1 (supongo que su sheet solo tiene una tabla , en cuyo caso no hay necesidad de preocuparse por el largo first table whose class of selection range is range . Si, sin embargo, he asumido erróneamente, entonces es mejor dar nombres a sus tablas, a las que luego puede hacer referencia específicamente desde su script, en lugar de de una esperanza muy tenue de que la tabla seleccionada siempre va a ser la tabla correcta).

Algunos puntos sobre el contenido de tu pregunta y el fragmento de código

En este momento, esta es la mayor ayuda que puedo dar.

Si puedo recomendarte, al publicar una pregunta, si bien es bueno que hayas publicado tu fragmento de código, es mucho más útil que a) publique un fragmento de código que compile (el tuyo no lo hace; < em> Script Editor informa de un final inesperado de archivo al intentar compilarlo, porque su fragmento de código está incompleto); b) incluya suficiente código fuera del conjunto mayor para que pueda ejecutarse en el sistema de otra persona, lo que significa que las variables y tales deben definirse dentro del fragmento de código; actualmente, no tengo idea cuáles son o contienen las variables myDateFromPlist , myTimeFromPlist y theIDFromPlist , por lo que no podemos, por ejemplo, ayudarlo con respecto a por qué aumentó el uso de RAM.

Sospecho que hay un montón de código que precede a este bloque Números , en el que has accedido a tu archivo plist para recuperar sus datos. Puede ser algo en la forma en que has hecho esto que te consuma la memoria.

Como crítica final, si bien el manejo de errores es una buena idea, lo omitiría hasta que se finalice la secuencia de comandos, ya que sus bloques de trampas actuales incluyen demasiadas líneas de código donde hay errores diferentes podría ser capturado: por ejemplo, si recibe un código de error de 1001, podría ser porque no hay active sheet ; o no hay selection range ; o que algo salió mal al asignar valores a cell , que podría ser cell 1 , cell 2 o cell 3 , pero puede haber sido el resultado de un problema con row 2 o una de las variables. Además, tienes dos bloques try anidados uno dentro del otro, lo que es bastante arrogante.

Si quieres más ayuda ...

Si está satisfecho con la solución que esta respuesta brinda a su problema de asignación de filas e inserción de datos, entonces estoy feliz de que fue una solución fácil. Si tiene alguna otra consulta al respecto, deje un comentario y le responderé. Si desea proporcionar más información sobre su secuencia de comandos, variables y lo que no, podemos probar y averiguar de dónde proviene este consumo de memoria. Como dijo en su comentario "con este método , aunque mi RAM salta por la ventana", sería útil saber cuál fue la diferencia entre su primer método y el que generó el consumo de memoria. , lo que puede, por supuesto, requerir que publiques dos scripts.

Lo que puede hacer a los efectos de este es usar una bandeja de pegar en línea. Pastery no requiere nombres de usuario ni contraseñas, y tiene resaltado de sintaxis de AppleScript, pero es uno entre muchos. Paste Bin no requiere ningún tipo de inicio de sesión. Es útil para usar en los sitios web de Stack Exchange cuando desee o necesite proporcionar código adicional que se solicite específicamente, pero en realidad no es necesario para el enfoque principal de la pregunta en sí, cuando ya se proporcionó un bloque de código y proporcionar más podría correr el riesgo de ahogar la Pregunta en un mar de gris.

    
respondido por el CJK 12.03.2018 - 12:41
0

Probablemente no sea la mejor manera pero parece funcionar

    tell application "Numbers"
        activate
        try
            if not (exists document 1) then error number 1000
            tell document 1
                try
                    tell active sheet
                        set the selectedTable to ¬
                            (the first table whose class of selection range is range)
tell the selectedTable to set value of cell 1 of row 2 to myDateFromPlist

                    tell the selectedTable to set value of cell 2 of row 2 to myTimeFromPlist

                    tell the selectedTable to set value of cell 3 of row 2 to theIDFromPlist

                    end tell
                on error
                    error number 1001
                end try
                tell selectedTable
                    -- editing statements go here
                end tell
            end tell
    
respondido por el Kevin 11.03.2018 - 11:03

Lea otras preguntas en las etiquetas