2012-01-30 10 views
7

Chciałbym napisać skrypty JavaScript dla Google Apps Script używając CoffeeScript i mam problemy z generowaniem funkcji w oczekiwanej formie.Jak generować globalne, nazwane funkcje javascript w coffeescript, dla Google Apps Script

Google Apps Script oczekuje, że skrypt będzie zawierał funkcje o najwyższym poziomie i nazwane. (Może być użycie niewłaściwego terminologii, więc będę zilustrować, co mam na myśli przykłady ...)

Na przykład, funkcja ta jest szczęśliwie rozpoznawane przez Google Apps Script:

function triggerableFunction() { 
    // ... 
} 

... podczas gdy funkcja ta nie jest (będzie analizować, ale nie nie będzie w stanie ją wyzwolić):

var nonTriggerableFunction; 

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

Odkryłam, że z coffeescript, najbliższa jestem w stanie uzyskać to nonTriggerableFunction formularz powyżej. Jakie jest najlepsze podejście do generowania nazwanej funkcji, jak powyżej?

Używam już opcji "bare" (przełącznik -b), aby skompilować bez opakowania zabezpieczającego funkcji najwyższego poziomu.

Jeden z projektów, który znalazłem w Internecie, który łączy skrypt kawy i skrypt aplikacji Google, to Gmail GTD Bot, który wydaje się, że robi to za pomocą kombinacji tyknięć wstecznych, i prosząc użytkownika o ręczne usunięcie niektórych linii z wynikowego kod. (Zobacz koniec sekcji script i sekcji "Instalacja" pod numerem README). Mam nadzieję na prostsze i czystsze rozwiązanie.

Odpowiedz

3

Okazuje się, że można to zrobić za pomocą pojedynczej linii embedded Javascript dla każdej funkcji.

E.g. to coffeescript:

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

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

... będzie produkować ten JavaScript, podczas wywoływania kompilator kawy z 'gołej' (przełącznik opcji -b):

var myNonTriggerableFunction; 

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

function myTriggerableFunction() { myNonTriggerableFunction(); }; 

W powyższym przykładzie, Google Apps Skrypt może bezpośrednio wywołać myTriggerableFunction.

1

To powinno dać globalną funkcję o nazwie (tak, to trochę hacky, ale znacznie mniej niż przy użyciu 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

To nie wydaje się generować globalnej nazwanej funkcji. To, co wytwarza przy użyciu przełącznika B: (funkcja() { powrotu this.triggerableFunction = (funkcja() { funkcja triggerableFunction (arg1, arg2) {} powrotu triggerableFunction; })(); })(); – mattbh

+0

Czy uruchomiłeś kod w przeglądarce? Funkcja jest globalna, ponieważ jest dołączona do kontekstu globalnego. I nazywa się: 'triggerableFunction.name ===" triggerableFunction "'.Oczywiście nie generuje on instrukcji funkcji, ale uważam, że nie jest to pytanie. – Adrien

+0

Kod był uruchamiany w mechanizmie skryptu Google Apps, a nie w przeglądarce. Naprawdę pytałem, jak wygenerować instrukcję funkcji, której silnik Google Apps Script wymaga. Obejście zastosowane przez "gmail-gtd-bot" (za pomocą back-ticks) zadziałało dla mnie. – mattbh

11

coffeescript nie pozwalają na stworzenie czegoś w globalnej przestrzeni nazw dorozumiany; ale możesz to zrobić, określając bezpośrednio globalny obszar nazw.

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

Powoduje to utworzenie funkcji anonimowej, a nie nazwanej. Anonimowa funkcja jest następnie przypisywana do someFunc. Jest to oczywiste, jeśli umieścisz punkt przerwania w nowej funkcji i spojrzysz na ślad stosu. –

Powiązane problemy