【问题标题】:Google sheets scripting - getting the actual range for a copy/pasteGoogle 表格脚本 - 获取复制/粘贴的实际范围
【发布时间】:2026-02-01 17:15:02
【问题描述】:

我正在为自己编写一个小脚本来帮助我进行一些数据验证,但我遇到了一个问题:

给定 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)。如果我复制这个较小的 Range(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 的解决方案?

【问题讨论】:

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


【解决方案1】:

我想在评论中使用它,但是那里太乱了。所以我会写一个答案。

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 行时,您可能需要不时编辑公式......这就是我不推荐它的原因。但如果你能预测多少行对你的工作表有好处,我想没关系..

【讨论】:

    最近更新 更多