首页 > 解决方案 > OnEdit(e) 由多个范围内的编辑触发

问题描述

如果它们被编辑,我有一个脚本可以清除几个命名范围中的值。我设法将 OnEdit(e) 触发器配置为在编辑单个命名范围时触发,但无法弄清楚如何扩展它以在编辑任何范围时触发。我想我可以为命名范围设置几个变量(例如,MyRange2、MyRange3 等),但在这种情况下,我需要为我试图避免的每个变量复制 IF 语句。

我也尝试将 myRange 定义为一个数组,但它看起来与 IF 相矛盾: var myRange = [ss.getRangeByName('total1), ss.getRangeByName('total2'), ss.getRangeByName('total3')];

function onEdit(e) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
  var myRange = SpreadsheetApp.getActiveSheet().getRange('total1');
 
  var row = e.range.getRow();
  var col = e.range.getColumn();

  if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow()) { 
        var name_arr = ['total1', 'total2', 'total3'];
        for (var name of name_arr) {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var range = ss.getRangeByName(name).clearContent();
        }    ;
      } else {
        return;
      }
    };

标签: google-apps-scriptgoogle-sheets

解决方案


解释:

  • 确保充分利用事件对象。您希望花费尽可能少的资源,并将每次编辑时要执行的所有绝对必要的代码放在if可以结束代码执行的主要条件之前。例如var myRange = SpreadsheetApp.getActiveSheet().getRange('total1')不需要每次编辑都执行。

  • 我假设您想为特定工作表运行脚本。在我的代码中,我使用Sheet1并添加了一个if条件来检查您编辑的工作表是否为Sheet1. 如果您不想要这种行为,请删除此if条件和括号if(as.getName()=="Sheet1")。然后,您的代码将自动适用于文档中的每个工作表(只要此工作表中的名称范围符合您的标准)。

  • 定义命名范围的名称列表,["total1","total2","total3"]脚本将遍历所有命名范围并确保仅针对这些命名范围执行代码块。

  • 如果上述所有if条件评估为true,则清除名称范围的内容。

解决方案:

function onEdit(e) {
  const arng = e.range; // // get active range
  const as = arng.getSheet(); // get active sheet
  if(as.getName()=="Sheet1"){
      const nranges = ["total1","total2","total3"]; // add here the names of the ranges
      //Let's get the row & column indexes of the active cell
      const namedRanges = as.getNamedRanges(); // get all named ranges
      const row = arng.getRow();
      const col = arng.getColumn();
      namedRanges.forEach(nr=>{
        if (nranges.includes(nr.getName())){
          let nrange = nr.getRange();
          if (col >= nrange.getColumn() && col <= nrange.getLastColumn() 
              && row >= nrange.getRow() && row <= nrange.getLastRow()) { 
               nrange.clearContent(); // clear the range of the named range
          }
        }
      });     
  }
}

推荐阅读