Indesign - удалить пустые ячейки из таблицы

Я импортировал XML, который содержит вложенные таблицы, и создал скрипт для удаления всех пустых ячеек, который выглядит следующим образом:

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();
            }
        }
    }

Это работает для обычной таблицы, но в моем XML-документе, содержащем таблицы, он не удаляет пустые ячейки, даже если он попадает в правильный оператор if.

У кого-нибудь есть решения?

Ваш скрипт у меня работает как с собственными таблицами, так и с XML-импортированными. Итак... вы на 100% уверены, что в этих якобы пустых строках вообще нет символов? Нет пробелов? Нет пустых маркеров XML?
XML для пустых ячеек выглядит следующим образом: ="cellSynonym_Title"></Cell>
значит в камере ничего нет
Не в XML, я имел в виду в вашем файле InDesign. Вот где ваш скрипт находит «что-то» — что угодно — что делает ячейку «не пустой».
Это работает для вас, если это таблица внутри таблицы?
Я этого не пробовал; первый раз упоминаешь. Это единственный проблемный случай? По логике вашего скрипта они бы не обрабатывались; нужен еще один цикл.

Ответы (1)

Как упоминалось в комментарии, пустые строки, которые не были найдены сценарием, — это те, которые находятся в таблице, полностью вложенной в большую таблицу.

Логика скрипта их не видит; он только просматривает таблицы «немедленно» внутри текстовых фреймов. Чтобы исправить это, ему нужен отдельный цикл внутри цикла Table, специально проверяющий наличие вложенных таблиц. (Что плохо масштабируется — если внутри этих таблиц могут быть таблицы внутри таблиц, нужен еще один цикл. Лучше написать отдельную функцию , которая может вызывать себя рекурсивно; тогда она работает с таблицами-в-таблицах-в- столы в...)

Дополнительное незначительное улучшение заключается в том, что цикл не по текстовым фреймам , а по целым историям . (Что, помимо скорости, также имеет то преимущество, что таблицы с вытесненным текстом также обрабатываются.)

В целом, для вложенных таблиц должен работать следующий полный скрипт:

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();
    }
}