如何确定用户单击了哪个命名范围

时间:2019-06-07 14:22:46

标签: google-apps-script google-sheets named-ranges

我在一个电子表格文件中的不同Google表格上有多个命名范围。我希望我的Google-apps-script代码能够识别用户点击了哪些范围。

我知道如何在用户单击的活动单元格中获取值,但是我不知道如何获取其地址(行和列)。即使获得行和列,我如何知道哪个RANGE包含该单元格?

[我什至没有任何代码。]

我没有实际结果。我想要的是      范围= activeCell.parentRange(是否有执行此功能的功能?)

1 个答案:

答案 0 :(得分:0)

电子表格没有onClick事件。但是,您可以确定正在编辑哪个命名范围。您将必须为InstallonEdit安装和onEdit触发器,并且不要忘记输入e。

function InstallibleonEdit(e) {
  sh=e.range.getSheet();
  if(sh.getName()!="Sheet162"){return;}//You will probably want to change this sheet name
  var cell={row:e.range.rowStart,column:e.range.columnStart};
  var rA=isInNamedRanges(cell);
  if(rA) {
    var html=rA.join(', ');
    var userInterface=HtmlService.createHtmlOutput(html);
    SpreadsheetApp.getUi().showModelessDialog(userInterface, 'In these ranges');  
  }
}

function isInNamedRanges(cell) {
  var ss=SpreadsheetApp.getActive();
  var nrgs=ss.getNamedRanges();
  var inrgs=[];
  for(var i=0;i<nrgs.length;i++) {
    var rg=nrgs[i].getRange();
    var columnStart=rg.getColumn();
    var rowStart=rg.getRow();
    var columnEnd=columnStart + rg.getWidth() - 1;
    var rowEnd=rowStart + rg.getHeight() -1;
    var range={left:columnStart,right:columnEnd,top:rowStart,bottom:rowEnd};
    if(isCellInRange(cell,range)) {
      inrgs.push(nrgs[i].getName());
    }
  }
  return inrgs;
}

function isCellInRange(cell,range) {
  if(cell.row>=range.top && cell.row<=range.bottom && cell.column>=range.left && cell.column<=range.right) {
    return true;
  }else{
    return false;
  }
}

诚然,这有点长,但应作为示例。您很可能希望删除对话框,这是强制要求安装触发器的原因。这还将检测多个重叠的命名范围。

这是我的工作表的样子。我更改了命名范围的背景。

enter image description here

  

您可以检测到复选框的单击,因为该操作还将执行编辑。因此,如果您在范围内包括复选框,则可以检测到用户单击它们。