InDesign 2021导出所有表格到Excel脚本运行报错求解
错误原因
- 属性访问错误:修改后的
getTable函数返回的是匹配到表格标记的文本对象数组,数组本身不存在tables属性,原代码myTables.tables[0]访问了不存在的属性,因此触发未定义对象报错。 - 循环逻辑错误:原循环每次固定取索引为0的元素,即使修复属性问题,也只会重复导出第一个表格。
修复方案
直接替换开头的变量声明和循环部分代码即可:
var doc = app.properties.activeDocument && app.activeDocument, myTables = getTable(doc), n = myTables && myTables.length; if (!n) { alert("文档中未找到可导出的表格"); exit(); } // 按索引依次遍历所有表格导出 while (n--) exportTable(myTables[n].parentStory.tables[0]);
其余函数逻辑无需改动,原有导出逻辑保持不变,每个表格会单独生成一个Excel工作簿。
完整修复后脚本
// By Trevor www.creative-scripts.com (coming sometime) Custom and Readymade scripts for Adobe Indesign and other products. var doc = app.properties.activeDocument && app.activeDocument, myTables = getTable(doc), n = myTables && myTables.length; if (!n) { alert("文档中未找到可导出的表格"); exit(); } while (n--) exportTable(myTables[n].parentStory.tables[0]); function exportTable (myTable) {// Thanks Trevor 🙂 http://forums.adobe.com/thread/1387437?tstart=0 var doc = app.properties.activeDocument && app.activeDocument, myTable = myTable || getTable (doc); if (!myTable) {alert ("Take a break"); exit();}; var numberOfRows = myTable.rows.length, rowNumber, columnNumber, rowContents = [], setRange, openMark, closeMark; if ($.os.match(/Mac/i)) { setRange = 'set value of range "A'; openMark = '" to {'; closeMark = '}'; } else { setRange = 'app.Range("A'; openMark = '") = Array('; closeMark = ')'; } for (var z = 0, rowNumber = 0; rowNumber < numberOfRows; rowNumber++) { var numberOfColumns = myTable.rows[rowNumber].columns.length, toRange = GetExcelColumnName (numberOfColumns - 1), columnContents = []; for (columnNumber = 0; columnNumber < numberOfColumns; columnNumber++) { var cellContents = myTable.rows[rowNumber].cells.everyItem().contents; columnContents = '"' + cellContents.join('", "') + '"'; } rowContents[rowNumber] = setRange + ++z + ":" + toRange+ z + openMark + columnContents + closeMark; } var tableData = rowContents.join("\r"); if ($.os.match(/Mac/i)) { // Thanks Hans http://forums.adobe.com/message/5610204#5610204 myAppleScript = ['tell application "Microsoft Excel"', 'set theWorkbook to make new workbook', 'tell active sheet of theWorkbook', tableData, 'end tell', 'end tell\r'].join("\r"); app.doScript (myAppleScript, ScriptLanguage.APPLESCRIPT_LANGUAGE); // alert (myAppleScript); exit() for Debug } else { // Thanks Calos http://forums.adobe.com/message/5610204#5610204 var vbscript = [ '''Err.Clear On Error Resume Next set app = GetObject(,"Excel.Application") If (Err.number <> 0) Then Set app = CreateObject("Excel.Application") End If app.visible = true' set newDoc = app.Workbooks.Add ''', tableData, ''''set newDoc = nothing set app = nothing ''' ]; // alert (vbscript); exit() for Debug var vbfile = File(Folder.temp +"/createXLSfile.vbs"); vbfile.open('w'); vbfile.write(vbscript.join('\r')); vbfile.close(); vbfile.execute(); $.sleep(750); vbfile.remove(); } } function GetExcelColumnName (columnNumber) { var dividend = columnNumber + 1, columnName = "", modulo; while (dividend > 0) { modulo = (dividend - 1) % 26; columnName = String.fromCharCode (65 + modulo) + columnName; dividend = Math.floor((dividend - modulo) / 26); } return columnName; } function getTable (doc) { if (!doc) return false; app.findTextPreferences = null; app.findTextPreferences.findWhat = "\x16"; var tables = doc.findText(true); if (tables.length) return tables; return false; };
内容的提问来源于stack exchange,提问作者Matt Cass
相关产品推荐
相关产品推荐

