2012-01-30 67 views
7

Tôi muốn viết các tập lệnh Javascript cho Google Apps Script bằng CoffeeScript và tôi gặp sự cố khi tạo các chức năng ở dạng mong muốn.Cách tạo các hàm javascript có tên, toàn cục trong coffeescript, cho Google Apps Script

Google Apps Script dự kiến ​​tập lệnh chứa các hàm có tên, cấp cao nhất. (Tôi có thể sử dụng các thuật ngữ sai, vì vậy tôi sẽ minh họa những gì tôi muốn nói với các ví dụ ...)

Ví dụ, chức năng này được hạnh phúc được công nhận bởi Google Apps Script:

function triggerableFunction() { 
    // ... 
} 

... trong khi chức năng này không phải là (nó sẽ phân tích cú pháp, nhưng sẽ không bạn sẽ không thể kích hoạt nó):

var nonTriggerableFunction; 

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

tôi đã tìm thấy rằng với CoffeeScript, gần nhất tôi có thể nhận được là nonTriggerableFunction biểu mẫu ở trên. Cách tiếp cận tốt nhất để tạo ra hàm có tên như triggerableFunction ở trên là gì?

Tôi đã sử dụng tùy chọn 'trần' (công tắc -b), để biên dịch mà không có trình bao bọc chức năng cấp cao nhất.

Dự án tôi tìm thấy trên web kết hợp CoffeeScript và Tập lệnh ứng dụng Google là Gmail GTD Bot, có vẻ như thực hiện việc này bằng cách kết hợp các dấu tích và bằng cách yêu cầu người dùng xóa một số dòng theo cách thủ công mã. (Xem phần cuối của script và phần 'Cài đặt' của README). Tôi hy vọng cho một giải pháp đơn giản và sạch hơn.

Trả lời

3

Việc này có thể được thực hiện bằng một dòng embedded Javascript cho từng chức năng.

Ví dụ: CoffeeScript này:

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

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

... sẽ sản xuất JavaScript này, khi gọi trình biên dịch cà phê với các tùy chọn 'trần' (switch -b):

var myNonTriggerableFunction; 

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

function myTriggerableFunction() { myNonTriggerableFunction(); }; 

Với ví dụ trên, Google Apps Tập lệnh có thể kích hoạt trực tiếp myTriggerableFunction.

1

này sẽ cho bạn một hàm có tên toàn cầu (có, đó là một chút hacky, nhưng ít rằng việc sử dụng 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 
+0

Điều đó dường như không tạo ra chức năng được đặt tên chung. Đây là những gì nó tạo ra, khi sử dụng công tắc -b: (function() { trở this.triggerableFunction = (function() { chức năng triggerableFunction (arg1, arg2) {} trở triggerableFunction; })(); })(); – mattbh

+0

Bạn có chạy mã trong trình duyệt không? Hàm này là toàn cầu vì nó được gắn vào ngữ cảnh chung. Và nó được đặt tên: 'triggerableFunction.name ===" triggerableFunction "'.Tất nhiên, nó không tạo ra một tuyên bố chức năng, nhưng tôi tin rằng đó không phải là những gì được hỏi. – Adrien

+0

Mã chạy trong công cụ Google Apps Script thay vì trình duyệt. Tôi đã thực sự hỏi làm thế nào để tạo ra một tuyên bố chức năng, mà công cụ Google Apps Script dường như yêu cầu. Cách giải quyết được sử dụng bởi 'gmail-gtd-bot' (sử dụng back-tick) đã làm việc cho tôi. – mattbh

11

CoffeeScript không cho phép bạn tạo ra bất cứ điều gì trong không gian tên toàn cầu ngầm; nhưng, bạn có thể làm điều này bằng cách xác định trực tiếp không gian tên chung.

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

Điều này tạo ra một chức năng ẩn danh, không phải là một hàm có tên. Hàm ẩn danh sau đó được gán cho someFunc. Rõ ràng nếu bạn đặt một điểm ngắt trong hàm mới của bạn và nhìn vào dấu vết ngăn xếp. –

Các vấn đề liên quan