为现有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
相关产品推荐
相关产品推荐

