当我放置全局变量时,触发器 onOpen() 不起作用



当我把全局变量触发onOpen()不工作。你知道有什么解决办法吗?谢谢你!

/**variables globales */
var elLibro = SpreadsheetApp.openById("1pfbd7oziXmBTsOh5RhfvhsjW5wU6QF9suN7SNrE8rew");
var laHoja = elLibro.getSheetByName("Cuotas");//obtiene la hoja
var laHojaTablaFinal = elLibro.getSheetByName("Tabla final");
function onOpen(e) {
// Add a custom menu to the spreadsheet.
SpreadsheetApp.getUi() // Or DocumentApp, SlidesApp, or FormApp.
.createMenu('Custom Menu')
.addItem('First item', 'menuItem1')
.addToUi();
}

当我删除我的全局变量触发onOpen工作良好。我正在尝试添加一个自定义菜单到电子表格。

onOpen(e)函数是一个简单的触发器,将在每次打开电子表格时自动运行。在这种情况下,需要授权的API方法不可用。

当电子表格调用脚本函数时,在函数运行之前求值全局函数。在onOpen(e)上下文中,SpreadsheetApp.openById()会因为缺乏授权而出错,onOpen(e)永远没有机会运行。

解决这个问题的一种方法是将全局变量放入一个函数中,比如getSettings_(),它返回一个包含经常使用的变量的对象,并从使用这些值的函数中调用它。它可以是这样的:
let settings;
function getSettings_() {
if (settings) {
return settings;
}
settings = {
elLibro: SpreadsheetApp.openById("1pfbd7oziXmBTsOh5RhfvhsjW5wU6QF9suN7SNrE8rew"),
laHoja: elLibro.getSheetByName("Cuotas"),
laHojaTablaFinal: elLibro.getSheetByName("Tabla final"),
};
return settings;
}
function someFunction(someParameter) {
const settings = getSettings_();
const someValue = settings.laHoja.getRange('A1');
console.log(someValue);
}
function onOpen(e) {
// ... does not call getSettings_()
// ...
}

这种模式的好处是,需要这些全局变量的函数可以很容易地获得它们,而不需要这些全局变量的函数不需要获得它们,从而运行得更快。

settings只设置一次。当多个函数依次调用getSettings_()时,第一次调用填充settings对象,随后的调用只获取对该对象的同一副本的引用。对settings可能的运行时修改可以被同一运行时实例中的所有函数看到。

仅在需要时使用全局变量:

const gobj={get init(){delete this.init;this.globals=getGlobals();this.init=PropertiesService.getScriptProperties().getProperties();}};
readInit();
function readInit() {
gobj.init;
}

使用延迟加载

最新更新