当粘贴多行时,对每行重新触发onEdit



我首先要说的是,我是一个完全的新手,但我花了几个小时操作一些我在网上找到的代码来适应我正在设计的表格。我试图创建一个脚本,将生成一个动态下拉到一个单元格的权利,当一个值是从现有的下拉选择。

function onEdit(event){
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Lists")
var r = event.range;

if(r.getColumn() == 3 && r.getRow() > 1 && ss.getName() == "Main"){

r.offset(0, 1).clearContent().clearDataValidations();

var types = datass.getRange(1, 1, 1,  datass.getLastColumn()).getValues();

var typeIndex = types[0].indexOf(r.getValue()) + 1;

if(typeIndex != 0) {

var validationRange = datass.getRange(2, typeIndex, datass.getLastRow());
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
r.offset(0, 1).setDataValidation(validationRule);

}

}
}

到目前为止,我的过程如下:

  1. 我用var r = ss.getActiveCell()创建了初始脚本,它一次只适用于单个单元格,但我需要它在粘贴多行时工作。版本1
  2. 我编辑到var r = event.range,它成功地将脚本应用到粘贴的所有行。但是,该脚本仅为我粘贴的顶部单元格生成列表,并为所有粘贴的单元格创建相同的列表。版本2

我需要的是onEdit本质上重新触发每一行时,数据被粘贴进来。目标版本

与其重新触发onEdit,不如让它能够处理这两种情况。为此,您可以利用Range.getRows(),Range.getColumns()以及编辑事件对象属性,如(在此答案中e是事件对象):

  • e.range.rowStart
  • e.range.rowEnd
  • e.range.columnStart
  • e.range.columnEnd

如果单个单元格被编辑,rowStartrowEnd将具有相同的值,columnStartcolumnEnd将具有相同的值。

。你可以替换

r.offset(0, 1).clearContent().clearDataValidations();

by(记住,我使用e而不是event作为事件对象)

r.offset(0, 1, e.range.getRows()).clearContent().clearDataValidations();

相关的

  • Google script onEdit在所有粘贴的单元格
  • 如何自定义onEdit()脚本工作在所有行修改时,值的列表是从剪贴板粘贴?

最新更新