取消隐藏行后,为什么getRange()在onChange事件中工作?

时间:2017-05-01 15:38:58

标签: google-apps-script google-sheets google-sheets-api

我想在用户取消隐藏行时运行一些脚本。我可以看到,检测用户何时取消隐藏行的唯一方法是在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);
}

1 个答案:

答案 0 :(得分:0)

onChange()事件中检索有效范围似乎存在未解决的问题,请检查Issue Tracker处的任何更新。