我用Google App Script实现了库,我在使用google.script.run从库中调用函数时遇到了一些困难。
下面是我的图书馆的代码:
Code.gs
function ShowSideBar() {
var html = HtmlService.createTemplateFromFile('Index_librairie').evaluate()
.setTitle('Console de gestion')
.setWidth(300);
SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
.showSidebar(html);
}
function execution_appeler_par_html(){
Logger.log("execution_appeler_par_html");
}
Index_librairie.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
google.script.run.withSuccessHandler(work_off).execution_appeler_par_html();
function work_off(e){
alert(e);
}
</script>
</head>
<body>
test de ouf
</body>
</html>
下面是我的电子表格,使用图书馆:Code.gs
function onopen() {
lbrairietestedouard.ShowSideBar();
}
Google.script.run 没有reconize execution_appeler_par_html()函数。我应该使用libraryname.execution_appeler_par_html(),但这个语法在www.example.com的配置中不起作用google.script.run
4条答案
按热度按时间disho6za1#
似乎google.script.run无法查看对象或自执行匿名函数的内部。在我的情况下,将任何代码放入对象或IIFE中都会导致控制台中抛出“不是函数”类型的错误。
您可以通过声明一个函数来解决这个问题,该函数将调用库和对象中的嵌套方法。
.GS档桉
在JavaScript中,每个对象的行为都像一个键-值对的关联数组,包括在这个场景中'this'将指向的全局对象。尽管'libName'和'libFunc'都是String类型,我们仍然可以通过使用上面的语法在全局对象中引用它们。apply()只需调用'this'上的函数,使结果在全局范围内可用。
下面是如何从客户端调用库函数:
我并不认为这个解决方案是我自己的--这是我不久前在布鲁斯麦克弗森的网站上看到的。你可以想出其他更适合你的情况的特别解决方案,但我认为这个是最通用的。
kt06eoxx2#
注意到在HTML代码中从www.example.com调用库时出现了同样的问题google.script.run。下面是我使用的解决方法:
图书馆侧:图书馆
ADDON SIDE(需要库“aLibrary”)
HTML
我喜欢这种解决方法,因为我可以清楚地查看和组织我的函数名称,并且如果我将函数直接带入addOn项目,则不需要更改HTML代码,一旦开发变得满意。
只有一件事我还没有尝试:处理参数和返回值...
我希望这个贡献是不是愚蠢的,请原谅我我很业余…
i34xakig3#
经过长时间的工作,我发现任何使用
google.script.run
从库中调用的函数必须同时存在于主脚本和库脚本中。函数必须至少在主脚本中声明,而实现和参数并不重要。实现将在您的库中。如果主脚本不包含函数的名称,将出现错误<your function> is not a function
。既然如果每个函数都需要存在于main函数中,那么拥有一个库就没有意义了,@Anton Dementiev提供的解决方案将被用作解决方案。假设你的库中有一个名为
testFunc
的函数,你可以使用以下方法调用它:其中库具有以下功能:
主脚本有这样的声明:
谷歌必须纠正这种愚蠢的行为
e4yzc0pl4#
这个问题,据我所知,是由于hoisting-看到这个答案here。
不同之处在于,functionOne是一个函数表达式,因此仅在到达该行时定义,而functionTwo是一个函数声明,并且在执行其周围的函数或脚本时立即定义(由于提升)。
显然,
google.script.run
在 dependent 脚本中的任何变量声明之前的级别执行。所以,是的,当在库中使用google.script.run.myWhateverCallback()
形式的回调时,依赖脚本必须将该回调定义为可挂起的函数,而不是在变量/常量声明中。