我使用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不会重新执行execution_appeler_par_html()函数。 我应该使用libraryname.execution_appeler_par_html(),但是这个语法在google.script.run的配置中不起作用
答案 0 :(得分:0)
似乎 google.script.run 无法查看对象内部或自动执行的匿名函数。在我的情况下,将任何代码放在一个对象或IIFE中导致&#34;不是一个函数&#34;控制台中抛出的错误类型。
您可以通过声明一个将在库和对象中调用嵌套方法的函数来解决此问题。
.GS文件
function callLibraryFunction(func, args){
var arr = func.split(".");
var libName = arr[0];
var libFunc = arr[1];
args = args || [];
return this[libName][libFunc].apply(this, args);
}
在JavaScript中,每个对象的行为类似于键值对的关联数组,包括“&#39; this&#39;在这种情况下会指向。虽然两者都是&#39; libName&#39;和&#39; libFunc&#39;是String类型,我们仍然可以使用上面的语法在全局对象中引用它们。 apply()只需在&#39; this&#39;上调用函数,使结果在全局范围内可用。
以下是从客户端调用库函数的方法:
google.script.run.callLibraryFunction("Library.libraryFunction", [5, 3]);
我没有声称这个解决方案是我自己的 - 这是我在Bruce McPherson的网站上看到的一段时间。您可以提出可能更适合您的案例的其他临时解决方案,但我认为这是最普遍的解决方案。