使用 onSelectionChange(e) 触发器检索活动单元格的单元格地址

Retrieving Cell Address of Active Cell with onSelectionChange(e) Trigger

我想创建一个脚本来显示 A1 中活动单元格的单元格地址,但是,事实证明这很困难,因为我什至无法使 Google Apps Script guide 上的 onSelectionChange 示例起作用。每当我 运行 它时,我得到的错误是 TypeError: Cannot read property 'range' of undefined.

这是代码:

/**
 * The event handler triggered when the selection changes in the spreadsheet.
 * @param {Event} e The onSelectionChange event.
 */
function onSelectionChange(e) {
  // Set background to red if a single empty cell is selected.
  var range = e.range;
  if(range.getNumRows() === 1 
      && range.getNumColumns() === 1 
      && range.getCell(1, 1).getValue() === "") {
    range.setBackground("red");
  }
}

关于你的TypeError: Cannot read property 'range' of undefined的错误信息,我想你可能直接用脚本编辑器运行实现了onSelectionChange的功能。如果是这样,就会出现这样的错误,因为没有给出事件对象e

onSelectionChange 用作简单触发器。在这种情况下,当您想使用onSelectionChange触发器检索活动单元格的单元格地址时,请selectGoogle上的单元格传播sheet。这样,脚本就被 onSelectionChange 触发 运行。

示例脚本:

例如,当onSelectionChange触发器是运行通过select单元格时,将单元格地址作为A1Notation放入单元格的示例脚本如下。当您使用该脚本时,请将以下脚本复制粘贴到Spreadsheet的脚本编辑器中并保存。并且,请select一个单元格放在活跃的Spreadsheet.

function onSelectionChange(e) {
  var range = e.range;
  range.setValue(range.getA1Notation());
}

结果:

当使用上面的脚本时,会得到如下结果。您可以看到,为了 运行 脚本,单元格是 selected.

注:

  • 即使您 select 编辑了一个单元格,当示例脚本不是 运行 时,请关闭 Spreadsheet 并再次打开 Spreadsheet。在我的环境中,我确认 onSelectionChange 触发器有效。

参考:

已添加 1 个:

关于以下您的回复,

Thanks. This works and so did the red cell Google example. Although I did have to close the workbook and reopen it to get it to work. How can I set the range to a fixed cell so the active cell address only appears there?

当您只想运行特定范围的脚本时,下面的示例脚本怎么样?从您的回复来看,我使用了您的脚本。

示例脚本:

function onSelectionChange(e) {
  var ranges = ["A2:B5", "D2:E5"]; // Please set the range you want to run the script.

  var range = e.range;
  var sheet = range.getSheet();
  var check = ranges.some(r => {
    var rng = sheet.getRange(r);
    var rowStart = rng.getRow();
    var rowEnd = rowStart + rng.getNumRows();
    var colStart = rng.getColumn();
    var colEnd = colStart + rng.getNumColumns();
    return (range.rowStart >= rowStart && range.rowEnd < rowEnd && range.columnStart >= colStart && range.columnEnd < colEnd);
  });
  if (check) {
    range.setBackground("red");
  }
}
  • 在这个脚本中,只有当var ranges = ["A2:B5", "D2:E5"]范围内的单元格是select时,range.setBackground("red")才是运行。所以请根据您的实际情况修改["A2:B5", "D2:E5"]

  • 如果您还想检查sheet名称,请按如下方式修改上面的脚本。在这种情况下,当 sheet ["Sheet2", "Sheet3"]["A2:B5", "D2:E5"] 范围内的单元格是 selected 时,range.setBackground("red") 是 运行.

      function onSelectionChange(e) {
        var sheetNames = ["Sheet2", "Sheet3"]; // Please set the sheet names.
        var ranges = ["A2:B5", "D2:E5"]; // Please set the range you want to run the script.
    
        var range = e.range;
        var sheet = range.getSheet();
        if (!sheetNames.includes(sheet.getSheetName())) return;
        var check = ranges.some(r => {
          var rng = sheet.getRange(r);
          var rowStart = rng.getRow();
          var rowEnd = rowStart + rng.getNumRows();
          var colStart = rng.getColumn();
          var colEnd = colStart + rng.getNumColumns();
          return (range.rowStart >= rowStart && range.rowEnd < rowEnd && range.columnStart >= colStart && range.columnEnd < colEnd);
        });
        if (check) {
          range.setBackground("red");
        }
      }
    

添加了 2 个:

关于以下您的回复,

No, sorry. I meant how can I make the active cell address appear in A1. If I click on cell G5, for example, 'G5' appears in A1.

在那种情况下,下面的示例脚本怎么样?

示例脚本:

function onSelectionChange(e) {
  var range = e.range;
  range.getSheet().getRange("A1").setValue(range.getA1Notation());
}