如何在 CoffeeScript 中为 Google Apps 脚本生成全局命名 JavaScript 函数

发布于 2024-12-29 20:40:31 字数 1112 浏览 3 评论 0原文

我想使用 CoffeeScript 为 Google Apps 脚本 编写 Javascript 脚本,并且我正在使用无法生成预期形式的函数。

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

例如,这个函数很高兴被 Google Apps 脚本识别:

function triggerableFunction() {
   // ...
}

...而这个函数不是(它会解析,但是你不会无法触发它吗?):

var nonTriggerableFunction;

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

我发现使用 CoffeeScript,我能得到的最接近的是上面的 nonTriggerableFunction 形式。生成像上面的 triggerableFunction 这样的命名函数的最佳方法是什么?

我已经使用“裸”选项(-b 开关)来编译 没有顶级函数安全包装器。

我在网上发现的一个结合了 CoffeeScript 和 Google App Script 的项目是 Gmail GTD Bot,它似乎使用反引号的组合来完成此操作,并要求用户从结果代码中手动删除一些行。 (请参阅脚本的末尾,以及README 的“安装”部分)。我希望有一个更简单、更干净的解决方案。

I'd like to write Javascript scripts for Google Apps Script using CoffeeScript, and I'm having trouble generating functions in the expected form.

Google Apps Script expects a script to contain top-level, named functions. (I may be using the wrong terminology, so I'll illustrate what I mean with examples...)

For example, this function is happily recognised by Google Apps Script:

function triggerableFunction() {
   // ...
}

... while this function is not (it will parse, but won't you won't be able to trigger it):

var nonTriggerableFunction;

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

I've found that with CoffeeScript, the closest I'm able to get is the nonTriggerableFunction form above. What's the best approach to generating a named function like triggerableFunction above?

I'm already using the 'bare' option (the -b switch), to compile
without the top-level function safety wrapper.

The one project I've found on the web which combines CoffeeScript and Google App Script is Gmail GTD Bot, which appears to do this using a combination of back-ticks, and by asking the user to manually remove some lines from the resulting code. (See the end of the script, and the 'Installation' section of the README). I'm hoping for a simpler and cleaner solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

染火枫林 2025-01-05 20:40:31

CoffeeScript 不允许您在全局命名空间中隐式创建任何内容;但是,您可以通过直接指定全局命名空间来做到这一点。

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

CoffeeScript does not allow you to create anything in the global namespace implicitly; but, you can do this by directly specifying the global namespace.

window.someFunc = (someParam) -> 
    alert(someParam)
鹿港巷口少年归 2025-01-05 20:40:31

事实证明,这可以通过为每个函数使用一行 嵌入式 Javascript 来完成。

例如

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

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

,当使用“bare”选项(-b 开关)调用咖啡编译器时,此 CoffeeScript: ... 将生成此 JavaScript:

var myNonTriggerableFunction;

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

function myTriggerableFunction() { myNonTriggerableFunction(); };

通过上面的示例,Google Apps 脚本能够触发 myTriggerableFunction直接地。

Turns out this can be done using a single line of embedded Javascript for each function.

E.g. this CoffeeScript:

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

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

... will produce this JavaScript, when invoking the coffee compiler with the 'bare' option (the -b switch):

var myNonTriggerableFunction;

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

function myTriggerableFunction() { myNonTriggerableFunction(); };

With the example above, Google Apps Script is able to trigger myTriggerableFunction directly.

想你只要分分秒秒 2025-01-05 20:40:31

这应该给你一个全局命名函数(是的,这有点hacky,但远不如使用反引号):

# 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

This should give you a global named function (yes, it's a little hacky, but far less that using backticks):

# 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
一抹微笑 2025-01-05 20:40:31

只需在脚本中使用@,我的代码示例:

@isArray = (o)->
  Array.isArray(o)

它将被编译为:

(function() {

  this.isArray = function(o) {
    return Array.isArray(o);
  };

}).call(this);

this = window 在这种情况下,所以它是全局函数

juste use @ in script, exemple of my code :

@isArray = (o)->
  Array.isArray(o)

it will be compiled in :

(function() {

  this.isArray = function(o) {
    return Array.isArray(o);
  };

}).call(this);

this = window in this case, so it's global function

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文