如何在Google Apps Script中强制Google Sheets重新计算INDIRECT公式?
解决Google Sheets创建新工作表后INDIRECT函数不刷新的问题
Google Sheets的INDIRECT函数不会像Excel那样,在新增引用的工作表后自动触发重新计算,下面是几个直接可用的解决办法:
方法1:脚本模拟「剪切粘贴」公式
既然手动剪切粘贴能触发计算,我们可以在生成记分卡的脚本末尾加入代码,自动完成这个操作。假设你的汇总公式在「汇总」表的B2到B100区域,代码如下:
// 放在生成记分卡函数的最后调用 function refreshIndirectCells() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const summarySheet = ss.getSheetByName("汇总"); // 根据你的实际公式范围调整此区域 const targetRange = summarySheet.getRange("B2:B100"); // 保存原始公式 const originalFormulas = targetRange.getFormulas(); // 清空单元格内容 targetRange.clearContent(); // 同步脚本更改到服务器 SpreadsheetApp.flush(); // 重新写入公式,触发计算 targetRange.setFormulas(originalFormulas); }
方法2:用辅助单元格触发重新计算
给INDIRECT公式添加一个无意义的依赖项,比如在汇总表找个空白单元格(如Z1),修改你的求和公式:=SUM(INDIRECT("'"&A2&"'!C:C")) + $Z$1*0
然后在生成记分卡的脚本末尾,更新Z1的值来触发公式重算:
function triggerRecalc() { const ss = SpreadsheetApp.getActiveSpreadsheet(); // 写入当前时间戳,确保每次值都不同 ss.getRange("Z1").setValue(new Date().getTime()); SpreadsheetApp.flush(); }
这个方法不用修改公式所在单元格,更隐蔽。
补充说明
SpreadsheetApp.flush()之所以没用,是因为它仅同步脚本的修改到服务器,并不会触发公式的重新计算逻辑。INDIRECT属于半易失性函数,只有在编辑单元格、打开表格或依赖项变化时才会重算,脚本创建工作表不属于这些触发条件。
内容的提问来源于stack exchange,提问作者gfunkdave
相关产品推荐
相关产品推荐

