更改触发器不是 运行 脚本更改

On Change Trigger Not Running Script On Change

我有一个脚本可以在新数据行添加到相关传播sheet时更新命名范围:

function updateNamedRanges() {

      // get to the right place
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('ga weekly data pull');

      //now update the named ranges if they have changed in length
       var openEnded = ["gaCampaign", "gaMedium", "gaSource", "gaSubscriptions", "gaUsers", "gaWeek"];

      for(i in openEnded) {
        var r = ss.getRangeByName(openEnded[i]);
        var rlr = r.getLastRow();
        var s = r.getSheet();
        var slr = s.getMaxRows();
        if(rlr==slr ) continue; // ok as is-skip to next name
        var rfr = r.getRow();
        var rfc = r.getColumn();
        var rnc = r.getNumColumns();
        var rnr = slr - rfr + 1;
        ss.removeNamedRange(openEnded[i]);
        ss.setNamedRange( openEnded[i], s.getRange(rfr, rfc, rnr, rnc ));
      }   
      sheet.getRange("D2").setValue(0); // this gets all the formulas in the sheet to update - just changing any cell
  }

然后,在 Aps 脚本编辑器中,我转到资源 > 当前项目触发器 > 运行 updateNamedRanges > From Spreadsheet > On change.

现在,如果我手动添加一行数据,脚本就会运行 - 太棒了!

但我正在使用 Google Analytics 插件提取数据。当数据长度超过 sheet 时,此插件会扩展相关选项卡。但是当这种情况发生时,脚本不会更新。

这里有什么我可以做的吗?

作为备用,我在考虑是否可以弄清楚如何让 GAS 从 sheet 的底部添加一行可能会这样做,但这似乎是一种解决方法。在我走那条路之前有没有更好的方法?

如您所知,应用脚本触发器仅在应用脚本进行更改时才起作用。是的,它很蹩脚。如果 api 应用程序脚本外部修改了 sheet,它们将不会触发。

您唯一的选择是使用时间触发器来检测更改并再次处理整个 sheet(因为您不知道发生了什么更改)。更有效地实现这一点的一种方法是记住(在脚本 属性 中)触发器的最后修改日期。然后 1 分钟时间触发器检查修改日期现在是否大于上次保存的日期。如果是这样处理整个 sheet.

运行 它在每分钟运行一次的时间触发器上运行,直到 Google 解决了未捕获更改事件的问题 and/or 无法定义开放式命名范围.

编辑 运行 打开脚本

防止 sheet 在每次打开时重新计算,无论是否需要。

循环上方的位置:

var recalc = false;

在下面的循环中 if(rlr==slr ) continue;

recalc = true;

仅在必要时重新计算 sheet:

if(recalc) {sheet.getRange("D2").setValue(0)};