You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为现有InDesign JavaScript脚本添加单元格取消合并功能

解决InDesign脚本处理合并单元格表格报错的问题

我有一个可正常运行的JavaScript脚本,能够遍历文件夹中的INDD文件,找到包含特定关键词“CHARACTERISTICS”的表格并提取指定单元格文本。但在处理含合并单元格的文档时,脚本会出现报错。需修改脚本,使其在找到目标表格后对所有单元格执行Unmerge操作(因脚本运行在副本文件上,无需重新合并)。我找到一段仅适用于已打开单个文件的代码片段:

app.activeDocument.stories.everyItem().tables.everyItem().cells.everyItem().unmerge();

但不知如何将其整合到现有提取脚本中,现有提取脚本代码如下:

// 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 a folder with INDD files...');
    var files = folder.getFiles('*.indd');
    if (files.length == 0) {
        alert('No INDD files was found in the folder')
        exit();
    }
}

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

// get the data from all tables in 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 data = get_data_from_doc(doc);
    if (data) while (data.length) all_data.push(data.shift());
    if (from_folder) doc.close();
}

// if there is 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_doc(doc) {
    var tables = get_all_tables_from_doc(doc);
    if (!tables || tables.length == 0) return;
    var data = get_data_from_all_tables(tables, doc);
    if (data && data.length > 0) return data;
}

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;
}

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

function get_data_from_table(table, doc) {
    var cell = get_cell_with_word(table, 'CHARACTERISTICS');
    if (cell) {
        var index = cell.parentRow.index;
        var cell_1 = table.rows[index+5].cells[1].contents;
        var cell_2 = table.rows[index+6].cells[1].contents;
        var cell_3 = table.rows[index+1].cells[3].contents;
        var cell_4 = table.rows[index+1].cells[3].contents;
        var cell_5 = table.rows[index+2].cells[3].contents;
        var cell_6 = table.rows[index+3].cells[3].contents;
        var cell_7 = table.rows[index+5].cells[3].contents;
        var cell_8 = table.rows[index+6].cells[3].contents;
        var cell_9 = table.rows[index+7].cells[3].contents;
        var cell_10 = table.rows[index+8].cells[3].contents;
        var cell_11 = table.rows[index+9].cells[3].contents;
        return [doc.name, cell_1, cell_2, cell_3, cell_4, cell_5, cell_6, cell_7, cell_8, cell_9, cell_10, cell_11].join('\t');
    }
}

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

相关表格说明:表格存在合并单元格,关键词“CHARACTERISTICS”位于表格内的某个单元格中,后续提取的单元格位置基于该关键词所在行的索引进行定位。


修改后的完整脚本

核心修改点:在找到目标表格(即定位到含“CHARACTERISTICS”的单元格后),立即对当前表格的所有单元格执行拆分操作,避免全局处理所有表格,提升效率。

// 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 a folder with INDD files...');
    var files = folder.getFiles('*.indd');
    if (files.length == 0) {
        alert('No INDD files was found in the folder')
        exit();
    }
}

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

// get the data from all tables in 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 data = get_data_from_doc(doc);
    if (data) while (data.length) all_data.push(data.shift());
    if (from_folder) doc.close();
}

// if there is 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_doc(doc) {
    var tables = get_all_tables_from_doc(doc);
    if (!tables || tables.length == 0) return;
    var data = get_data_from_all_tables(tables, doc);
    if (data && data.length > 0) return data;
}

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;
}

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

function get_data_from_table(table, doc) {
    var cell = get_cell_with_word(table, 'CHARACTERISTICS');
    if (cell) {
        // 核心修改:拆分当前表格的所有合并单元格
        table.cells.everyItem().unmerge();
        
        var index = cell.parentRow.index;
        var cell_1 = table.rows[index+5].cells[1].contents;
        var cell_2 = table.rows[index+6].cells[1].contents;
        var cell_3 = table.rows[index+1].cells[3].contents;
        var cell_4 = table.rows[index+1].cells[3].contents;
        var cell_5 = table.rows[index+2].cells[3].contents;
        var cell_6 = table.rows[index+3].cells[3].contents;
        var cell_7 = table.rows[index+5].cells[3].contents;
        var cell_8 = table.rows[index+6].cells[3].contents;
        var cell_9 = table.rows[index+7].cells[3].contents;
        var cell_10 = table.rows[index+8].cells[3].contents;
        var cell_11 = table.rows[index+9].cells[3].contents;
        return [doc.name, cell_1, cell_2, cell_3, cell_4, cell_5, cell_6, cell_7, cell_8, cell_9, cell_10, cell_11].join('\t');
    }
}

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

修改说明

  • 仅在找到目标表格时执行拆分操作,而非全局处理文档内所有表格,减少不必要的操作
  • 拆分后表格的单元格索引会恢复正常,避免因合并单元格导致的rows[index+n].cells[m]读取报错
  • 脚本仍保持原有遍历逻辑,支持处理文件夹内批量文件或已打开的文档

内容的提问来源于stack exchange,提问作者Sean Larkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:02:03