【问题标题】:Office.js Excel Range getRow gives wrong range addressOffice.js Excel Range getRow 给出了错误的范围地址
【发布时间】:2016-11-17 16:16:45
【问题描述】:

在我的 Excel 选项卡窗格插件中,我希望仅基于活动的选定行从范围中获取一些行。

最初我的数据位于“Sheet1!H5:I16”中,我在工作表中只选择没有表格 f.e. 的行。 "Sheet1!8:10"

为了检测选定的行,我得到选定的范围并加载一些选项:

Excel.run(function (ctx) { 
    var selectedRange = ctx.workbook.getSelectedRange();
    selectedRange.load(['address', 'rowIndex', 'rowCount']);
    return ctx.sync().then(function() {
            console.log(selectedRange.address);
    });
});

它给了我地址 "Sheet1!8:10" 和 selectedRange.rowIndex=7 和 selectedRange.rowCount=3

现在我从选择中减去我的范围行:

var subsIndex = selectedRange.rowIndex - 5 // 5 is start index H5 

这里我的行在数据范围 rowIndex 内,它是 3。

再次:对于整个工作表,我的 rowIndex 为 7,对于选择,与我的数据范围相交,行索引为 3。

现在我想从整个数据 Sheet1!H5:I16 中获取内部数据范围 rowIndex 的第一行(它必须是 Sheet1!H8:I10),仅基于选定的行(selectedRange.rowIndex=7 和 selectedRange.rowCount=3 ):

Excel.run(function (ctx) { 
    var sheetName = "Sheet1";
    var rangeAddress = "H5:I16"; // my whole data range
    var range = ctx.workbook.worksheets.getItem(sheetName).getRange(rangeAddress).getRow(subsIndex ); //try to get row number 3
    range.load('address');
    return ctx.sync().then(function() {
        console.log(range.address); // gives me Sheet1!H5:I16 ??? 
    });
});

为什么 getRange(3) 只给我整个范围地址 Sheet1!H5:I16 按索引 3 插入的行地址:Sheet1!H8:I8 ?

橙色:数据范围

红色:需要的行

【问题讨论】:

  • 我尝试了您的示例,但输出为 Sheet1!H8:I8,这正是我所期望的?
  • 是的,这就是我所期望的。

标签: javascript excel office365 office-js


【解决方案1】:

我不确定我是否完全遵循了您的方案。但我认为类似下面的东西会起作用(事实上,不需要你加载行索引等):

return Excel.run(function (ctx) {
    var selection = ctx.workbook.getSelectedRange();
    selection.format.fill.color = "purple";
    var range = selection.getRow(3);
    range.format.fill.color = "yellow"; 
    range.load('address');
    return ctx.sync()
        .then(function() {
            console.log(range.address);
        })
        .then(ctx.sync);
}).catch(console.log);

【讨论】:

  • 感谢您的回答,但 getSelectedRange() 在某些情况下对我不起作用。有时,更新操作的用户选择整行而不是范围,或者用户只能选择一个单元格,但对于行操作,我需要一个 Id 列,并确保选择中的 Id 列(或用于自动检测)我应该取整行。使用行索引对我的情况非常有用,但令 getRow() 无法按预期工作感到非常沮丧。
  • @AlexK,获取整行:您可以随时致电range.getEntireRow()。使用索引有点不安全,因为如果用户或共同作者或程序本身在上面添加行,则数学将关闭。
  • 话虽如此:我仍然不相信 getRow 做错了事。您是否有机会创建一个更简单的示例,例如我上面的示例,但使用索引?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2014-08-05
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2013-12-13
相关资源
最近更新 更多