在 Google 脚本中,按函数名称调用函数,并在字符串中给定其名称

In a Google Script, call a function by its name, given its name in a string

本文关键字:函数 字符串 调用 脚本 Google      更新时间:2023-09-26

我已经尝试了我在"stackoverfllow"网站上找到的代码示例,这些示例与从字符串调用函数有关。它们似乎不适用于Google App Script。我收到一个错误,将该"窗口"作为未定义的对象。

这是我试图解决的情况。我有一个电子表格,它将有很多不同的床单。其中一些工作表将具有已知名称在我编写代码时。其他工作表将具有未知的名称正是在我编写代码时(例如基于动态数据)。

当前的文档告诉我,"onEdit"事件的名称处理程序是"onEdit"。 由于你的名字是唯一的,我的结论是在电子表格应用程序中只能是一个具有此名称的此类例程。

由于这种情况(上图),我想降低我的复杂性"编辑"功能。我想编写"onEdit"例程对使用限定名的子函数进行"动态"调用,基于发生编辑事件的"工作表"的名称。

这是我想纠正的"onEdit"例程的伪代码示例。

  function onEdit(src)
  {
     var act_sheet = src.getActiveSheet();
     var sheet_name = act_sheet.getName();
     var rtn_name = "onEdit_sheet_".sheet_name;
     if ( function_exists(rtn_name) )
     {
         window[rtn_name](srv)
     }
  }

我实际上尝试过类似的代码。在谷歌环境中,"窗口"对象被标记为未知对象。

环境中是否有我应该使用的其他"对象"名称?这在Google Apps Script环境中可能吗?


另外,我知道"function_exists"套路也是写起来的挑战。这将是我的下一个问题。我知道"类型"操作,它编码时返回"字符串"

      "if ( typeof rtn_name == function" ) .. "

有没有办法在给定字符串中包含的名称的情况下测试例程是否存在?


我知道我可以使用"静态"名称并在"onEdit"例程中对它们进行硬编码。但是我想写一次例程,而不必修改它对于我编写的每个新电子表格。 而不是写非常复杂的"onEdit"例程,我想专注于写作并测试单个工作表的"onEdit"函数。

我在浏览器环境中理解Javascript。谷歌应用脚本环境对我来说更像是一个谜。我找到了文档非常非常简洁,需要更全面的解释。任何额外的有关 Google 应用套件脚本环境中存在哪些对象的信息会有所帮助。


当然,我的第三步可能是编写一个"onEdit"例程根据当前"范围"调度正确的子函数与编辑事件关联。


我是Google Apps Scripts的新手。我正在寻找脚本解决方案。它可能可以在"Java"中完成,但这超出了我想编码。


我也是"堆栈溢出"环境的新手。其中大部分似乎都是对我来说很神秘。(例如,如何指定应关联的标签有这个问题?我如何知道哪些标记可以分配对这个问题?如何将搜索限制为某些标签?-我是目前对"谷歌应用脚本"感兴趣,当我选择右栏中的"JavaScript"按钮将我带入JavaScript可能不适用于 Google 脚本环境的答案。发现了如何在下面"分配"标签。我如何知道哪些标签在没有的情况下可用只是猜测?

感谢所有和任何帮助。

我知道两种方法可以在应用程序脚本中的字符串上使用函数的名称来调用函数。

function onEdit(e) {
  var func = 'test';
  this[func]();
  //eval(func+'()'); //msgBox and eval don't play nice together
  Browser.msgBox('finished');
}
function test() {
  Browser.msgBox('test');
}

当然,当使用this方法时,您不应该在另一个范围内,例如来自称为 using new 的函数。但是我发布的这个确切的完整代码工作正常。

对于 ES8:

var GoogleAppsScrip = this;
function onEdit(e) {
  var func = 'test';
  GoogleAppsScrip[func]();
  Browser.msgBox('finished');
}

如果您知道函数的存储位置,则可以执行标准 if 检查。

if(window.myFunction){//then do something};

      function someFunction(){
        if(this.florida.miami.beach.girls.boobs > 'b')
        {
                alert('Get Plane Ticket!');
        }
         else{
               console.log('improvise')};
        };

        if(window.someFunction){
        window.someFunction.call(new USA());
        };