Как создать глобальные именованные функции javascript в coffeescript для Google Apps Script - PullRequest
9 голосов
/ 30 января 2012

Я хотел бы написать сценарии Javascript для Google Apps Script с использованием CoffeeScript, и у меня возникли проблемы при создании функций в ожидаемой форме.

Google Apps Script ожидает, что скрипт будет содержать именованные функции верхнего уровня. (Возможно, я использую неправильную терминологию, поэтому я проиллюстрирую, что я имею в виду, с помощью примеров ...)

Например, эта функция успешно распознается скриптом Google Apps:

function triggerableFunction() {
   // ...
}

... пока этой функции нет (она будет анализироваться, но вы не сможете ее запустить):

var nonTriggerableFunction;

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

Я обнаружил, что с CoffeeScript ближе всего я могу получить форму nonTriggerableFunction выше. Каков наилучший подход к генерации именованной функции, такой как triggerableFunction выше?

Я уже использую опцию 'bare' (переключатель -b), чтобы скомпилировать без защитной оболочки функции верхнего уровня.

Единственный проект, который я нашел в Интернете, который объединяет CoffeeScript и Google App Script, - это Gmail GTD Bot , который, кажется, делает это с помощью комбинации обратных тиков и с помощью вручную удалить некоторые строки из полученного кода. (См. Конец сценария и раздел «Установка» в README ). Я надеюсь на более простое и чистое решение.

Ответы [ 4 ]

13 голосов
/ 18 декабря 2012

CoffeeScript не позволяет вам неявно создавать что-либо в глобальном пространстве имен; но вы можете сделать это, непосредственно указав глобальное пространство имен.

window.someFunc = (someParam) -> 
    alert(someParam)
3 голосов
/ 30 января 2012

Оказывается, что это можно сделать, используя одну строку встроенного Javascript для каждой функции.

Например, этот CoffeeScript:

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

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

... произведетэтот JavaScript при вызове компилятора кофе с опцией 'bare' (ключ -b):

var myNonTriggerableFunction;

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

function myTriggerableFunction() { myNonTriggerableFunction(); };

В приведенном выше примере Google Apps Script может напрямую вызывать myTriggerableFunction.

1 голос
/ 30 января 2012

Это должно дать вам глобальную именованную функцию (да, это немного глупо, но гораздо реже, чем использование обратных галочек):

# 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 голосов
/ 11 апреля 2018

используйте @ в скрипте, пример моего кода:

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

будет скомпилировано в:

(function() {

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

}).call(this);

это = окно в данном случае, так что это глобальная функция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...