用于汇总数据未更新的脚本

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并在总计更改时更新它们.

  • 嗯,这很烦人,但谢谢你的回答!我通过向函数添加一个虚拟参数得到了一个令人讨厌的解决方法;如果我随后传递一个单元格引用,我可以通过增加该单元格中的数字来强制刷新数据。我不认为我可以创建一个刷新按钮,只需单击一下即可执行此操作,是吗?那很好,它不需要真的是自动的,只需简单明了即可。 (2认同)