如何确定用户单击了哪个命名范围
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.
我在单个电子表格文件的不同 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.