Поиск строки и удаление всего текстового фрейма с помощью JavaScript для Illustrator

Я могу удалить слой по имени:

    var myDoc = app.activeDocument;
    var myLayers = myDoc.layers;

    var myLayer = myLayers["layer name"];
    myLayer.remove();

или по порядку укладки:

    var myLayer = myLayers[1];
    myLayer.remove();

и я знаю, как найти и заменить текст скриптом, поэтому я пытаюсь найти способ объединить эти два и найти строку, а затем удалить слой, на котором находится строка, поскольку я не могу использовать имя слоя или порядок наложения. Я пытаюсь научиться писать сценарии по ходу дела, поэтому это может оказаться невозможным (тогда кто-то скажет, что это невозможно, было бы полезно), и мой сценарий, вероятно, полон проблем... но это то, что я пытался собрать, и это не работает. не работает, вот и прошу помощи.

    var myDoc = app.activeDocument;
    var search_string = "words I am trying to search for";  
    var text_frames = myDoc.textFrames;  

    if (text_frames.length > 0)  
    {  
        for (var i = 0 ; i < text_frames.length; i++)  
          {  
              var this_text_frame = text_frames[i];   

               if (this_text_frame = search_string.contents)  
                   {  
                        this_text_frame.remove();  
                   }  
          }  
    }  
1) Это не показывает никаких усилий с использованием кода и, похоже, ищет кого-то, кто что-то напишет для вас. 2) Здесь нет четкого вопроса, поэтому я не уверен, какова ваша попытка. Если вам нужна помощь, внесите изменения , задав вопрос, объясняющий, что вам действительно нужно, и покажите нам, что вы пробовали, и мы будем рады помочь.
Если вы хотите принять участие в обсуждении вопросов по коду для справки по приложениям: следует ли закрывать вопросы по коду, если попытки кода не предпринимаются?
Пусть запись покажет, что первоначальный вопрос был закрыт из-за отсутствия усилий, и я проголосовал за вопрос после закрытия, в результате чего вопросы получили в общей сложности три отрицательных голоса. OP взял на себя обязательство отредактировать вопрос, я просмотрел редактирование , нашел, что оно подходит для вопросов и ответов нашего сайта, и снова открыл вопрос. Поскольку вопрос теперь показывает усилия и соответствует нашей модели, я также плюсую 1.

Ответы (2)

Это будет работать до тех пор, пока есть непротиворечивый фрагмент текста для поиска. Может применяться к действию и группироваться.

Обратите внимание, что он зацикливается в обратном порядке. Это обычная стратегия при зацикливании элементов, которые будут удалены из массива. В противном случае сокращение длины массива будет мешать будущим циклам цикла.

Используя метод match, вы можете увидеть, находится ли строка где-либо в пределах содержимого.

Метод match также принимает объект RegExp (регулярное выражение). Это будет полезно, если ваш текст поиска немного изменится, но будет следовать шаблону.

var doc, texts, i, count, find;

find = "MyString"; // Replace with your own string

doc = activeDocument;
texts = doc.textFrames;
count = texts.length;
for (i=count-1; i>0; i--)
{ if (texts[i].contents.match (find) == find)
  { texts[i].remove ();
  }
}

Один из способов — просто найти и заменить, ничем не заменить и запустить этот скрипт, чтобы удалить все пустые текстовые фреймы.

Written By Łukasz Wieczorek - hellowoo.com
you can destribute this freely via creative commons(http://creativecommons.org/licenses/by-sa/3.0/)
 but leave this message in tact, or give credit to original script.

var numberOfEmptyTextBoxes = 0;
var layersWithNoText = new Array();
if ( app.documents.length > 0 ) {
    for ( i = 0; i < app.activeDocument.textFrames.length; i++ ) {
        text = app.activeDocument.textFrames[i].textRange;
        numWords = app.activeDocument.textFrames[i].words.length;
        if (numWords == 0){ 
            layersWithNoText.push(app.activeDocument.textFrames[i]);
            numberOfEmptyTextBoxes++; 
        }
    }
    if(numberOfEmptyTextBoxes > 0){
        alert("You have " + numberOfEmptyTextBoxes + " empty text boxes. They will be deleted.");
    }
    removeTextLayersWithNoContent(layersWithNoText);
}
function removeTextLayersWithNoContent(layersWithNoText) {
    var layersWithNoText = layersWithNoText;
    for (var i = 0; i < layersWithNoText.length; i++) {
        var currentIndex = layersWithNoText[i];
        layersWithNoText[i].remove();
    };
}

Скопируйте и вставьте это и сохраните как .jsx

К сожалению, в Illustrator нет таких надежных методов поиска, как в InDesign.

Проблема в том, что текст, который я хочу удалить, варьируется от файла к файлу, но имеет один раздел, который будет согласованным. Я хотел использовать согласованный раздел, чтобы иметь возможность вызывать все текстовое поле, если это возможно.
@kmrtn Если это меняется, то, вероятно, это невозможно. Что за текст хоть? Можете ли вы обновить свой вопрос с более подробной информацией/скриншотами?