我正在为自己编写一个小脚本来帮助我进行一些dataValidation,但遇到了一个问题:
考虑到10行和1列的范围,我至少选择其中的2行并复制,然后将其粘贴到工作表中的其他位置,然后通过Logger.log得到类似这样的反馈:
[18-08-31 14:15:32:677 PDT] coverage rows[1.0-3.0] cols[5.0-5.0]
打印者:
curRange = e.range;
var minRow = curRange.getRow();
var maxRow = curRange.getLastRow();
var minCol = curRange.getColumn();
var maxCol = curRange.getLastColumn();
Logger.log("rows[%s-%s] cols[%s-%s]", minRow, maxRow, minCol, maxCol);
现在...奇怪的是:如果我在所说的列上有一个过滤器,并且我选择只显示1个值,那么我将得出4行(ID为2、5、6和8)。如果我执行此较小范围(4行1列)的副本,然后将其粘贴到工作表中的其他位置,则会得到以下反馈:
[18-08-31 14:15:32:677 PDT] coverage rows[2.0-2.0] cols[5.0-5.0]
是否可以通过onEdit(e){e.range}找出我已编辑的ID?或任何其他可以为我带来值2、5、6和8的解决方案?
答案 0 :(得分:0)
我只想在评论中使用它,但是在那里太混乱了。所以我会写一个答案。
onEdit(e)
仅在您编辑范围时触发,并且e
是已编辑的范围。因此,如果粘贴数据,则将以onEdit(e)
为目的地来触发e
,并且源范围将被“遗忘”。使用onEdit(e)
,无法在触发之前知道自己所做的事情。因此,在onEdit(e)
触发之前,您不能在日志中写入任何内容。在这种情况下,就是您复制数据的范围。
以下是完成您所需操作的一个小技巧:使用脚本复制和粘贴。用这样的东西编写函数
for(i = r;i < r + numRow ;i++) {
if (sheet.getRange("A" + i) matches filter) {// assume that you filter your data based on column A
copy data to destination
write source to log
}
}
,然后将该功能分配到工作表上的某个位置。
每次需要执行工作时,只需要运行功能即可。
虽然还有其他方法可以实现所需的结果,即使用=ARRAYFORMULA(ROW(A1:A1000))
写出一列的行数,并且在复制数据时也复制该列,则可以处理这些值,就好像您正在使用代码中的行号一样。好吧,这很草率,当工作表扩展超过1000行时,您可能需要不时编辑公式。这就是为什么我不建议这样做的原因。但是,如果您可以预测有多少行适合您的工作表,我想这是可以的。.