2012-01-30 51 views
7

我想使用CoffeeScript为Google Apps Script编写Javascript脚本,但我在生成预期格式的函数时遇到问题。如何在coffeescript中为Google Apps脚本生成全局命名的javascript函数

Google Apps脚本希望脚本包含顶级命名函数。 (我可能是使用了错误的术语,所以我会说明我的意思举例...)

例如,该功能通过愉快谷歌Apps脚本承认:

function triggerableFunction() { 
    // ... 
} 

...而这个功能是不是(它将解析,但你会不会将无法触发它):

var nonTriggerableFunction; 

nonTriggerableFunction = function() { 
    // ... 
}; 

我发现有CoffeeScript的,我能够获得最接近的是nonTriggerableFunction以上表格。生成上述triggerableFunction这样的命名函数的最佳方法是什么?

我已经在使用'裸'选项(-b开关),编译 没有顶级功能安全包装。

我在Web上发现的一个项目,结合了CoffeeScript和Google App Script,它是Gmail GTD Bot,它似乎是通过使用back-ticks的组合来做到这一点,并要求用户手动从结果中删除一些行码。 (请参阅script的末尾,以及README的“安装”部分)。我希望有一个更简单更清洁的解决方案。

回答

3

原来,这可以使用单行embedded Javascript为每个功能。

E.g.这CoffeeScript的:

myNonTriggerableFunction = -> 
    Logger.log("Hello World!") 

`function myTriggerableFunction() { myNonTriggerableFunction(); }` 

...会产生这样的JavaScript,与 '裸' 选项(-b开关)调用编译咖啡时:

var myNonTriggerableFunction; 

myNonTriggerableFunction = function() { 
    return Logger.log("Hello World!"); 
}; 

function myTriggerableFunction() { myNonTriggerableFunction(); }; 

用上面的例子,谷歌企业应用套件脚本可以直接触发myTriggerableFunction

1

这应该给你一个全局命名功能(是的,这是一个有点哈克,但远少于使用反引号):

# wrap in a self invoking function to capture global context 
do -> 
    # use a class to create named function 
    class @triggerableFunction 
    # the constructor is invoked at instantiation, this should be the function body 
    constructor: (arg1, arg2) -> 
     # whatever 
+0

这似乎并没有生成全局命名函数。这是它产生,使用-b开关时: (函数(){ 返回this.triggerableFunction =(函数(){ 功能triggerableFunction(ARG1,ARG2){} 返回triggerableFunction; } )(); })(); – mattbh 2012-01-30 22:22:20

+0

您是否在浏览器中运行代码?该函数是全局的,因为它附着在全局上下文中。它被命名为:'triggerableFunction.name ===“triggerableFunction”'。当然,它不会生成函数声明,但我相信这不是问题所在。 – Adrien 2012-01-31 09:36:25

+0

代码在Google Apps脚本引擎中运行,而不是在浏览器中运行。我的确在问如何生成Google Apps脚本引擎似乎需要的函数声明。 'gmail-gtd-bot'使用的解决方法(使用back-ticks)为我工作。 – mattbh 2012-04-03 22:32:11

11

的CoffeeScript不允许你创建的全局命名空间隐含任何东西;但是,您可以通过直接指定全局名称空间来完成此操作。

window.someFunc = (someParam) -> 
    alert(someParam) 
+0

这将创建一个匿名函数,而不是一个命名的函数。匿名函数然后分配给someFunc。如果你在你的新函数中放置一个断点并且看一下堆栈跟踪,这很明显。 – 2013-04-01 20:25:28