Indesign 脚本将页码返回为一位数

问题描述 投票:0回答:1

首先我想说我对编程一窍不通;我只是使用 AI 为 InDesign 开发一个脚本,但已经到了无法继续的地步。我正在寻找的是让脚本遍历整个文档,返回一个 Excel 文件,其中包含文章代码所在的位置以及找到它们的页码。问题在于,在生成的 CSV 文件中,页数在少于 10 页的文档中表现正确,枚举正确。但是,从第 10 页开始,第 10 到 19 页只写 1,第 20 到 29 页写 2,依此类推。

var now = new Date();
var hours = ("0" + now.getHours()).slice(-2); // Formato HH
var minutes = ("0" + now.getMinutes()).slice(-2); // Formato MM
var day = ("0" + now.getDate()).slice(-2); // Formato DD
var month = ("0" + (now.getMonth() + 1)).slice(-2); // Formato MM (mes)

// Crear el nombre del archivo CSV con la fecha y hora
var fileName = hours + minutes + "_" + day + month + ".csv";
var file = new File("~/Documentos/" + fileName);

try {
    file.open("w"); // Abrir el archivo en modo escritura
    file.writeln("Código,Página"); // Escribir el encabezado con la nueva columna

    // Comprobación de que hay un documento abierto
    if (app.documents.length > 0) {
        var doc = app.activeDocument;
        var totalCodigos = 0; // Variable para contar los códigos encontrados

        // Función para procesar elementos de texto
        function processTextFrames(textFrames, pageNumber) {
            for (var j = 0; j < textFrames.length; j++) {
                var textFrame = textFrames[j];

                // Recorrer todas las tablas en el marco de texto
                for (var k = 0; k < textFrame.tables.length; k++) {
                    var table = textFrame.tables[k];

                    // Acceder a la primera columna
                    var firstColumnCells = table.columns[0].cells;

                    // Recorrer cada celda en la primera columna
                    for (var l = 0; l < firstColumnCells.length; l++) {
                        var cellContent = firstColumnCells[l].contents;

                        // Buscar secuencias de 8 dígitos
                        var matches = cellContent.match(/\b\d{8}\b/g);

                        if (matches) {
                            totalCodigos += matches.length; // Contar los códigos encontrados

                            for (var m = 0; m < matches.length; m++) {
                                // Escribir el código y el número de página en columnas separadas
                                file.writeln(matches[m] + "," + pageNumber);
                            }
                        }
                    }
                }

                // Buscar códigos en cajas de texto
                var textContent = textFrame.contents;
                var codigoMatches = textContent.match(/Cód:\s*(\d{8})/g);

                if (codigoMatches) {
                    totalCodigos += codigoMatches.length; // Contar los códigos encontrados

                    for (var n = 0; n < codigoMatches.length; n++) {
                        var codigo = codigoMatches[n].match(/\d{8}/)[0]; // Extraer solo el código
                        // Escribir el código y el número de página en columnas separadas
                        file.writeln(codigo + "," + pageNumber);
                    }
                }
            }
        }

        // Función recursiva para procesar grupos
        function processGroups(groups, pageNumber) {
            for (var g = 0; g < groups.length; g++) {
                var group = groups[g];
                processTextFrames(group.textFrames, pageNumber); // Procesar marcos de texto dentro del grupo
                processGroups(group.groups, pageNumber); // Llamar a la función recursiva para grupos anidados
            }
        }

        // Recorrer todas las páginas del documento
        for (var i = 0; i < doc.pages.length; i++) {
            var page = doc.pages[i];

            // Procesar los marcos de texto en la página
            processTextFrames(page.textFrames, page.name);

            // Procesar grupos en la página
            processGroups(page.groups, page.name); // Procesar grupos en la página
        }

        // Mensaje final de confirmación
        if (totalCodigos > 0) {
            alert("Os códigos dos artigos foron exportados correctamente a " + file.fullName + ". Total de códigos: " + totalCodigos);
        } else {
            alert("Non se atoparon códigos de 8 díxitos no documento.");
        }
    } else {
        alert("Non hai documentos abertos en InDesign.");
    }
} catch (e) {
    alert("Ocurriu un erro: " + e.message);
} finally {
    file.close(); // Cerrar el archivo CSV
}

javascript adobe-indesign
1个回答
0
投票

代码看起来不错。我尝试用计数器

page.name
更改变量
i+1
。如果您的文档有简单的页数(1、2、3 等)就足够了。

以防万一,据我所知,您不需要循环遍历每个页面上的所有文本框架。您只需一步即可获取所有匹配项,然后循环遍历匹配项并获取每场匹配项的页码。像这样的东西:

var now = new Date();
var hours = ("0" + now.getHours()).slice(-2);
var minutes = ("0" + now.getMinutes()).slice(-2);
var day = ("0" + now.getDate()).slice(-2);
var month = ("0" + (now.getMonth() + 1)).slice(-2);
var fileName = hours + minutes + "_" + day + month + ".csv";
var file = new File(Folder.temp + "/" + fileName);
file.open("w");
file.writeln("Código,Página");

// get all the matches whitin active document
app.findGrepPreferences = NothingEnum.NOTHING;
app.findGrepPreferences.findWhat = "/Cód:\s*(\d{8})/g"; // your GREP
var matches = app.activeDocument.findGrep();

// loop trough the matches
var contents, pageName;
for (var i=0; i<matches.length; i++) {
    contents = matches[i].contents.slice(-8);                  // last 8 letters
    pageName = matches[i].parentTextFrames[0].parentPage.name; // page number
    // file.writeln(contents + "," + pageName);  // <--- the proper way
    file.writeln(contents + "," + (i+1));        // <--- for the simply numeration 1,2,3...
}

file.close();
file.execute(); // open the CSV file
© www.soinside.com 2019 - 2024. All rights reserved.