Whe*_*ism 14 google-apps google-sheets google-apps-script custom-function
我有一张时间表数据的Google电子表格; 它每个月都有一张表,每张表有很多六个列块,每个客户一个块.
我创建了一个摘要表,其中包含每个客户的总数并将其显示在列表中:
function getClientTotals(sheetname, colcount)
{
colcount = colcount ? colcount : 6;
var res;
var ss = SpreadsheetApp.openById('myid_goes_here');
if(ss)
{
res = [];
var totrow = ss.getRange(sheetname + '!A1:ZZ1').getValues()[0];
for(var i = 0; i < totrow.length; i += colcount)
{
res.push([totrow[i], totrow[i + colcount - 1]]);
}
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
然后我在我的摘要表中添加了一个单元格,=getClientTotals($C$7,$C$8)其中包含月份工作表名称和每个客户端的列数(如果是"模式"修改).
这一切都正常,但是,当源数据发生更改时,它不会更新.我添加了一个onEdit触发器; 没有快乐.如果您转到脚本编辑器并点击"保存",它会更新,但这没有用.我错过了什么吗?
Hen*_*reu 37
您错过了挑剔的缓存错误功能.它以这种方式工作:
Google认为所有自定义函数仅直接依赖于其参数值来返回其结果(您可以选择依赖于其他静态数据).
鉴于此先决条件,他们只能在参数更改时评估您的函数.例如
假设我们在单元格B1上有文本"10",然后在我们键入的其他单元格上 =myFunction(B1)
将评估myFunction并检索其结果.然后,如果将单元格B1值更改为"35",将按预期重新评估自定义并正常检索新结果.现在,如果再次将单元格B1更改为原始"10",则无法重新评估,将立即从缓存中检索原始结果.
因此,当您使用工作表名称作为参数来动态获取它并返回结果时,您将破坏缓存规则.
不幸的是,没有这个惊人的功能,你就无法拥有自定义功能 因此,您必须将其更改为直接接收值,而不是表单名称,或者不使用自定义函数.例如,您可以在脚本上有一个参数,告诉摘要应该去哪里,onEdit并在总计更改时更新它们.
| 归档时间: |
|
| 查看次数: |
20737 次 |
| 最近记录: |