基于编辑的单元格,我如何 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”的命名范围

并且我编辑了单元格 A2onEdit(e) 会 运行 getNamedRange(e) 并提醒“firstRange”

我已经尝试了getName()和各种使用参考部分的组合

Google Reference Link

首先,当我看到这个问题和时,我也认为这可能是相同的情况。但是,我注意到在我的回答中,检索了特定范围和特定命名范围之间的交集范围。我认为基本方法是一样的。所以为了使用我对这个问题的回答,需要稍微修改一下。所以在这个答案中,我想提出通过修改它来实现目标的示例脚本。

示例脚本 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; 没有被使用。

参考:

  • 相关线程。