首页 > 解决方案 > 如何确定用户点击了哪个命名范围

问题描述

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

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

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

我没有实际结果。我想要的是 range = activeCell.parentRange 之类的东西(有没有这样做的函数?)

标签: google-apps-scriptgoogle-sheetsnamed-ranges

解决方案


电子表格没有 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;
  }
}

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

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

在此处输入图像描述

您可以检测到复选框的单击,因为该操作也会执行编辑。因此,如果您在范围中包含复选框,那么您可以检测到用户点击它们。


推荐阅读