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

how to determine which named range the user has clicked in

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

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

[我没有任何接近的代码。]

我没有实际结果。我想要的是像 range = activeCell.parentRange(是否有执行此操作的函数?)

Spreadsheets 没有 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;
  }
}

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

这就是我的 sheet 的样子。我更改了命名范围的背景。

You can detect the click of a check box since that action will also perform an edit. So if you include check boxes in your ranges then you could detect users clicking on them.