Google表格脚本-获取复制/粘贴的实际范围

时间:2018-08-31 21:39:27

标签: google-apps-script google-sheets google-apps

我正在为自己编写一个小脚本来帮助我进行一些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的解决方案?

1 个答案:

答案 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行时,您可能需要不时编辑公式。这就是为什么我不建议这样做的原因。但是,如果您可以预测有多少行适合您的工作表,我想这是可以的。.