2012-01-30 8 views
7

Me gustaría escribir scripts Javascript para Google Apps Script usando CoffeeScript, y tengo problemas para generar funciones en la forma esperada.Cómo generar funciones javascript con nombre global, en coffeescript, para Google Apps Script

Google Apps Script espera que un script contenga funciones nombradas de alto nivel. (Puede que sea el uso de la terminología incorrecta, así que voy a ilustrar lo que quiero decir con ejemplos ...)

Por ejemplo, esta función está felizmente reconocido por Google Apps Script:

function triggerableFunction() { 
    // ... 
} 

... mientras que esta función no se encuentra (se analiza, pero no que no será capaz de desencadenar):

var nonTriggerableFunction; 

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

he encontrado que con CoffeeScript, el más cercano que soy capaz de conseguir es la nonTriggerableFunction forma arriba. ¿Cuál es el mejor enfoque para generar una función nombrada como triggerableFunction anterior?

Ya estoy usando la opción 'bare' (el interruptor -b), para compilar sin la envoltura de seguridad de la función de nivel superior.

El único proyecto que he encontrado en la web que combina CoffeeScript y Google App Script es Gmail GTD Bot, que parece hacer esto usando una combinación de "back-ticks" y pidiendo al usuario que elimine manualmente algunas líneas del resultado código. (Consulte el final de script y la sección 'Instalación' del README). Estoy esperando una solución más simple y más limpia.

Respuesta

3

Resulta que esto se puede hacer usando una sola línea de embedded Javascript para cada función.

E.g. este CoffeeScript:

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

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

... producirá este JavaScript, cuando se invoca el compilador de café con la opción 'desnuda' (el parámetro -b):

var myNonTriggerableFunction; 

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

function myTriggerableFunction() { myNonTriggerableFunction(); }; 

Con el ejemplo anterior, Google Apps La secuencia de comandos puede activar myTriggerableFunction directamente.

1

Esto debe darle una función llamada mundial (sí, es un poco hacky, pero mucho menos que el uso de acentos abiertos):

# 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

Eso no parece generar una función con nombre global. Esto es lo que produce, cuando se utiliza el parámetro -b: (function() { retorno this.triggerableFunction = (function() { función triggerableFunction (arg1, arg2) {} retorno triggerableFunction; })(); })(); – mattbh

+0

¿Ejecutó el código en un navegador? La función es global porque está vinculada al contexto global. Y se llama: 'triggerableFunction.name ===" triggerableFunction "'.Por supuesto, no genera una declaración de función, pero creo que no es lo que se preguntó. – Adrien

+0

El código se ejecutaba en el motor de Google Apps Script en lugar de en un navegador. De hecho, estaba preguntando cómo generar una declaración de función, que el motor de Google Apps Script parece requerir. La solución utilizada por 'gmail-gtd-bot' (usando back-ticks) funcionó para mí. – mattbh

11

CoffeeScript no le permite crear cualquier cosa en el espacio de nombres global implícitamente; pero puede hacerlo especificando directamente el espacio de nombres global.

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

Esto crea una función anónima, no una función con nombre. La función anónima se asigna luego a algúnFunc. Es obvio si pones un punto de interrupción en tu nueva función y ves el rastro de la pila. –

Cuestiones relacionadas