获取可见视图索引中的最后一列 - Excel - Office-JS

Get Last Column in Visible Views Index - Excel - Office-JS

我正在尝试筛选工作表的最后一列,但我似乎无法获得该列的索引。要清楚,我需要相对于工作表的索引,而不是范围。我用 VisibleView 找到了列,但可能有隐藏的行,所以我的计划是通过 getRangeByIndexes 加载该列,但我需要相对 columnIndexworksheet.

我尝试了下面的一系列变体,但我要么得到 Object doesn't support 'getColumn' 要么 columnIndex is undefined

注意:在下面的示例中,我对 7 进行了硬编码,因为这将是相对于 VisibleView 的最后一列(列和行已经被隐藏),但我希望通过动态方式实现其他功能,只是返回“最后可见列索引”。

var ws = context.workbook.worksheets.getActiveWorksheet()
var visible_rng = ws.getUsedRange(true).getVisibleView()
visible_rng.load(["columnCount", "columnIndex"])
await context.sync();
console.log('visible_rng.columnIndex')
console.log(visible_rng.getCell(0,7).columnIndex)
console.log(visible_rng.getColumn(7).columnIndex)

这个方法好像有点hack,如果有更好的方法欢迎分享!但是,我发现的第一件事是 getVisibleView 在描述中只提到 rows

Represents the visible rows of the current range.

我决定尝试 getSpecialCells 并且能够加载 address 属性。然后我不得不使用 split 并获取最后一列 LETTER 并将其转换为 Index.

我也想要 columnCount 但这对 getSpecialCells 不起作用所以我从 getVisibleView 和 return 一个与可见视图相关的对象中进行了轮询如果我需要更多详细信息,我可以稍后构建该功能。

这里是:

async function Get_Visible_View_Details_Obj(context, ws) {
    var visible_rng = ws.getUsedRange(true).getSpecialCells("Visible");
    visible_rng.load("address")
    var visible_view_rng = ws.getUsedRange(true).getVisibleView()
    visible_view_rng.load("columnCount")
    await context.sync();
    var Filter_Col_Index = visible_rng.address
    var Filter_Col_Index = Filter_Col_Index.split(",")
    var Filter_Col_Index = Filter_Col_Index[Filter_Col_Index.length - 1]
    var Filter_Col_Index = Filter_Col_Index.split("!")[1]
    if (Filter_Col_Index.includes(":") == true) {
        var Filter_Col_Index = Filter_Col_Index.split(":")[1]
    }
    var Filter_Col_Index = Get_Alpha_FromString(Filter_Col_Index)
    var Filter_Col_Index = Get_Col_Index_From_Letters(Filter_Col_Index)
    var Filter_Col_Index_Obj = {
        "last_col_ws_index": Filter_Col_Index,
        "columnCount": visible_view_rng.columnCount,
    }
    return Filter_Col_Index_Obj
}

辅助函数:

function Get_Alpha_FromString(str) {
    return str.replace(/[^a-z]/gi, '');
}

function Get_Col_Index_From_Letters(str) {
    str = str.toUpperCase();
    let out = 0, len = str.length;
    for (pos = 0; pos < len; pos++) {
        out += (str.charCodeAt(pos) - 64) * Math.pow(26, len - pos - 1);
    }
    return out - 1;
}