Google apps script 是否可以通过模块';s函数作为电子表格应用程序的函数名';什么菜单?

Google apps script 是否可以通过模块';s函数作为电子表格应用程序的函数名';什么菜单?,google-apps-script,Google Apps Script,我有这样的代码: MyCompany = (MyCompany || {}); MyCompany.init = function () { Logger.log('init'); }; function onOpen() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var menus = [{ name: "Init", functionName: 'how

我有这样的代码:

MyCompany = (MyCompany || {});
MyCompany.init = function () {
    Logger.log('init');  
};

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: 'how to call MyCompany.init without creating function?'
    }];
    spreadsheet.addMenu("Test", menus);
};
MyCompany = (MyCompany || {});
MyCompany.init = function () {
    Logger.log('init');  
};

function callInit() {
    MyCompany.init();
}

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: 'how to call MyCompany.init without creating function?'
    }];
    spreadsheet.addMenu("Test", menus);
};

是否可以在不创建其他函数的情况下调用MyCompany.init?

恐怕不可能。应在全局范围内定义在
functionName
参数中使用的函数名称。即使对象是在全局范围内定义的,也不能在菜单中使用其函数

官方脚本参考中没有说明它(也许是,但它隐藏得很好),但是可以通过一些简单的测试来证明,比如在不同范围之间移动函数,看看脚本是否仍然有效

这里(我想)你能做的最好的事情就是创建一个全局函数,它将调用
MyCompany.init
,如下所示:

MyCompany = (MyCompany || {});
MyCompany.init = function () {
    Logger.log('init');  
};

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: 'how to call MyCompany.init without creating function?'
    }];
    spreadsheet.addMenu("Test", menus);
};
MyCompany = (MyCompany || {});
MyCompany.init = function () {
    Logger.log('init');  
};

function callInit() {
    MyCompany.init();
}

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: 'how to call MyCompany.init without creating function?'
    }];
    spreadsheet.addMenu("Test", menus);
};
这样,名称空间组织将保持不变