我的代码有时运行,有时不运行

问题描述 投票:0回答:1

我在一家大型组织工作,我们有一些可供多个用户使用的大型 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);
  }
}
javascript google-sheets google-apps-script triggers reliability
1个回答
0
投票

长期以来,人们都知道编辑触发器可能不会针对所有编辑激活。官方文档已更新以反映这一点:

来自简单触发器

注意:onEdit() 触发器最多只能对 2 个触发事件进行排队。

通过快速编辑多个单元格,可以在具有 onEdit 简单触发器的简单工作表中注意到此行为,即

准备工作

创建一个新电子表格并添加以下简单触发器。它将时间戳添加到编辑范围左上角单元格右侧的第一个单元格。

function onEdit(e){
  e.range.offset(0, 1).setValue(new Date());
}
  1. 按 R 编辑 A1,然后按 Enter。 这会将编辑事件排队并使 A2 成为当前单元格。
  2. 按 R 立即编辑 A2,然后按 Enter。 这会将编辑事件排队并使 A3 成为当前单元格。
  3. 继续编辑当前单元格,假设十次。请确保尽快完成。
  4. 稍等一下,让排队的编辑事件激活 onEdit 简单触发器。
    • 查看 B 列。并非 B 列中的所有单元格都有时间戳。
    • 查看执行页面。在那里,您会注意到执行 onEdit 触发器的时间小于已编辑单元格的数量。

可安装的触发器也可能由于队列限制而错过事件,因为它们“尽最大努力”工作(引用源待定)。

建议

尽可能设计电子表格,以避免用户快速进行多次编辑。 如果不可能,请采取措施处理错过的触发激活,包括对电子表格用户进行有关这些措施的相应培训。

© www.soinside.com 2019 - 2024. All rights reserved.