批量处理 InDesign 文件、将文件名和表中的数据编译到电子表格中的脚本

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

我们的规格表是用 InDesign 制作的,其中一个表格中有一组特定的数据点,我们希望提取这些数据点并将其放入电子表格中。不过,我们有数千个这样的文件,所以我想看看是否有办法编写自动化流程的脚本。

我之前曾使用脚本完成其他任务,甚至破解了一些脚本来创建一些小解决方案;但这远远超出了我的能力范围,我只是想看看它是否可能。

规格表有两页。第 2 页上有一张表格,上面有规格。它是一个 2 列表,两列中的部分标题合并,数据单元格的数据标题位于左侧,数据本身位于右侧。我们需要的数据是表的最后 4 行。标题单元格是“SHIPPING DATA”,然后四行是重量、高度、宽度和深度。该数据始终是每个规格表中表格的最后四行。

所以,我想知道脚本是否可以:

  • 处理文件夹中的一批文件或任何打开的文件;;
  • 对于每个文件,它可以获取文件名并将其放入电子表格中,第 1 行 A 列;;
  • 然后找到“SHIPPING DATA”,选择其下方的 4 个数据单元格,并将它们粘贴到电子表格第 1 行 B-E 列中/可能需要一一抓取这四个单元格中的数据;;
  • 然后移至下一个文件,将相同的信息放入第 2 行

正如我所说,我什至不知道这是否可行,所以我还没有尝试过任何东西。如果有人对此有任何想法或想法,我会洗耳恭听。谢谢!

编辑 01:添加屏幕截图,显示文件名和我在问题中引用的表格部分。

compiler-construction batch-processing adobe-indesign
2个回答
0
投票

其实InDesign提供了数据合并功能

https://helpx.adobe.com/uk/indesign/using/data-merge.html

无论如何,你的想法可以用脚本来实现


0
投票

可能是这样的:

// dialog to select a folder if there are no open documents
if (app.documents.length == 0) {
    var from_folder = true;
    var folder = Folder.selectDialog('Select folder with INDD files...');
    var files = folder.getFiles('*.indd');
}

// if there are open documents process them
else {
    var from_folder = false;
    var files = app.documents;
}

// get the data from all tables each of the documents
var all_data = [];

for (var i=0; i<files.length; i++) {
    if (from_folder) var doc = app.open(files[i]);
    else var doc = files[i];

    var tables = get_all_tables_from_doc(doc);
    var data;
    if (tables) data = get_data_from_all_tables(tables);
    if (data) while (data.length) all_data.push(data.shift());

    if (from_folder) doc.close();
}

// if there is the data put it on the page of a new document
if (all_data.length > 0) {
    var doc = app.documents.add();
    var frame = doc.pages[0].textFrames.add();
    frame.geometricBounds = doc.pages[0].bounds;
    frame.contents = all_data.join('\r');
    frame.parentStory.texts[0].convertToTable();
} else {
    alert('No data was found');
}


// functions ------------------------------------------------------------------

function get_data_from_all_tables(tables) {
    var data = [];
    for (var i=0; i<tables.length; i++) {
        var table = tables[i];
        var data_row = get_data_from_table(table);
        if (data_row) data.push(data_row);
    }
    if (data.length > 0) return data;
}

function get_data_from_table(table) {
    var cell = get_cell_with_word(table, 'SHIPPING DATA');
    if (cell) {
        var index = cell.parentRow.index;
        var cell_1 = table.rows[index+1].cells[1].contents;
        var cell_2 = table.rows[index+2].cells[1].contents;
        var cell_3 = table.rows[index+3].cells[1].contents;
        var cell_4 = table.rows[index+4].cells[1].contents;
        return [doc.name, cell_1, cell_2, cell_3, cell_4].join('\t');
    }
}

function get_cell_with_word(table, word) {
    var cells = table.cells;
    for (var i=0; i<cells.length; i++) {
        var cell = cells[i];
        if (cell.contents.toUpperCase() == word) return cell;
    }
}

function get_all_tables_from_doc(doc) {
    var stories = doc.stories;
    var all_tables = [];
    for (var i=0; i<stories.length; i++) {
        var tables = stories[i].tables;
        for (var j=0; j<tables.length; j++) {
            all_tables.push(tables[j]);
        }
    }
    if (all_tables.length > 0) return all_tables;
}
© www.soinside.com 2019 - 2024. All rights reserved.