使用Google.script.run从HTML调用库功能



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);
}

根据先前的答案,该功能的正文可能是多余的但是,请修复它,以便我将吊式回调函数用作实际包装器,以防万一。

最新更新