繁体   English   中英

Excel office 脚本 - 如果单元格不为空,则将一行复制到新选项卡

[英]Excel office script - copy a row to a new tab if cell is NOT empty

我创建了一个脚本,如果在选定的单元格中输入了某些文本,该脚本会将整行移动到工作表上的另一个选项卡。

如果单元格不为空而不是具有特定文本,我希望能够执行此操作,并且我希望删除除第一列以外的所有行。

该脚本在下面并且工作得非常好,我不擅长编码并且设法从我发现的其他一些脚本中拼凑起来但我现在无法设法编辑它以适应这个新任务。

我尝试使用 Javascript 不等于符号和其他符号,并且可以删除空行,但我似乎无法使其工作。

function main(workbook: ExcelScript.Workbook) {

    // You can change these names to match the data in your workbook.
    const TARGET_TABLE_NAME = 'TableNAdded';
    const SOURCE_TABLE_NAME = 'TableN';

    // Select what will be moved between tables.
    const FILTER_COLUMN_INDEX = 27;
    const FILTER_VALUE = 'Y';

    // Get the Table objects.
    let targetTable = workbook.getTable(TARGET_TABLE_NAME);
    let sourceTable = workbook.getTable(SOURCE_TABLE_NAME);

    // If either table is missing, report that information and stop the script.
    if (!targetTable || !sourceTable) {
        console.log(`Tables missing - Check to make sure both source (${TARGET_TABLE_NAME}) and target table (${SOURCE_TABLE_NAME}) are present before running the script. `);
        return;
    }

    // Save the filter criteria currently on the source table.
    const originalTableFilters = {};
    // For each table column, collect the filter criteria on that column.
    sourceTable.getColumns().forEach((column) => {
        let originalColumnFilter = column.getFilter().getCriteria();
        if (originalColumnFilter) {
            originalTableFilters[column.getName()] = originalColumnFilter;
        }
    });

    // Get all the data from the table.
    const sourceRange = sourceTable.getRangeBetweenHeaderAndTotal();
    const dataRows: (number | string | boolean)[][] = sourceTable.getRangeBetweenHeaderAndTotal().getValues();

    // Create variables to hold the rows to be moved and their addresses.
    let rowsToMoveValues: (number | string | boolean)[][] = [];
    let rowAddressToRemove: string[] = [];

    // Get the data values from the source table.
    for (let i = 0; i < dataRows.length; i++) {
        if (dataRows[i][FILTER_COLUMN_INDEX] === FILTER_VALUE) {
            rowsToMoveValues.push(dataRows[i]);

            // Get the intersection between table address and the entire row where we found the match. This provides the address of the range to remove.
            let address = sourceRange.getIntersection(sourceRange.getCell(i, 0).getEntireRow()).getAddress();
            rowAddressToRemove.push(address);
        }
    }

    // If there are no data rows to process, end the script.
    if (rowsToMoveValues.length < 1) {
        console.log('No rows selected from the source table match the filter criteria.');
        return;
    }

    console.log(`Adding ${rowsToMoveValues.length} rows to target table.`);

    // Insert rows at the end of target table.
    targetTable.addRows(-1, rowsToMoveValues)

    // Remove the rows from the source table.
    const sheet = sourceTable.getWorksheet();

    // Remove all filters before removing rows.
    sourceTable.getAutoFilter().clearCriteria();

    // Important: Remove the rows starting at the bottom of the table.
    // Otherwise, the lower rows change position before they are deleted.
    console.log(`Removing ${rowAddressToRemove.length} rows from the source table.`);
    rowAddressToRemove.reverse().forEach((address) => {
        sheet.getRange(address).delete(ExcelScript.DeleteShiftDirection.up);
    });

    // Reapply the original filters. 
    Object.keys(originalTableFilters).forEach((columnName) => {
        sourceTable.getColumnByName(columnName).getFilter().apply(originalTableFilters[columnName]);
    });
}

如果我正确理解您的问题,那么如果值 = "Y"(分配给FILTER_VALUE的值),您目前正在过滤表格。 这部分发生在这里:

    if (dataRows[i][FILTER_COLUMN_INDEX] === FILTER_VALUE) {

您希望将此行从检查单元格值是否为 Y 更新为检查单元格值是否不为空。 为此,您可以像这样更新此行:

    if (dataRows[i][FILTER_COLUMN_INDEX] as string !== "") {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM