当我使用UiApp在电子表格中创建脚本时,我有一个带有服务器处理程序的按钮,该按钮以下划线结尾。如果我从电子表格中运行脚本然后它工作正常,但如果我将此项目添加到另一个工作表并运行它然后我得到一个错误说找不到脚本功能。在代码中使用以下划线结尾的函数没有问题,它似乎就是从服务器处理程序调用它们时。
要复制:
制作新的电子表格
插入代码:
function buildForm() {
var app = UiApp.createApplication();
// show that calling a function ending in underscore works
var labelText = getLabelText_();
app.add(app.createLabel(labelText).setId("label"));
var handler = app.createServerHandler("clickHere_");
app.add(app.createButton("Click Here",handler));
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.show(app);
}
// This is just to show that underscore on the end works as long as it is not a server handler
function getLabelText_() {
return "label text";
}
// called from server handler
function clickHere_(e) {
var app = UiApp.getActiveApplication();
app.getElementById("label").setText("You clicked there");
return app;
}
运行代码并看到它按预期工作
创建另一个电子表格,将第一个电子表格添加为库并将其命名为MyCode。确保您已保存等版本等。
在新电子表格中,插入代码:
function runIt() {
MyCode.buildForm()
}
运行此代码,请注意getLabelText_()工作正常并创建了UI,但是当您按下按钮时,将出现找不到函数的错误。
如果我从clickHere_(e)中删除下划线并相应地更改服务器处理程序,那么它可以正常工作。
是从服务器处理程序调用的所有函数末尾删除下划线的唯一解决方案吗?
答案 0 :(得分:2)
这是google apps脚本库的通缉令:
https://developers.google.com/apps-script/guide_libraries#writingLibrary
这是为了实现私人功能。
编辑:
正如文档中所说:如果您希望脚本的一个或多个方法不可见(也不是 对于您的库用户,您可以使用结束方法的名称 一个下划线。例如,myPrivateMethod _()
作为“库函数”,function buildForm()
可以调用该库中的function getLabelText_()
。
但是您无法使用库直接从脚本中调用function getLabelText_()
。您的脚本都无权直接致电function clickHere_(e)
因此,当用作服务器处理程序时,函数clickHere_(e)
从脚本调用而不是从库中调用,并且它将不起作用。要调用此函数,您应该删除它末尾的“_”并以这种方式调用它:libraryName.libraryFunction();