Excel Office Script需求:非空单元格触发行迁移并保留首列
修改Excel Office Script实现非空触发迁移并保留源表首列
以下是修改后的完整脚本,已实现指定单元格非空即触发整行迁移,且源表仅保留该行首列内容的需求:
function main(workbook: ExcelScript.Workbook) { // 可根据你的工作簿修改这些名称 const TARGET_TABLE_NAME = 'TableNAdded'; const SOURCE_TABLE_NAME = 'TableN'; // 指定触发迁移的列索引(从0开始计数,27对应第28列) const TRIGGER_COLUMN_INDEX = 27; // 获取表格对象 let targetTable = workbook.getTable(TARGET_TABLE_NAME); let sourceTable = workbook.getTable(SOURCE_TABLE_NAME); // 检查表格是否存在 if (!targetTable || !sourceTable) { console.log(`表格缺失 - 请确保源表(${SOURCE_TABLE_NAME})和目标表(${TARGET_TABLE_NAME})都存在后再运行脚本。`); return; } // 保存源表原有筛选条件 const originalTableFilters = {}; sourceTable.getColumns().forEach((column) => { let originalColumnFilter = column.getFilter().getCriteria(); if (originalColumnFilter) { originalTableFilters[column.getName()] = originalColumnFilter; } }); // 获取源表数据范围和数据行 const sourceRange = sourceTable.getRangeBetweenHeaderAndTotal(); const dataRows: (number | string | boolean)[][] = sourceRange.getValues(); // 存储要迁移的行数据和需要清空的源表范围地址 let rowsToMoveValues: (number | string | boolean)[][] = []; let rangesToClear: string[] = []; // 遍历源表数据行,筛选触发条件 for (let i = 0; i < dataRows.length; i++) { // 判断指定列是否非空(空字符串、null、undefined都视为空) const cellValue = dataRows[i][TRIGGER_COLUMN_INDEX]; if (cellValue !== "" && cellValue !== null && cellValue !== undefined) { rowsToMoveValues.push(dataRows[i]); // 获取该行除首列外的范围地址,用于后续清空 const rowRange = sourceRange.getRow(i); const clearRange = rowRange.getOffsetRange(0, 1, 1, rowRange.getColumnCount() - 1); rangesToClear.push(clearRange.getAddress()); } } // 如果没有符合条件的行,结束脚本 if (rowsToMoveValues.length < 1) { console.log('源表中没有符合非空触发条件的行。'); return; } console.log(`向目标表添加${rowsToMoveValues.length}行数据。`); // 将行数据添加到目标表末尾 targetTable.addRows(-1, rowsToMoveValues); console.log(`清空源表中${rangesToClear.length}行的非首列内容。`); const sheet = sourceTable.getWorksheet(); // 清空指定范围的内容 rangesToClear.forEach((address) => { sheet.getRange(address).clear(ExcelScript.ClearApplyTo.contents); }); // 恢复源表原有筛选条件 Object.keys(originalTableFilters).forEach((columnName) => { sourceTable.getColumnByName(columnName).getFilter().apply(originalTableFilters[columnName]); }); }
关键修改说明
触发条件调整:
- 移除原脚本的
FILTER_VALUE常量,改为判断指定列单元格是否非空,覆盖文本、数字等所有非空触发场景 - 排除空字符串、
null、undefined三种空值情况,避免误触发
- 移除原脚本的
源表行处理修改:
- 不再删除整行,而是获取每行除首列外的单元格范围,调用
clear(ExcelScript.ClearApplyTo.contents)清空内容,保留首列数据 - 替换原脚本删除行的逻辑,避免破坏表格结构和其他行位置
- 不再删除整行,而是获取每行除首列外的单元格范围,调用
变量命名优化:
- 将
FILTER_COLUMN_INDEX改为TRIGGER_COLUMN_INDEX,更贴合非空触发逻辑,便于理解
- 将
使用注意
- 确认
TRIGGER_COLUMN_INDEX的值对应你需要的触发列(索引从0开始,比如第A列是0,第AB列是27) - 确保源表和目标表的列结构一致,否则迁移数据可能出现列错位问题
内容的提问来源于stack exchange,提问作者Eti
相关产品推荐
相关产品推荐

