我在一家大型组织工作,我们有一些可供多个用户使用的大型 Google 表格(但可能一次最多 7-10 个)。我正在致力于使这张表的一些流程自动化。例如,我正在开发的应用程序脚本之一,我希望用户在将数据输入一行后完成质量检查检查,一旦完成,他们将在其中一个单元格中输入“r”,然后这将打印出来用户的电子邮件地址和查看日期。
问题是,这确实有效。但有时它不适用于某些单元格和某些工作表。有时它根本不起作用,有时又起作用。我检查了谷歌应用程序脚本配额限制,看起来我们没有超出这里的限制。因此,我完全困惑为什么它不起作用,也许是我的代码?
也许还有一种方法可以优化这段代码?如果工作表发生更改,则必须不断更新列索引号,这很烦人。所有工作表(QA)上的列标题都是相同的,所以我考虑使用它作为参考,而不是引用每张工作表和受影响列的索引。
function team_QA(e) {
// Ensure the event object is defined, if false ignore
if (!e) return;
var sheet = e.source.getActiveSheet();
var sheetName = sheet.getName();
// Define the columns to watch for each sheet
var sheetConfigurations = {
'Paid': 123, // Column DS
'Dis': 137, // Column EH
'Review': 115, // Column DK
'Third': 115, // Column DK
'Lead: 119 // Column DO
};
// Check if the edited sheet is one of the specified sheets
if (!sheetConfigurations.hasOwnProperty(sheetName)) {
return;
}
// Get the column to watch for the current sheet
var columnToWatch = sheetConfigurations[sheetName];
// Get the range of the cell that was edited
var range = e.range;
var column = range.getColumn();
// Check if the edited cell is in the column to watch and contains "R"
if (column == columnToWatch && range.getValue() == "r") {
// Get the user's email and current date
var userEmail = Session.getActiveUser().getEmail();
var currentDate = new Date();
// Format the date as desired
var formattedDate = Utilities.formatDate(currentDate, Session.getScriptTimeZone(), "MM-dd-yy");
// Combine the email and date
var reviewInfo = userEmail + " reviewed on " + formattedDate;
// Set the review information in the edited cell
range.setValue(reviewInfo);
}
}
长期以来,人们都知道编辑触发器可能不会针对所有编辑激活。官方文档已更新以反映这一点:
来自简单触发器
注意:onEdit() 触发器最多只能对 2 个触发事件进行排队。
通过快速编辑多个单元格,可以在具有 onEdit 简单触发器的简单工作表中注意到此行为,即
准备工作
创建一个新电子表格并添加以下简单触发器。它将时间戳添加到编辑范围左上角单元格右侧的第一个单元格。
function onEdit(e){
e.range.offset(0, 1).setValue(new Date());
}
可安装的触发器也可能由于队列限制而错过事件,因为它们“尽最大努力”工作(引用源待定)。
建议
尽可能设计电子表格,以避免用户快速进行多次编辑。 如果不可能,请采取措施处理错过的触发激活,包括对电子表格用户进行有关这些措施的相应培训。