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

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

关键修改说明

  1. 触发条件调整:

    • 移除原脚本的FILTER_VALUE常量,改为判断指定列单元格是否非空,覆盖文本、数字等所有非空触发场景
    • 排除空字符串、null、undefined三种空值情况,避免误触发
  2. 源表行处理修改:

    • 不再删除整行,而是获取每行除首列外的单元格范围,调用clear(ExcelScript.ClearApplyTo.contents)清空内容,保留首列数据
    • 替换原脚本删除行的逻辑,避免破坏表格结构和其他行位置
  3. 变量命名优化:

    • 将FILTER_COLUMN_INDEX改为TRIGGER_COLUMN_INDEX,更贴合非空触发逻辑,便于理解

使用注意

  • 确认TRIGGER_COLUMN_INDEX的值对应你需要的触发列(索引从0开始,比如第A列是0,第AB列是27)
  • 确保源表和目标表的列结构一致,否则迁移数据可能出现列错位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:10:15