首先我想说我对编程一窍不通;我只是使用 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
}
代码看起来不错。我尝试用计数器
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