更改触发器不是 运行 脚本更改
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)};
我有一个脚本可以在新数据行添加到相关传播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)};