Excel Online / ExcelScript 错误:范围 getColumn:超时,如何增加超时或改进我的代码?

问题描述 投票:0回答:1

我有一个代码可以遍历“hello”表并删除列顶部包含单词 B 的所有列:

function main(workbook: ExcelScript.Workbook) {

  let ws = workbook.getWorksheet("hello");
  let usedrange = ws.getUsedRange(true);
  let qtycol = usedrange.getColumnCount() - 1;
  let values = usedrange.getValues();

  for (let j = qtycol; j >= 0; j--) {

    let command = values[1][j];

    if (command == "B") {
      usedrange.getColumn(j).delete(ExcelScript.DeleteShiftDirection.left);
    }
  }
}

当文件较小时,没有问题。但现在文件有点大了,我收到以下错误:

第 64 行:范围 getColumn:超时

第64行是以usedrange开头的行...

有更有效的方法吗?很想获得反馈或其他想法。

谢谢!

javascript excel typescript timeout office-scripts
1个回答
0
投票

我怀疑当删除很多列时,工作表的更新可能会导致您的问题。

为了解决这个问题,您可以建立一个多区域范围(这是一个不会修改工作表的只读操作),然后在单个操作中将其删除。

我无法访问 ExcelScript,但这是可以执行此操作的等效 VBA 例程:

Public Sub bla()

    Dim J As Integer
    Dim Command As String
    Dim qtycol As Integer
    Dim ws As Worksheet
    Dim UsedRange As Range
    Dim toDeleteRange As Range
    
    Set ws = Application.ActiveWorkbook.Worksheets("hello")
    
    Set UsedRange = ws.UsedRange
    Let qtycol = UsedRange.Columns.Count - 1
    
    For J = qtycol To 1 Step -1 '(let j = qtycol; j >= 0; j--) {
    
        Let Command = UsedRange(1, J)
    
        If (Command = "B") Then
            If (toDeleteRange Is Nothing) Then
                Set toDeleteRange = UsedRange.Columns(J)
            Else
                Set toDeleteRange = Union(toDeleteRange, UsedRange.Columns(J))
            End If
        End If
    Next J
    
    toDeleteRange.Delete (XlDeleteShiftDirection.xlShiftToLeft)

End Sub

您可以使用 ExcelScript 中的类似例程。

© www.soinside.com 2019 - 2024. All rights reserved.