Indesign: elimina las celdas vacías de la tabla

He importado XML que contiene tablas anidadas y he creado un script para eliminar todas las celdas vacías, que es como:

var myDocument = app.activeDocument;
for(var i=myDocument.textFrames.length-1; i>=0; i--){
    for(var j=myDocument.textFrames[i].tables.length-1; j>=0; j--){
        for(var k=myDocument.textFrames[i].tables[j].rows.length-1; k>=0; k--){
            myContents = 0;
            for(var l=myDocument.textFrames[i].tables[j].rows[k].cells.length-1; l>=0; l--){
                if (myDocument.textFrames[i].tables[j].rows[k].cells[l].contents != "") myContents++;  
                }
                    if (myContents == 0) myDocument.textFrames[i].tables[j].rows[k].remove();
            }
        }
    }

Esto funciona para una tabla ordinaria, pero en mi documento XML que contiene las tablas, no elimina las celdas vacías, aunque presiona la instrucción if correcta.

¿Alguien tiene alguna solución?

Su secuencia de comandos funciona para mí, en tablas creadas de forma nativa y en tablas importadas por XML. Entonces... ¿estás 100% seguro de que no hay ningún carácter en esas filas supuestamente vacías? ¿No hay espacios? ¿No hay marcadores XML vacíos?
El XML para las celdas vacías es el siguiente: <Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="200" aid:pstyle="paraSynonym_Title" aid5:cellstyle ="cellSynonym_Title"></Celda>
entonces no hay nada en la celda
No en el XML, quise decir en su archivo de InDesign. Ahí es donde su secuencia de comandos encuentra "algo", cualquier cosa, que hace que una celda "no esté vacía".
¿Te funciona si es una mesa dentro de una mesa?
No intenté eso; primera vez que lo mencionas. ¿Es ese el único caso problemático? De acuerdo con la lógica de su script, no se procesarían; necesita otro bucle.

Respuestas (1)

Como se menciona en un comentario, las filas vacías que no encuentra el script son aquellas que están en una tabla anidada en su totalidad dentro de una tabla más grande.

La lógica del script no los ve; solo mira las tablas 'inmediatamente' dentro de los marcos de texto. Para arreglar esto, necesita un ciclo separado dentro del ciclo Table que verifica específicamente las tablas anidadas. (Lo que no se escala bien: si puede haber tablas dentro de estas tablas dentro de tablas, necesita otro ciclo. Es mejor escribir una función separada , que pueda llamarse a sí misma recursivamente; entonces funciona con tablas-en-tablas-en- mesas-en...)

Una mejora menor adicional es que no se repiten los marcos de texto , sino las historias completas . (Lo cual, además de la velocidad, también tiene la ventaja de que las tablas con texto desbordado también se procesan).

Con todo, el siguiente script completo debería funcionar para tablas anidadas:

var myDocument = app.activeDocument;
for(var i=0; i<myDocument.stories.length; i++)
{
    for(var j=0; j<myDocument.stories[i].tables.length; j++)
    {
        processTable(myDocument.stories[i].tables[j]);
    }
}

function processTable (any_table)
{
    var r,c,t, isEmpty;

    for (r=any_table.rows.length-1; r>=0; r--)
    {
        isEmpty = true;
        for (c=0; c< any_table.rows[r].cells.length; c++)
        {
            for (t=0; t<any_table.rows[r].cells[c].tables.length; t++)
                processTable (any_table.rows[r].cells[c].tables[t]);

            if (any_table.rows[r].cells[c].contents != '')
                isEmpty = false;
        }
        if (isEmpty)
            any_table.rows[r].remove();
    }
}