4

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

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

当前文档告诉我“onEdit”事件处理程序的名称是“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 应用程序脚本环境中存在哪些对象的任何其他信息都会有所帮助。


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


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


我也是“stackoverflow”环境的新手。其中大部分对我来说似乎是个谜。(例如,我如何指定哪些标签应该与这个问题相关联?我怎么知道哪些标签可以分配给这个问题?如何将我的搜索限制在某些标签上?-我目前对“谷歌”感兴趣应用程序脚本”,当我在右栏中选择“javascript”按钮时,它会将我带到可能不适用于 google 脚本环境的 javascript 答案。在下面了解如何“分配”标签。我怎么知道哪些标签是无需猜测即可获得?

感谢所有和任何帮助。

4

3 回答 3

12

我知道有两种方法可以在 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方法时,您不应该处于另一个范围内,例如来自名为 using 的函数new。但是我发布的这个确切的完整代码可以正常工作。

于 2012-06-02T22:10:05.093 回答
1

对于 ES8:

var GoogleAppsScrip = this;
function onEdit(e) {
  var func = 'test';
  GoogleAppsScrip[func]();
  Browser.msgBox('finished');
}
于 2020-04-03T08:22:04.693 回答
-1

如果您知道函数的存储位置,则可以进行标准 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());
        };
于 2012-06-02T21:42:35.680 回答