【问题标题】:onEdit installable trigger not firing when defining variable through array object通过数组对象定义变量时,onEdit 可安装触发器未触发
【发布时间】:2017-11-14 14:09:16
【问题描述】:

嘿嘿! 我有一个应该在编辑时触发的脚本。 onEdit() 作为一个简单的触发器对我来说不是一个选项,因为脚本需要授权。使用编辑器设置可安装触发器时,触发器仅在手动定义特定变量时触发,而不是在使用数组定义时触发。 由于我不知道问题可能出在哪里(我试图逐部分注释掉代码,但在进入最后一部分时它总是最终无法正常工作。

        function myFunction() {
     //Source Sheet for different sheets
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var activeSheet = ss.getActiveSheet();
      var activeRange = ss.getActiveRange();
      var activeRow = activeRange.getRowIndex();
      var CategoryValues = ss.getSheetValues(activeRow, 4, 1, 14);
      var ID = activeSheet.getRange(activeRow,2).getValue();
      var red = '#e06666'

  // Defining the sourceWeekNumber in the sourceSheet with a while loop
      var sourceWeeks = activeSheet.getRange(1,1,activeRow).getValues();
      sourceWeeks.reverse();
      var sourceWeekColor = activeSheet.getRange(1,1,activeRow).getBackgrounds();
      sourceWeekColor.reverse();
      var sourceWeekNumber = [];
      var sourceWeekIndex=1;
        while (sourceWeekColor[sourceWeekIndex-1]!=red) {
          if (sourceWeekColor[sourceWeekIndex]==red) {
          sourceWeekNumber.push(sourceWeeks[sourceWeekIndex])
          }
          sourceWeekIndex++;
      }

      //Target sheet is always mastersheet
      var ts = SpreadsheetApp.openById('ID').getSheetByName('mastersheet');

      //Finding the right spot in mastesheet
      //Validate the weeknumber
      var validWeek = ts.getRange(2, 1, ts.getLastRow()).getValues();
      var rowIndex = [];

  //-----> var sourceWeekNumber = 'v50'; <----- 
  // When defining this variable manually, onEdit works fine.
  // When defining sourceWeek with the while loop above, the onEdit does not trigger.

      // Find the right week and it's row in the mastersheet
      var validWeekIndex = 1; 
      while (validWeek[validWeekIndex] != sourceWeekNumber) {
        if (validWeek[validWeekIndex] == sourceWeekNumber) {
        var validID = ts.getRange(validWeekIndex+3,2, ts.getLastRow()).getValues();
        rowIndex.push(validWeekIndex);
        }
        validWeekIndex++;
      }
    }

我尝试了不同的方法,总是使用 Logger.log() 或 Browser.msgBox() 来尝试识别问题。有什么想法或解决方法吗?我已经坚持了3天了,找不到任何解决方案。 我也准备了一个样本表,如果需要,我可以编辑它。 提前致谢!

编辑: 这是样本表的链接:https://docs.google.com/spreadsheets/d/1xCZur6gpfsQFPtwKcTl0XPPfG8zlTqGVlm1GZZ8X1xM/edit?usp=sharing

【问题讨论】:

  • 代码的一个问题是您使用range.getValues() 调用填充的数组是二维的,但您将它们视为一维的。代码排序是有效的,因为您有 Nx1 数组——例如,它不适用于 Nx2。另外,执行脚本对被触发的脚本有什么看法?也许你应该分享样本表。
  • 我现在已经添加了样品表链接。代码似乎工作正常,我知道一些缺陷可能会导致后期出现问题,但执行记录和日志都没有说明脚本被触发的任何内容。该脚本根本不运行。我启用了电子邮件通知,但也没有。

标签: google-apps-script google-sheets


【解决方案1】:

我想通了。 这当然不是触发因素,而是让我认为是不同的因素:

  1. 触发通知:我确定我将通知设置为即时通知,但它设置为每天下午 4 点。这就是我没有收到失败通知的原因。
  2. while 循环:因为 while 循环无法识别一维数组中的值何时出现在二维数组中,所以它一直运行并超时。因此脚本运行 5 分钟,无法取消。
  3. 我了解到 Google 为触发器获得了 30 分钟/天的脚本运行时间配额,这就是为什么我只能在配额满之前运行 6 个失败的脚本,并且脚本直到第二天才能运行我没有意识到这是一个问题。

编辑:对于将来的参考,我只是使用 sourceWeekNumber.toString() 来使其与另一个数组匹配,比较字符串而不是数组内的对象。

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    相关资源
    最近更新 更多