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()使用參考部分的各種組合
谷歌參考鏈接
uj5u.com熱心網友回復:
首先,當我看到這個問題和Programmatically test if a Google Sheet cell is in a named range時,我也認為這可能是相同的情況。但是,我注意到在我的回答中,檢索了特定范圍和特定命名范圍之間的交集范圍。我以為基本方法是一樣的。因此,為了使用我對這個問題的回答,需要稍作修改。所以在這個答案中,我想提出通過修改來實作目標的示例腳本。
示例腳本 1:
當為您的腳本修改此示例腳本時,它變為如下。
function getNamedRange(e) {
var inputRange = e.range;
var columnToLetter = function (column) { // <--- https://stackoverflow.com/a/21231012/7108653
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;沒有使用。
參考:
- 相關執行緒。
- 以編程方式測驗 Google 表格單元格是否在命名范圍內
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/449478.html
