更改触发器未运行脚本更改

时间:2015-05-16 16:37:09

标签: google-apps-script google-sheets

我有一个脚本可以在将新数据行添加到相关电子表格时更新命名范围:

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>来自电子表格>在改变。

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

但是,我正在使用Google Analytics添加数据。当数据长度超过工作表时,此附加扩展了有问题的选项卡。但是当发生这种情况时,脚本不会更新。

我能在这做什么吗?

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

2 个答案:

答案 0 :(得分:5)

正如您所发现的,应用脚本触发器仅在应用脚本执行更改时才起作用。是的,它的跛脚。如果应用程序脚本之外的api修改了工作表,则它们不会触发。

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

答案 1 :(得分:1)

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

已修改为在打开

上运行脚本

不管是否需要,每次打开时都要重新计算工作表。

在循环之上:

var recalc = false;

if(rlr==slr ) continue;

下面的循环中
recalc = true;

仅在必要时重新计算工作表:

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