当从剪贴板粘贴值列表时,如何自定义 onEdit() 脚本以处理修改的所有行?

How to customize onEdit() script to work on all rows modified when a list of values is pasted from the clipboard?

我相信已经发布了不同的变体,但似乎无法使其适用于我的 onEdit。我拥有的脚本用于动态下拉列表,具体取决于第 1 列中编辑的内容。我 运行 遇到的问题是,当我将一批数据粘贴到第 1 列时,它只编辑将 onEdit 应用于第一个相邻的单元格。 Appscript 相对较新,所以不确定,所以我尝试编辑它没有成功。感谢任何帮助!

我目前拥有的:

 function onEdit(e){
    var activeCell = e.range;
    var val = activeCell.getValue();
    var r = activeCell.getRow();
    var c = activeCell.getColumn();
    var wsName = activeCell.getSheet().getName();
    if(wsName === mainWsName && c === firstLevelColumn && r > 1){
      applyFirstLevelValidation(val,r);
    } else if(wsName === mainWsName && c === secondLevelColumn && r > 1){
      applySecondLevelValidation(val,r);
    } else if(wsName === mainWsName && c === thirdLevelColumn && r > 1){
      applyThirdLevelValidation(val,r);
    }

 }//end onEdit

试试这个模式:

const action = [
  applyFirstLevelValidation,
  applySecondLevelValidation,
  applyThirdLevelValidation,
];

function onEdit(e) {
  const sheet = e.range.getSheet();
  if (sheet.getName() !== mainWsName
    || e.range.rowEnd <= (sheet.getFrozenRows() || 1)) {
    return;
  }
  e.range.getValues()
    .forEach((row, rowIndex) => {
      const rowNumber = e.range.rowStart + rowIndex;
      row.forEach((value, columnIndex) => {
        const columnNumber = e.range.columnStart + columnIndex;
        action[columnNumber - 1](value, rowNumber);
      });
    });
}

学习 Google Apps 脚本的一些最佳资源包括 Beginner's Guide, the New Apps Script Editor guide, the Fundamentals of Apps Script with Google Sheets codelab, the Extending Google Sheets pagejavascript.infoMozilla Developer Network and Apps Script at Stack Overflow

getValue() returns 第一个单元格的值,要获取所有范围单元格的值,请改用 getValues()

这是使用 getValues() 对原始函数进行最小更改的一种方法:

function onEdit(e) {
  var activeCell = e.range;
  var wsName = activeCell.getSheet().getName();
  e.range.getValues().forEach((row, i) => {
      var r = i + 1;
      row.forEach((val, j) => {
          var c = j + 1;
          if (wsName === mainWsName && c === firstLevelColumn && r > 1) {
            applyFirstLevelValidation(val, r);
          } else if (wsName === mainWsName && c === secondLevelColumn && r > 1) {
            applySecondLevelValidation(val, r);
          } else if (wsName === mainWsName && c === thirdLevelColumn && r > 1) {
            applyThirdLevelValidation(val, r);
          }
        }
      });
  });
} //end onEdit