如何让Google Sheets中的自定义函数触发重新计算?
解决方案
方案1:添加虚拟参数+绑定宏快捷键(最稳定)
Google Sheets的自定义函数默认仅在参数发生变化时触发重算,你可以先修改原有函数,增加一个无实际逻辑的虚拟参数即可:
//returns a random letter suitable for use in function notation // 新增dummy参数,无需修改内部逻辑 function ranFunLet(dummy) { var letters = ['a','b','c','d','f','g','h','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z'] var letter = letters[Math.floor(Math.random()*letters.length)]; return letter; }
调用该函数时传入任意单元格作为参数,例如你可以找一个空白单元格(比如Z1)作为触发单元格,函数写为=ranFunLet(Z1)。
接下来创建一个触发重算的宏,代码如下:
function triggerRefresh() { // 给触发单元格写入当前时间戳,触发所有关联的ranFunLet重算 SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("Z1").setValue(new Date().getTime()); }
之后绑定快捷键即可:
- 回到表格界面,点击顶部菜单栏「扩展程序 > 宏 > 导入宏」
- 选择刚写的
triggerRefresh完成导入 - 点击宏列表右侧的三个点,选择「更改快捷键」,设置你需要的按键组合即可。
方案2:无需修改原有函数,直接刷新所有调用单元格
如果你不想改现有函数的调用写法,可以直接写宏遍历所有用到ranFunLet的单元格,强制触发重算,宏代码如下:
function refreshAllRanFunLet() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const allRange = sheet.getDataRange(); const formulas = allRange.getFormulas(); // 遍历所有带公式的单元格 for (let row = 0; row < formulas.length; row++) { for (let col = 0; col < formulas[row].length; col++) { if (formulas[row][col].includes("ranFunLet")) { const cell = allRange.getCell(row + 1, col + 1); const oldFormula = cell.getFormula(); // 清空再写回公式触发重算 cell.clearContent(); SpreadsheetApp.flush(); cell.setFormula(oldFormula); } } } }
按照方案1的步骤将这个宏绑定快捷键即可,按下快捷键就会自动刷新所有用到该自定义函数的单元格。
刷新页面生效的补充设置
如果需要刷新页面就自动重算,你可以将函数调用改为传入NOW()函数作为参数,即=ranFunLet(NOW()),之后点击表格顶部「文件 > 设置 > 计算」,将重算规则调整为「更改时和每分钟」即可,页面刷新时也会自动触发重算。
内容的提问来源于stack exchange,提问作者GMath314
相关产品推荐
相关产品推荐

