基于编辑的单元格,我如何 return 单元格所属的 namedRange?
based on the edited cell how do I return the namedRange the cell belongs in?
function getNamedRange( e ) {
const sheet = SpreadsheetApp.getActiveSheet();
const activeRange = e.range;
const namedRange = sheet.getNamedRange( activeRange.getA1Notation() );
//alert named range
SpreadsheetApp.getUi().alert( namedRange );
return namedRange;
}
我尝试了多种方法都无济于事。
主要目标:获取找到已编辑单元格的命名范围的名称
因此,如果 A1:C5
是“firstRange”的命名范围
并且我编辑了单元格 A2
,onEdit(e)
会 运行 getNamedRange(e)
并提醒“firstRange”
我已经尝试了getName()
和各种使用参考部分的组合
首先,当我看到这个问题和时,我也认为这可能是相同的情况。但是,我注意到在我的回答中,检索了特定范围和特定命名范围之间的交集范围。我认为基本方法是一样的。所以为了使用我对这个问题的回答,需要稍微修改一下。所以在这个答案中,我想提出通过修改它来实现目标的示例脚本。
示例脚本 1:
当你的脚本修改后,变成如下
function getNamedRange(e) {
var inputRange = e.range;
var columnToLetter = function (column) { // <---
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
};
var res = [];
var result = [];
var sheet = SpreadsheetApp.getActiveSheet();
var namedRanges = sheet.getNamedRanges();
for (var i = 0; i < namedRanges.length; i++) {
var nr = namedRanges[i];
// Retrieve a1Notations from "inputRange".
var iStartRow = inputRange.getRow();
var iEndRow = iStartRow + inputRange.getNumRows() - 1;
var iStartColumn = inputRange.getColumn();
var iEndColumn = iStartColumn + inputRange.getNumColumns() - 1;
var irA1Notations = [];
for (var j = iStartRow; j <= iEndRow; j++) {
var temp = [];
for (var k = iStartColumn; k <= iEndColumn; k++) {
temp.push(columnToLetter(k) + j);
}
Array.prototype.push.apply(irA1Notations, temp);
}
// Retrieve a1Notations from "myNamedRange".
var namedRange = nr.getRange();
var nStartRow = namedRange.getRow();
var nEndRow = nStartRow + namedRange.getNumRows() - 1;
var nStartColumn = namedRange.getColumn();
var nEndColumn = nStartColumn + namedRange.getNumColumns() - 1;
var nrA1Notations = {};
for (var j = nStartRow; j <= nEndRow; j++) {
for (var k = nStartColumn; k <= nEndColumn; k++) {
nrA1Notations[columnToLetter(k) + j] = null;
}
}
// Retrieve intersection ranges.
result = irA1Notations.filter(function (e) { return nrA1Notations.hasOwnProperty(e) });
if (result.length > 0) {
res.push(nr.getName())
}
}
if (res.length == 0) return;
SpreadsheetApp.getUi().alert(res.join(","));
}
示例脚本 2:
在这种情况下,我认为下面的简单脚本或许可以使用。
function getNamedRange(e) {
const range = e.range;
const sheet = SpreadsheetApp.getActiveSheet();
const r = sheet.getNamedRanges().filter(r => {
const temp = r.getRange();
const startRow = temp.getRow();
const endRow = startRow + temp.getNumRows();
const startCol = temp.getColumn();
const endCol = startCol + temp.getNumColumns();
return (range.rowStart >= startRow && range.rowStart <= endRow && range.columnStart >= startCol && range.columnStart <= endCol) ? true : false;
});
if (r.length == 0) return;
SpreadsheetApp.getUi().alert(r.map(f => f.getName()).join(","));
}
注:
编辑单元格时,当编辑的单元格包含在命名范围内时,将打开一个对话框。并且,您可以看到命名范围的名称。
从这个问题来看,您似乎正在使用 getNamedRange
作为可安装的 OnEdit 触发器。在上面的脚本中,您还可以使用简单的触发器。所以也可以将函数名从getNamedRange
修改为onEdit
.
在您的脚本中,使用了 return namedRange;
。但是当 getNamedRange
是 运行 使用可安装的 OnEdit 触发器时,我认为 return namedRange;
没有被使用。
参考:
- 相关线程。
function getNamedRange( e ) {
const sheet = SpreadsheetApp.getActiveSheet();
const activeRange = e.range;
const namedRange = sheet.getNamedRange( activeRange.getA1Notation() );
//alert named range
SpreadsheetApp.getUi().alert( namedRange );
return namedRange;
}
我尝试了多种方法都无济于事。
主要目标:获取找到已编辑单元格的命名范围的名称
因此,如果 A1:C5
是“firstRange”的命名范围
并且我编辑了单元格 A2
,onEdit(e)
会 运行 getNamedRange(e)
并提醒“firstRange”
我已经尝试了getName()
和各种使用参考部分的组合
首先,当我看到这个问题和
示例脚本 1:
当你的脚本修改
function getNamedRange(e) {
var inputRange = e.range;
var columnToLetter = function (column) { // <---
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
};
var res = [];
var result = [];
var sheet = SpreadsheetApp.getActiveSheet();
var namedRanges = sheet.getNamedRanges();
for (var i = 0; i < namedRanges.length; i++) {
var nr = namedRanges[i];
// Retrieve a1Notations from "inputRange".
var iStartRow = inputRange.getRow();
var iEndRow = iStartRow + inputRange.getNumRows() - 1;
var iStartColumn = inputRange.getColumn();
var iEndColumn = iStartColumn + inputRange.getNumColumns() - 1;
var irA1Notations = [];
for (var j = iStartRow; j <= iEndRow; j++) {
var temp = [];
for (var k = iStartColumn; k <= iEndColumn; k++) {
temp.push(columnToLetter(k) + j);
}
Array.prototype.push.apply(irA1Notations, temp);
}
// Retrieve a1Notations from "myNamedRange".
var namedRange = nr.getRange();
var nStartRow = namedRange.getRow();
var nEndRow = nStartRow + namedRange.getNumRows() - 1;
var nStartColumn = namedRange.getColumn();
var nEndColumn = nStartColumn + namedRange.getNumColumns() - 1;
var nrA1Notations = {};
for (var j = nStartRow; j <= nEndRow; j++) {
for (var k = nStartColumn; k <= nEndColumn; k++) {
nrA1Notations[columnToLetter(k) + j] = null;
}
}
// Retrieve intersection ranges.
result = irA1Notations.filter(function (e) { return nrA1Notations.hasOwnProperty(e) });
if (result.length > 0) {
res.push(nr.getName())
}
}
if (res.length == 0) return;
SpreadsheetApp.getUi().alert(res.join(","));
}
示例脚本 2:
在这种情况下,我认为下面的简单脚本或许可以使用。
function getNamedRange(e) {
const range = e.range;
const sheet = SpreadsheetApp.getActiveSheet();
const r = sheet.getNamedRanges().filter(r => {
const temp = r.getRange();
const startRow = temp.getRow();
const endRow = startRow + temp.getNumRows();
const startCol = temp.getColumn();
const endCol = startCol + temp.getNumColumns();
return (range.rowStart >= startRow && range.rowStart <= endRow && range.columnStart >= startCol && range.columnStart <= endCol) ? true : false;
});
if (r.length == 0) return;
SpreadsheetApp.getUi().alert(r.map(f => f.getName()).join(","));
}
注:
编辑单元格时,当编辑的单元格包含在命名范围内时,将打开一个对话框。并且,您可以看到命名范围的名称。
从这个问题来看,您似乎正在使用
getNamedRange
作为可安装的 OnEdit 触发器。在上面的脚本中,您还可以使用简单的触发器。所以也可以将函数名从getNamedRange
修改为onEdit
.在您的脚本中,使用了
return namedRange;
。但是当getNamedRange
是 运行 使用可安装的 OnEdit 触发器时,我认为return namedRange;
没有被使用。
参考:
- 相关线程。