我想在用户取消隐藏行时运行一些脚本。我可以看到,检测用户何时取消隐藏行的唯一方法是在onChange事件中。我可以看到,通过changeType属性尝试确定更改内容的唯一方法。但是,当用户取消隐藏行时,changeType等于OTHER。 OTHER可以表示各种事物。因此,我想尝试确定行是否被取消隐藏。
我注意到当我取消隐藏行时,现在选择了这些行(具有焦点)。所以从理论上讲,我应该能够使用getActiveRange()来返回刚刚被隐藏的行。
问题是当我在onChange事件中使用getActiveRange时,它什么都不返回。但是,如果我在onChange事件函数代码完成后调用getActiveRange,那么我会得到正确的信息......即使我没有更改我当前在工作表中选择的内容。
为什么getRange()在onChange事件中什么也没有返回?
以下onChange代码将显示一个对话框,其中包含当用户取消隐藏行时getActiveRange方法返回的行数。该代码将添加一个名为Plan - >的菜单项。测试。单击“测试”将显示一个对话框,其中包含当前选定的行数。要尝试这一点,隐藏一些行,然后取消隐藏它们。取消隐藏它们后,您将看到一个显示0的对话框。然后转到计划 - >在菜单中进行测试,您将看到另一个对话框,指示您刚刚取消隐藏的实际行数。
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Plan')
.addItem('Collapse Section', 'collapseSection')
.addSeparator()
.addItem('Test','testThis')
.addToUi();
}
function testThis() {
var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var thisRange = thisSheet.getActiveRange();
popMsg(thisRange.getNumRows());
}
function onChange(e){
var activeSheet = e.source.getActiveSheet();
if (e.changeType == "OTHER") {
// some other event occurred, possible Unhiding Rows
if (activeSheet.getName() == "Portfolio") {
// only execute this code if the OTHER event occurred while on the Portfolio tab
var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var thisRange = thisSheet.getActiveRange();
popMsg(thisRange.getNumRows());
}
}
}
function popMsg (thisMsg) {
var ui = SpreadsheetApp.getUi();
var thisMsg = ui.alert('Information',thisMsg,ui.ButtonSet.OK);
}