【问题标题】:OfficeScripts to delete visible rows after filtering过滤后删除可见行的 OfficeScripts
【发布时间】:2022-09-26 02:58:46
【问题描述】:

再会!!

将来自我的一个系统的数据转储到 excel 中。数据的大小可以从 200 行到 250,000 行不等。因此,为了避免一些负载限制,我发现操作/清理这些数据的最佳方法是避免创建表,并使用 Excel 的内置过滤器,并逐个过滤以使数据被删除可见...然后删除它。完美运行!

但是,这个问题是,行数总是不同的。当我定义了真实范围时,脚本运行完美(A2:L20000)。但是,当我尝试定义 usedRange 时,它​​给我一个错误,指出参数无效。我不知道如何克服这一点。

这个错误出现在第 10 行 selectedSheet.getRange(usedRange).delete(ExcelScript.DeleteShiftDirection.up); 与第 16 行相同,所以我猜这也会出错。

这是代码的sn-p。

任何帮助或指导将不胜感激!

function main(workbook: ExcelScript.Workbook) {
    let selectedSheet = workbook.getActiveWorksheet();
    let usedRange = selectedSheet.getUsedRange();
    console.log(usedRange);
    // Toggle auto filter on selectedSheet
    selectedSheet.getAutoFilter().apply(selectedSheet.getRange(\"A1:L1\"));
    // Apply values filter on selectedSheet
    selectedSheet.getAutoFilter().apply(selectedSheet.getAutoFilter().getRange(), 10, { filterOn: ExcelScript.FilterOn.values, values: [\"0\"] });
    // Delete visable on selectedSheet
    selectedSheet.getRange(usedRange).delete(ExcelScript.DeleteShiftDirection.up);
    // Clear auto filter on selectedSheet
    selectedSheet.getAutoFilter().clearCriteria();
    // Apply values filter on selectedSheet
    selectedSheet.getAutoFilter().apply(selectedSheet.getAutoFilter().getRange(), 6, { filterOn: ExcelScript.FilterOn.values, values: [\"Expense\", \"Income\"] });
    // Delete range visable on selectedSheet
    selectedSheet.getRange(usedRange).delete(ExcelScript.DeleteShiftDirection.up);
    // Clear auto filter on selectedSheet
    selectedSheet.getAutoFilter().clearCriteria();

    标签: excel office-scripts


    【解决方案1】:

    要回答您的问题,UsedRange 在这里不起作用的原因是因为 selectedSheet.getRange() 需要一个字符串参数。字符串参数是范围的地址。

    为了解决这个问题,您可以编写类似selectedSheet.getRange(usedRange.getAddress()).delete(ExcelScript.DeleteShiftDirection.up); 的内容,但删除不适用于 usedRange() 这种方式。

    我添加了一个我写的函数来帮助删除。我用对这个新函数的函数调用替换了你删除的代码行。您可以尝试下面的代码,看看它是否有效:

    function main(workbook: ExcelScript.Workbook) {
      let selectedSheet = workbook.getActiveWorksheet();
      let usedRange = selectedSheet.getUsedRange();
      console.log(usedRange);
      // Toggle auto filter on selectedSheet
      selectedSheet.getAutoFilter().apply(selectedSheet.getRange("A1:L1"));
      // Apply values filter on selectedSheet
      selectedSheet.getAutoFilter().apply(selectedSheet.getAutoFilter().getRange(), 10, { filterOn: ExcelScript.FilterOn.values, values: ["0"] });
      // Delete visable on selectedSheet
      deleteFilteredRange(workbook)
      // Clear auto filter on selectedSheet
      selectedSheet.getAutoFilter().clearCriteria();
      // Apply values filter on selectedSheet
      selectedSheet.getAutoFilter().apply(selectedSheet.getAutoFilter().getRange(), 6, { filterOn: ExcelScript.FilterOn.values, values: ["Expense", "Income"] });
      // Delete range visable on selectedSheet
      deleteFilteredRange(workbook)
      // Clear auto filter on selectedSheet
      selectedSheet.getAutoFilter().clearCriteria();
    }
      
      function deleteFilteredRange(workbook: ExcelScript.Workbook) {
        let selectedSheet = workbook.getActiveWorksheet();
        let startRow = 2 'Two would be the second row after the header row range.
        let lastRow = selectedSheet.getRange("A1048576").getExtendedRange(ExcelScript.KeyboardDirection.up).getRowIndex() + 1
        selectedSheet.getRange(`${startRow}:${lastRow}`).delete(ExcelScript.DeleteShiftDirection.up)
      }
    

    但是,如果您的数据集太大,此脚本可能不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2016-11-01
      • 2017-08-14
      相关资源
      最近更新 更多