2 votos

Edición de una columna de una tabla basada en otra

Parece algo que debería ser sencillo, y probablemente lo sea, pero mi mente está siendo densa y no me está ayudando. Tengo una tabla con dos columnas. La primera actúa como una lista maestra de títulos, y la segunda actúa como una lista de títulos usados. Simplemente quiero una forma de eliminar todo lo que ha sido utilizado de la lista maestra para que la primera tabla ya no los contenga. ¿Alguien puede ayudarme con un script o una forma sencilla de hacer esto?

He probado scripts cuando tenía esto en una sola tabla:

tell application "Numbers"
    activate
    tell front document
        tell sheet 1
            set masterList to value of cells of column "B"
            set usedList to value of cells of column "C"

            repeat with i from (count of masterList) to 1 by -1
                set masterItem to item i of masterList
                if masterItem is in usedList then
                    delete cell i of column "B"
                end if
            end repeat

        end tell
    end tell
end tell

Así es como está configurado:

enter image description here

1voto

Mockman Puntos 16

Un par de puntos…

  • Necesitas trabajar tanto con las referencias de las celdas como con los valores de las celdas
  • Numbers no te permite borrar una celda
  • Necesitas especificar la tabla en el script, no solo la hoja

Lo que hace este script es recorrer cada valor de la lista usada y recorrer la lista maestra para ver si hay alguna coincidencia. Ambas listas están invertidas para que las entradas más recientes se procesen primero, pero dado que no se pueden borrar celdas, esto podría no producir ningún beneficio.

Cuando encuentra una celda coincidente en la lista maestra, borra el valor y luego pasa a la siguiente entrada en la lista usada — por lo tanto, asume que habrá solo una coincidencia por cada elemento de la lista usada.

Si deseas colocar la lista usada en una segunda tabla, puedes hacerlo incluyendo 'tabla 2' en cualquier referencia a la lista usada. Si las dos están en tablas separadas, entonces podría facilitar ordenar la lista maestra resultante, y así empujar las celdas en blanco hacia abajo por debajo de las que tengan un valor restante.

-- Editar una columna de una tabla basada en otra
tell application "Numbers"
    activate
    tell front document
        tell sheet 1
            tell table 1
                ordenar por columna 2 -- si ya está ordenado, entonces quitar
                set hrc1 to contar filas de encabezado
                set frc1 to contar filas de pie

                -- excluir celdas en blanco en la parte inferior
                set mcc to (contar (celdas de la columna 2 cuyo valor no es valor faltante)) - frc1
                set mbr to rango ("B2:B" & mcc as texto) -- construir rango de datos maestro
                set vmr to valor de celdas de mbr -- lista de valores maestros
            end tell

            tell table 2 -- también debe estar ordenado
                ordenar por columna 2 -- si ya está ordenado, entonces quitar
                set hrc2 to contar filas de encabezado
                set frc2 to contar filas de pie

                -- excluir celdas en blanco en la parte inferior
                set ucc to (contar (celdas de la columna 2 cuyo valor no es valor faltante)) - frc2
                set ubr to rango ("B2:B" & ucc as texto) -- construir rango de datos usados
                set vur to valor de celdas de ubr -- lista de valores usados
            end tell

            set lenVmr to longitud de vmr
            set mc to 0
            repetir con uc de 1 a longitud de vur -- recorrer los valores usados
                repetir -- recorrer los valores maestros
                    set mc to mc + 1
                    if (elemento uc de vur) es igual a (elemento mc de vmr) then -- si los valores coinciden
                        borrar celda mc de mbr -- borrar celda coincidente en la tabla maestra
                        salir repetir
                    end if
                    if mc es igual a lenVmr then salir repetir
                end repeat
                if mc es igual a lenVmr then salir repetir
            end repeat
            -- después de que todas las celdas coincidentes hayan sido borradas
            ordenar tabla 1 por columna 2 de tabla 1
        end tell -- hoja
    end tell -- documento
end tell -- numbers

Actualización: Hice algunos cambios al script y debería ser más rápido con tablas más grandes. En mi antiguo sistema, tomaba alrededor de 110 segundos para procesar una lista maestra de 2000 registros y una lista usada de 500 registros. La mayoría de las computadoras deberían ser más rápidas que la mía, así que tenlo en cuenta.

Sugiero probarlo en una tabla pequeña primero para confirmar que esté haciendo lo que se desea y para tener una idea del rendimiento.

También lo separé en dos tablas, como se indicó en la pregunta.

Ahora lo que hace es, después de ordenar, generar una lista de los valores en cada columna y luego recorrer ambas listas, tomando cada valor usado y encontrando el valor coincidente en la lista maestra. Luego borra la celda correspondiente. Como las listas están ordenadas, debería comenzar cada ciclo donde el anterior terminó, por lo que no debería haber más de un ciclo por cada elemento de la lista maestra. Al trabajar con las listas en lugar de las tablas, significa que solo regresa a la tabla al borrar cada celda coincidente.

Después de borrar todas las celdas coincidentes, volverá a ordenar.

Actualización 2: Agregué un salir repetir al bucle externo también. Aparentemente, solo debería activarse cuando un elemento tardío del lado maestro es una coincidencia, ya que este evento hace que se omita el primer salir. Sin eso, los bucles se repetirán con un elemento que no existe, lo que provocaría el error mencionado.

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