获取可见视图索引中的最后一列 - Excel - Office-JS
Get Last Column in Visible Views Index - Excel - Office-JS
我正在尝试筛选工作表的最后一列,但我似乎无法获得该列的索引。要清楚,我需要相对于工作表的索引,而不是范围。我用 VisibleView
找到了列,但可能有隐藏的行,所以我的计划是通过 getRangeByIndexes
加载该列,但我需要相对 columnIndex
到 worksheet
.
我尝试了下面的一系列变体,但我要么得到 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;
}
我正在尝试筛选工作表的最后一列,但我似乎无法获得该列的索引。要清楚,我需要相对于工作表的索引,而不是范围。我用 VisibleView
找到了列,但可能有隐藏的行,所以我的计划是通过 getRangeByIndexes
加载该列,但我需要相对 columnIndex
到 worksheet
.
我尝试了下面的一系列变体,但我要么得到 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;
}