[ID CC-CC2022] Перебор информации в выбранной группе

  • Автор темы Автор темы ReallyCool
  • Дата начала Дата начала
Но лично мне казалось что вроде как получалось к экселовскому отладчику чужую модель прицепить
Если нет, то вы в большой беде и лучше сразу залазьте в индизайновский отладчик. Иначе вы как в черном ящике ночью шарить будете долго, мучительно и безрезультатно
 
К сожалению, у меня сейчас ни на одном компьютере ни эксела, ни офиса нет вообще :(
Кроме того, меня начинают терзать смутные сомнения что я чтото перепутал. Если Лев говорит что нельзя, то я ему верю
 
У меня была недавно задача сделать что-то подобное.
Есть уже готовый скрипт, но подсказать по нему что и где не смогу, т.к. мне его писали.
В вашем случае надо к каждой таблице линковать xls-файл, или просто апдейтить данные скриптом, без перелинковки.
Данные-то хоть в каком виде сделаны? Одна таблица сплошняком или каждая на отдельном листе или вообще всё кое-как?
Нужно же обращаться к определённым строкам xls-файла, а при вашем количестве страниц вручную диапазоны выбирать не будешь.
 
я точно помню что оно подгружалось в c# - библиотеку надо было подгрузить, .tlb что-ли. а она генерится при подключении к программе из c# по COM (?).
 
Первая буква всегда маленькая
VBA - регистронезависимый язык
В IDE жмете Tools/References (Инструменты/Ссылки?) ставите галку на Adobe Indesign CC Type Library
после чего можете писать чего-то типа
Код:
Sub FindObjectsInGroups()
  Dim indd As New InDesign.Application
  Dim g As InDesign.Group
  For Each g In indd.ActiveDocument.Groups
    For Each o In g.PageItems
      Debug.Print o.StrokeColor
    Next o
  Next g
End Sub
Можно добавить определения типа Dim o as PageItem, тогда при наборе o. IDE само подставит после точки возможные методы для o. Но перед запуском эту строчку надо будет закомментировать, потому что на самом деле у o будет тип "object" (хз почему так). Также Вы можете ставить курсор на интересующие Вас методы и нажимать Shift+F2, чтобы увидеть объектную модель.
по поводу .StrokeColor - ошибку дает VBA
В моём тесте группы из прямоугольников, которые имеют данный аттрибут, в Ваших реальных данных могут быть объекты не имеющие свойства "обводка"
 
Последнее редактирование:
  • Спасибо
Реакции: _MBK_ и ReallyCool
Есть уже готовый скрипт, но подсказать по нему что и где не смогу, т.к. мне его писали.

дело в том, что мне именно и нужно понять, как перебрать и найти нужные строки в группе в файде inDesign.
а подтащить из экселя данные, это для меня простая задача. если Вы сможете прислать мне Ваш код, чтоб понять, как у Вас это работает - был бы Вам очень признателен.
 
ставите галку на Adobe Indesign CC Type Library
ну эта галка естественно стоит, иначе бы вообще ничего не работало без подключенной библиотеки.
спасибо за Ваши доп. советы, доберусь до домашнего компа, еще потестирую
 
дело в том, что мне именно и нужно понять, как перебрать и найти нужные строки в группе в файде inDesign.
а подтащить из экселя данные, это для меня простая задача. если Вы сможете прислать мне Ваш код, чтоб понять, как у Вас это работает - был бы Вам очень признателен.
Код:
/*
 * @Author: Vitaly Batushev
 * @Date: 2020-01-11 18:44:44
 * @Last Modified by: Vitaly Batushev
 * @Last Modified time: 2020-01-12 12:10:09
 */

var XlsxUpdate = (function(){
    var doc, progressbar;

    /**
     * Основная функция
     */
    var main = function() {
        if (!app.documents.length) exit();
        doc = app.activeDocument;
        app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
        app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;

        if (doc.spreads.length < 2) {
            alert('В разделе менее двух разворотов!');
            exit();
        }

        progressbar = new ProgressBar("Обновление данных...");
        progressbar.show();
        var updated = 0;
        for (var i = 1, l = doc.spreads.length; i < l; i++) {
            updated += processSpread(doc.spreads.item(i), i);
        }
        progressbar.close();
        alert("Обновлено " + updated+ " записей");
    }

    /**
     * Обработка разворота
     * @param {Spread} spread Разворот публикации
     * @param {int} idx Порядковый номер разворота
     */
    function processSpread(spread, idx) {
        var updated = 0;
        var xlsPath = doc.filePath.absoluteURI + "/links";
        progressbar.reset('Обновление данных на развороте ' + idx, spread.textFrames.length);
        for (var i = 0, l = spread.textFrames.length; i < l; i++) {
            progressbar.increase();
            var textFrame = spread.textFrames.item(i);
            if (textFrame.parentStory.itemLink !== null && textFrame.parentStory.itemLink.isValid) {
                var link = textFrame.parentStory.itemLink;
                var pFile = File(textFrame.parentStory.itemLink.filePath);
                if (getExtension(pFile.name) == "xlsx") {
                    var rFile = File([xlsPath, idx + ".xlsx"].join("/"));
                    if (File(rFile).exists) {
                        textFrame.parentStory.itemLink.relink(rFile);
                        textFrame.parentStory.itemLink.update();
                        updated++;
                    }
                }
                textFrame.clearObjectStyleOverrides();
            }
        }
        return updated;
    }

    /**
     * Получение расширения файла в нижнем регистре
     * @param {string} name Имя файла
     */
    function getExtension(name) {
        var parts = name.split(".");
        return parts[parts.length - 1].toLowerCase();
    }


    var ProgressBar = function(title) {
        var w = new Window('palette', title, { x: 0, y: 0, width: 440, height: 60 }, { closeButton: false }),
            pb = w.add('progressbar', { x: 20, y: 32, width: 400, height: 12 }),
            st = w.add('statictext', { x: 20, y: 12, width: 400, height: 20 });
        st.justify = 'left';
        w.center();

        this.reset = function(msg, maxValue) {
            st.text = msg;
            pb.value = 0;
            pb.maxvalue = maxValue;
            // w.show();
        };

        this.show = function() {
            w.show();
        };

        this.increase = function() {
            ++pb.value;
        };

        this.hide = function() {
            w.hide();
        };

        this.close = function() {
            w.close();
        };
    };

    return {
        run: main
    }
})();
app.doScript("XlsxUpdate.run();", ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT, "XlsxUpdate");
 
  • Спасибо
Реакции: ReallyCool
Мне кажется, может я не прав, что основная проблема, в вашем случае, обратиться к определённому месту в xls-файле. НАверняка исходные данные сделаны кое-как.
 
И все равно мне странно что ошибку выдает на strokeColor
Попробуйте просто Debug.Print TypeName(o)
 
например, у группы его нет
 
ну эта галка естественно стоит, иначе бы вообще ничего не работало без подключенной библиотеки.
И без галки ваш вариант работает, тк InDesign в нем подключается не по референсу, а через CreateObject
дело в том, что мне именно и нужно понять, как перебрать и найти нужные строки в группе в файде inDesign.
а подтащить из экселя данные, это для меня простая задача. если Вы сможете прислать мне Ваш код, чтоб понять, как у Вас это работает - был бы Вам очень признателен.
Дык вот он:
Код:
Sub qqq()
  Dim indd As New InDesign.Application 'объявляем новый объект ИнДизайна
  Dim g As InDesign.Group 'объявляем объект типа группа, чтобы нам IDE после точки его свойства подсказывал, а так объялять необязательно, разве что для ускорения работы, т.к. в этом случае интерпретатором будет сначала присвоен тип Variant, а уже затем Group
  'Dim o As InDesign.PageItem 'закомментировали для работы, раскоменнтируем во время набора кода, чтобы подсказки выдавались
  For Each g In indd.ActiveWindow.ActivePage.Groups 'перебираем все группы на странице
  'For Each g In indd.ActiveDocument.Groups 'перебираем все группы в документе
    For Each o In g.PageItems 'перебираем все объекты в группах
      Debug.Print o.ParentPage 'печатаем в окно на какой странице объект (уж это свойство, надеюсь, у него есть
    Next o
  Next g
End Sub
 
Последнее редактирование:
  • Спасибо
Реакции: Ksenia
дорогие друзья, спасибо за Вашу помощь, удалось мне найти на странице моей тестовой,
путем перебора (Лев, спасибо, удалось ))) , где в группе лежит текст - это оказался TextFrame :
textfameonly.jpg


но теперь вопрос - как мне получить текст из этого фрейма, его изменить и вернуть обратно?
сам файлик с этим фреймом тут:

с нетерпением жду Ваших добрых советов.
 

Вложения

  • textfameonly.jpg
    textfameonly.jpg
    32.2 КБ · Просм.: 231
Я ж вам ссылку на спецификацию кидал
У TextFrame есть свойство contents там текстовое содержимое
 
  • Спасибо
Реакции: Skvoznyak
да, я это свойство сразу и попытался получить - дает непечатное значение, т.к. этот фрейм опять не текстовый, а видимо массив отдельных фреймов. как их теперь перебрать? т.к. свойства .Count нету(((
 
А вы не гадайте а посмотрите TypeName
 
а в примере таблица, а не textFrame