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

时间:2012-06-02 21:23:23

标签: javascript google-apps-script

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

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

当前文档告诉我“onEdit”事件的名称 handler是“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环境中,“window”对象被标记为未知对象。

我应该使用的环境中是否还有其他“对象”名称? 这可以在Google Apps脚本环境中使用吗?


此外,我知道“function_exists”例程也是一个挑战。 这将是我的下一个问题。我知道“typeof”操作,它 我编码

时返回“string”
      "if ( typeof rtn_name == function" ) .. "

如果在字符串中包含名称,是否有办法测试例程存在?


我知道我可以使用“静态”名称并在“onEdit”例程中对它们进行硬编码。 但我想编写一次例程,而不必修改它 对于我写的每个新电子表格。而不是写作 复杂的“onEdit”惯例,我想专心写作 并为单张纸张测试“onEdit”功能。

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


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


我是Google Apps脚本的新手。我正在寻找一个脚本解决方案。 它可能可以在“Java”中完成,但这超出了其范围 我想要编码。


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

所有和任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:6)

我知道在Apps脚本中使用字符串调用函数的两种方法。

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方法时,您不应该在另一个范围内,例如来自使用new调用的函数。但是我发布的这个完整的完整代码工作正常。

答案 1 :(得分:1)

对于ES8:

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

答案 2 :(得分:0)

如果您知道存储功能的位置,则可以在检查时执行标准。

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