如何使onEdit()触发器函数应用于多个工作表



我有一个正在处理的谷歌表格。

我有一个脚本,当我在第一个选项卡上更新column A时,它会用时间戳填充column B。但是我需要它在第二个选项卡上做同样的事情,但我无法让它在那里工作。我需要更改什么?

我当前使用的脚本是:

function onEdit(e) {
    var sheetToWatch= 'Wrong Grading',
        columnToWatch = 1,
        columnToStamp = 2;            //change all of these to your needs
    if (e.range.columnStart !== columnToWatch
      || e.source.getActiveSheet().getName() !== sheetToWatch
      || !e.value)
        return;
    e.source.getActiveSheet()
        .getRange(e.range.rowStart, columnToStamp)
        .setValue(new Date());
}

对于未来的读者,Paul 问题中的代码片段来自 Google 文档帮助论坛上的代码,其中包括详细的逐行解释。

该函数使用变量sheetToWatch来标识onEdit()函数关注的一个工作表(也称为"选项卡")。通过以下比较验证了这一点:

|| e.source.getActiveSheet().getName() !== sheetToWatch

。如果当前触发事件的源不匹配,则该函数将退出而不执行任何操作。

我需要更改什么?如果您希望此功能适用于电子表格中的所有工作表,则可以完全消除此检查:

function onEdit(e) {
    var columnToWatch = 1,
        columnToStamp = 2;               //change all of these to your needs
    if (e.range.columnStart !== columnToWatch
      || !e.value)
        return;
    e.source.getActiveSheet()
        .getRange(e.range.rowStart, columnToStamp)
        .setValue(new Date());
}

如果要让onEdit()在一组工作表上运行,则可以更改上面的比较,以检查是否在工作表名称数组中找到当前工作表的名称。这将更改与此的比较:

  || sheetsToWatch.indexOf( e.source.getActiveSheet().getName() ) === -1 

您可以在此处了解有关indexOf()方法的更多信息。不过,它所做的是获取事件触发器源表的名称,在 sheetsToWatch 数组中找到它,并返回找到的索引。如果工作表未出现在数组中,则indexOf()返回-1

生成的函数为:

function onEdit(e) {
    var sheetsToWatch= ['Wrong Grading',
                        'Something Else'],
        columnToWatch = 1,
        columnToStamp = 2;            //change all of these to your needs
    if (e.range.columnStart !== columnToWatch
      || sheetsToWatch.indexOf( e.source.getActiveSheet().getName() ) === -1 
      || !e.value)
        return;
    e.source.getActiveSheet()
        .getRange(e.range.rowStart, columnToStamp)
        .setValue(new Date());
}

最新更新