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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Но лично мне казалось что вроде как получалось к экселовскому отладчику чужую модель прицепить
Если нет, то вы в большой беде и лучше сразу залазьте в индизайновский отладчик. Иначе вы как в черном ящике ночью шарить будете долго, мучительно и безрезультатно
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
К сожалению, у меня сейчас ни на одном компьютере ни эксела, ни офиса нет вообще :(
Кроме того, меня начинают терзать смутные сомнения что я чтото перепутал. Если Лев говорит что нельзя, то я ему верю
 

xenOnn

15 лет на форуме
Сообщения
287
Реакции
45
У меня была недавно задача сделать что-то подобное.
Есть уже готовый скрипт, но подсказать по нему что и где не смогу, т.к. мне его писали.
В вашем случае надо к каждой таблице линковать xls-файл, или просто апдейтить данные скриптом, без перелинковки.
Данные-то хоть в каком виде сделаны? Одна таблица сплошняком или каждая на отдельном листе или вообще всё кое-как?
Нужно же обращаться к определённым строкам xls-файла, а при вашем количестве страниц вручную диапазоны выбирать не будешь.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
я точно помню что оно подгружалось в c# - библиотеку надо было подгрузить, .tlb что-ли. а она генерится при подключении к программе из c# по COM (?).
 

lev

Модератор
20 лет на форуме
Сообщения
2 147
Реакции
2 072
Первая буква всегда маленькая
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

ReallyCool

Участник
Топикстартер
Сообщения
55
Реакции
1
Есть уже готовый скрипт, но подсказать по нему что и где не смогу, т.к. мне его писали.

дело в том, что мне именно и нужно понять, как перебрать и найти нужные строки в группе в файде inDesign.
а подтащить из экселя данные, это для меня простая задача. если Вы сможете прислать мне Ваш код, чтоб понять, как у Вас это работает - был бы Вам очень признателен.
 

ReallyCool

Участник
Топикстартер
Сообщения
55
Реакции
1
ставите галку на Adobe Indesign CC Type Library
ну эта галка естественно стоит, иначе бы вообще ничего не работало без подключенной библиотеки.
спасибо за Ваши доп. советы, доберусь до домашнего компа, еще потестирую
 

xenOnn

15 лет на форуме
Сообщения
287
Реакции
45
дело в том, что мне именно и нужно понять, как перебрать и найти нужные строки в группе в файде 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

xenOnn

15 лет на форуме
Сообщения
287
Реакции
45
Мне кажется, может я не прав, что основная проблема, в вашем случае, обратиться к определённому месту в xls-файле. НАверняка исходные данные сделаны кое-как.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
И все равно мне странно что ошибку выдает на strokeColor
Попробуйте просто Debug.Print TypeName(o)
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
например, у группы его нет
 

lev

Модератор
20 лет на форуме
Сообщения
2 147
Реакции
2 072
ну эта галка естественно стоит, иначе бы вообще ничего не работало без подключенной библиотеки.
И без галки ваш вариант работает, тк 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

ReallyCool

Участник
Топикстартер
Сообщения
55
Реакции
1
дорогие друзья, спасибо за Вашу помощь, удалось мне найти на странице моей тестовой,
путем перебора (Лев, спасибо, удалось ))) , где в группе лежит текст - это оказался TextFrame :
textfameonly.jpg


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

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

Вложения

  • textfameonly.jpg
    textfameonly.jpg
    32.2 КБ · Просм.: 207

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Я ж вам ссылку на спецификацию кидал
У TextFrame есть свойство contents там текстовое содержимое
 
  • Спасибо
Реакции: Skvoznyak

ReallyCool

Участник
Топикстартер
Сообщения
55
Реакции
1
да, я это свойство сразу и попытался получить - дает непечатное значение, т.к. этот фрейм опять не текстовый, а видимо массив отдельных фреймов. как их теперь перебрать? т.к. свойства .Count нету(((
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
А вы не гадайте а посмотрите TypeName
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
а в примере таблица, а не textFrame