i用Google App脚本实现库,我很难使用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_libraire.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的配置中不起作用
看来 google.script.run 无法在对象内看或自我执行匿名函数。就我而言,将任何代码放入对象或IIFE中的任何代码都不是函数。扔在控制台中的错误类型。
您可以通过声明单个函数来解决此问题,该功能将在库和对象中调用嵌套方法。
.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中,每个对象的行为都像键值对的关联数组,包括在这种情况下将指向"此"的全局对象。尽管" libname"one_answers" libfunc"都是字符串类型,但我们仍然可以使用上述语法在全局对象中引用它们。apply((只需在" this"上调用函数,使结果在全局范围中可用。
这是您从客户端调用库函数的方式:
google.script.run.callLibraryFunction("Library.libraryFunction", [5, 3]);
我不声称这个解决方案是我自己的 - 这是我不久前在布鲁斯·麦克弗森(Bruce McPherson(的网站上看到的。您可以提出其他可能更适合您的案件的临时解决方案,但我认为这是最普遍的。
在HTML代码中从Google.script.run发动库也注意到了同样的问题。这是我使用的解决方法:
图书馆侧:alibrary
function aFunction(){
//code...;
}
附加侧(需要图书馆" alibrary; quot"(
function aFunction(){
aLibrary.aFunction();
}
html
<input type="button" value="run aFunction" onclick="google.script.run.aFunction()" />
我喜欢解决方法,因为我要清楚地了解和组织我的功能名称,并且如果我将功能直接带入addon项目,就不需要更改HTML代码。
唯一我还没有尝试的事情:处理争论并返回值....
我希望这种贡献不是愚蠢的,请原谅我我很业余...
经过很长时间的工作,我发现您使用 google.script.run
从库中调用的任何功能都必须在主脚本和库脚本中都存在。该功能至少必须在主脚本中声明,而实现和参数并不重要。实施将在您的库中。如果主脚本不包括函数的名称,则将出现错误<your function> is not a function
。
现在没有库的含义,如果每个功能都需要在主函数中存在,则@anton dementieev提供的解决方案将用作解决方法。假设您的库中有一个名为testFunc
的函数,可以使用以下方法调用它:
google.script.run.callLibraryFunction("testFunc", [5, 3]);
库具有此功能的地方:
function callLibraryFunction(func, args) {
args = args || [];
return this[func].apply(this, args);
}
主脚本具有此声明:
function callLibraryFunction() {
}
Google必须修复此愚蠢的行为
据我所知,这个问题是由于提升 - 在此处查看此答案。
区别在于函数蛋白是函数表达式,因此只有在达到该行时才定义,而函数则是函数声明,并且在执行周围的函数或脚本后立即定义(由于提起(。
显然, google.script.run
在依赖脚本中的任何变量声明之前都以一个级别执行。因此,是的,当使用库中 google.script.run.myWhateverCallback()
的回调时,依赖脚本必须将回调定义为可引起的函数,而不是在变量/常数声明中。
/* don't do this, as you might for your controller actions in the app menu */
const { myWhateverCallback, myOtherCallback } = MyParentLibrary;
/* do this instead, for *every* callback needed by google.script.run */
function myWhateverCallback()
MyParentLibrary.myWhateverCallback(...arguments);
}
根据先前的答案,该功能的正文可能是多余的但是,请修复它,以便我将吊式回调函数用作实际包装器,以防万一。