Google Sheets自定义菜单向函数传参时提示找不到脚本函数报错排查
报错原因
- Google Apps Script的自定义菜单触发函数时,只会检索全局作用域下显式可访问的顶级函数,你代码中在
forEach循环内给this赋值动态函数的逻辑存在两个问题:- V8运行时下的
forEach普通函数回调中,this默认指向undefined(严格模式规则),你赋值的this[flag]根本没有挂载到全局作用域,导致菜单调用时找不到test1、test2对应的函数 - 即使正确挂载到全局,若闭包变量捕获处理不当,也会出现所有菜单都调用最后一个参数的问题
- V8运行时下的
修复方案
直接将动态生成的函数挂载到全局对象globalThis上即可,同时利用forEach迭代的参数作用域规避闭包陷阱,修复后的代码如下:
const flags = {}; flags["test1"] = "data"; flags["test2"] = "data"; function onOpen(){ var ui = SpreadsheetApp.getUi(); Object.keys(flags).forEach(function (flag) { // 把动态函数挂载到全局对象globalThis上 globalThis[flag] = function () { addToFlagInteract(flag); } }); var flagMenu = ui.createMenu('Flag'); var flagSubMenu = ui.createMenu('Add to Flag'); Object.keys(flags).forEach(function (flag) { flagSubMenu.addItem(flag, flag); }); flagMenu.addSubMenu(flagSubMenu).addToUi(); } function addToFlagInteract(flag){ // 此处编写业务逻辑 }
内容的提问来源于stack exchange,提问作者nikko.guy
相关产品推荐
相关产品推荐

