javascript 使用www.example.com从html调用库函数google.script.run

jaql4c8m  于 2023-04-10  发布在  Java
关注(0)|答案(4)|浏览(124)

我用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

disho6za

disho6za1#

似乎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中,每个对象的行为都像一个键-值对的关联数组,包括在这个场景中'this'将指向的全局对象。尽管'libName'和'libFunc'都是String类型,我们仍然可以通过使用上面的语法在全局对象中引用它们。apply()只需调用'this'上的函数,使结果在全局范围内可用。
下面是如何从客户端调用库函数:

google.script.run.callLibraryFunction("Library.libraryFunction", [5, 3]);

我并不认为这个解决方案是我自己的--这是我不久前在布鲁斯麦克弗森的网站上看到的。你可以想出其他更适合你的情况的特别解决方案,但我认为这个是最通用的。

kt06eoxx

kt06eoxx2#

注意到在HTML代码中从www.example.com调用库时出现了同样的问题google.script.run。下面是我使用的解决方法:
图书馆侧:图书馆

function aFunction(){
    //code...;

}

ADDON SIDE(需要库“aLibrary”)

function aFunction(){
    aLibrary.aFunction();

}

HTML

<input type="button" value="run aFunction" onclick="google.script.run.aFunction()" />

我喜欢这种解决方法,因为我可以清楚地查看和组织我的函数名称,并且如果我将函数直接带入addOn项目,则不需要更改HTML代码,一旦开发变得满意。
只有一件事我还没有尝试:处理参数和返回值...
我希望这个贡献是不是愚蠢的,请原谅我我很业余…

i34xakig

i34xakig3#

经过长时间的工作,我发现任何使用google.script.run从库中调用的函数必须同时存在于主脚本和库脚本中。函数必须至少在主脚本中声明,而实现和参数并不重要。实现将在您的库中。如果主脚本不包含函数的名称,将出现错误<your function> is not a function
既然如果每个函数都需要存在于main函数中,那么拥有一个库就没有意义了,@Anton Dementiev提供的解决方案将被用作解决方案。假设你的库中有一个名为testFunc的函数,你可以使用以下方法调用它:

google.script.run.callLibraryFunction("testFunc", [5, 3]);

其中库具有以下功能:

function callLibraryFunction(func, args) {
  args = args || [];
  return this[func].apply(this, args);
}

主脚本有这样的声明:

function callLibraryFunction() {

}

谷歌必须纠正这种愚蠢的行为

e4yzc0pl

e4yzc0pl4#

这个问题,据我所知,是由于hoisting-看到这个答案here
不同之处在于,functionOne是一个函数表达式,因此仅在到达该行时定义,而functionTwo是一个函数声明,并且在执行其周围的函数或脚本时立即定义(由于提升)。
显然,google.script.rundependent 脚本中的任何变量声明之前的级别执行。所以,是的,当在库中使用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);
}

相关问题