脚本来总结数据没有更新
我有一个时间表数据的Google电子表格; 它每个月都有一个表格,每个表格有六个列块,每个客户端一个块。
我创build了一个汇总表,获取每个客户端的总数并将其显示在列表中:
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; }
然后,我刚刚在包含=getClientTotals($C$7,$C$8)
汇总表中添加了一个单元格,该单元格传递了月份的表名和每个客户端的列数(在“模式”修改的情况下)。
这一切工作正常,但是,它不会更新源数据更改时。 我添加了onEdit
触发器; 没有快乐。 它会更新,如果你去脚本编辑器并点击保存,但没有用。 我错过了什么吗?
您错过了挑剔的caching错误function。 它以这种方式工作:
谷歌认为你所有的自定义函数只依赖于它们的参数值直接返回结果(你可以select依赖于其他的静态数据)。
有了这个先决条件,他们只有在参数改变时才能评估你的函数。 例如
假设我们在单元格B1上有文本“10”,然后在其他一些单元格上键入=myFunction(B1)
myFunction将被评估并且检索结果。 然后,如果将单元格B1的值更改为“35”,则将按照预期重新评估自定义,并正常检索新的结果。 现在,如果将单元格B1再次更改为原始“10”,则不会重新评估,原始结果将立即从caching中检索出来。
因此,当您使用表格名称作为参数来dynamic获取并返回结果时,您正打破caching规则。
不幸的是,没有这个惊人的function,你不能拥有自定义function。 因此,您必须将其更改为直接接收值,而不是表名,或者不要使用自定义函数。 例如,你可以在你的脚本上有一个参数来告诉汇总应该去的地方,并且每当总的改变时, onEdit
更新它们。
解决高速caching问题的另一种方法。
在你的方法中有一个虚拟variables。 通过
Filter(<the cell or cell range>,1=1)
作为该参数的值。
例如
=getValueScript("B1","B4:Z10", filter(B4:Z10,1=1))
没有使用filter的输出。 但是它向电子表格显示此公式对B4:Z10范围敏感。
我有一个类似的问题,创造一个工作仪表板。 上面的Chamil解决scheme(即使用Sheet的Filter函数作为值传递给函数中的虚拟variables)工作得很好,尽pipe最近Arsen发表了一些评论。 在我的情况下,我正在使用一个函数来监视范围,并且不能使用相同范围的filter,因为它创build了一个循环引用。 所以我只是有一个单元格(在我的情况下E45在下面的代码),其中我改变了数字,我想我的function更新:
=myFunction("E3:E43","D44",filter(E45,1=1))
正如Chamil所指出的那样,脚本中并没有使用filter:
function myFunction(range, colorRef, dummy) { variable 'dummy' not used in code here }
你可以做的是在电子表格的某个地方设置另一个单元格,每次添加一个新表单时都会更新这个单元格。 确保它不会更新每一个变化,但只有当你想要做计算(在你的情况下,当你添加一个表)。 然后,您将此单元格的引用传递给您的自定义函数。 如前所述,自定义函数可以忽略这个参数。
鉴于Henrique Abreu解释的这个特性,你可以尝试一下现成的电子表格函数QUERY ,SQL喜欢的查询是我经常使用的原始数据,并且把数据作为摘要获取到不同的选项卡,结果数据被更新实时更改原始数据。
我的build议是基于这样一个事实,即您的脚本没有进行诸如URL获取等工作,只是数据工作,因为没有实际的数据读取,我无法给出一个精确的QUERY解决scheme。
关于Henrique Abreu提到的cachingfunction (我没有足够的声望直接在他的回答下发表评论),我做了testing,发现:
-
看起来没有caching工作,testingfunction的脚本如下所示:
函数加法器(base){Utilities.sleep(5000); 返回基地+10; }
通过调用一个单元格在表单中应用该自定义函数加法器(),然后每次看到加载消息和总计时间超过5秒钟,然后将该单元格的值更改和返回。 这可能与这个GAS问题中提到的更新有关:
这个问题现在已经解决了。 新表格中的自定义function现在可以识别上下文,并且不会积极地caching值。
-
本主题中提到的问题依然存在,我的testing表明,Google表格每次只重新计算一次自定义函数
- 直接由函数调用的值被改变。
函数getCellValue(sheetName,row,col){var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getSheetByName(sheetName); 返回sh.getRange(row,col).getValue(); }
黄色单元格中任何值的更改将导致重新计算自定义函数; 真正的数据源值变化被函数忽略。- 包含单元格位置的函数在表单中被更改。 恩。 插入/删除上面或左侧的行/列。
正如@Brionius所说的那样,在这个function上加了一个额外的动力。 如果你现在使用()你可能有超时的问题使更新慢一点点…
cell A1 = int(now()*1000) cell A2 = function(args..., A1)