2012-06-05 7 views
8

Szukałem w tworzeniu zestawu narzędzi za pomocą skryptu aplikacji Google. Problem polega na tym, że o ile mogę powiedzieć, pozwala to tylko na jeden poziom organizacji. Możesz utworzyć bibliotekę o nazwie Stoper i wywołać metody Stopwatch.start() i Stopwatch.stop(), co jest całkiem fajne.Tworzenie organizacji podobnej do przestrzeni nazw w bibliotece skryptów Google Apps

Co jednak miałem na myśli to coś bardziej przypominającego Utils.Stopwatch(). Start() i Utils.Timer.start() itd. Myślę, że jest to z pewnością możliwe w javascript, ale żeby dalej łamać Apps Script autouzupełnianie funkcja musi zostać dodana w określonym formacie. Poniżej znajduje się przykład wykonania błędu (daje błąd), ale może zaoszczędzić trochę czasu. Jest oparty na artykule this.

/** 
* A stopwatch object. 
* @return {Object} The stopwatch methods 
*/ 
function Stopwatch() 
{ 
    var current; 

    /** 
    * Stop the stopwatch. 
    * @param {Time} time in miliseconds 
    */ 
    function timeInSeconds_(time) 
    { 
    return time/1000; 
    } 

    return 
    { 
     /** 
     * Start the stopwatch. 
     */ 
     start: function() 
     { 
     var time = new Date().getTime(); 
     current = timeInSeconds_(time); 
     }, 

     /** 
     * Stop the stopwatch. 
     * @return {decimal} time passed since calling 
     * start (in seconds) 
     */ 
     stop: function() 
     { 
     var time = new Date().getTime(); 
     var difference = timeInSeconds_(time) - this.current; 
     return difference.toFixed(3); 
     } 
    }; 
} 

Dzięki

+0

Chyba masz kod w tym przypadku byłoby 'Utils.Stopwatch() start()' – Eduardo

+0

Tak to prawda, mój zły –

Odpowiedz

0

Co za pomocą OO?

Wygląda bardzo dobrze zorganizowany i łatwy do udokumentowania.

/** 
* A stopwatch Class. 
* 
* @constructor 
*/ 
function Stopwatch() { 
    this.current = new Date().getTime(); 
} 

/** 
* Starts the stopwatch 
*/ 
Stopwatch.prototype.start = function(){ 
    this.current = new Date().getTime(); 
}; 

/** 
* Stops the stopwatch 
* 
* @return {number} Number of seconds since Stopwatch was started 
*/ 
Stopwatch.prototype.stop = function(){ 
    return ((new Date().getTime()) - this.current)/1000; 
}; 

Przykład. W przypadku, gdy twoja biblioteka jest importowana jako Utils.

var s = new Utils.Stopwatch(); 
s.start(); 

// (...) 

Logger.log(s.stop()); 

PS: To jest nietestowany kod.

Jako efekt uboczny można mieć wiele stoperami, każdy utrzymując swój własny zmienna lokalna current

UPDATE

Chociaż jest prawidłowo udokumentowane następujące JSDoc obecnie nie uzupełni metody z Google Skrypt aplikacji.

+0

Kod jest uruchamiany (i jest również bardziej zwarty), ale to łamie sposób działania bibliotek skryptów aplikacji. Aby działać w tej wersji autouzupełniania, należy zdefiniować słowo kluczowe, które aplikacja Apps Script łączy z biblioteką.Przykładem może być:. '// Dla 'utils' Utlis.Stopwatch start()()' –

+0

Niestety edytowany zbyt wiele razy i musiał czekać .. Reszta 'czas var = Utlis.Stopwatch() .stop() ' Tutaj jest fajny artykuł: [link] (http://googleappsdeveloper.blogspot.com/feeds/posts/default) Zdaję sobie sprawę, że jesteś świadomy powyższego, Chodzi o to, że to s.start() lub "Utils.Stopwatch(). Start()" w tym przypadku nie są odbierane przez funkcję autouzupełniania. Tylko słowo kluczowe i jedna funkcja w dół. Jeśli możesz uzyskać metodę start() do autouzupełniania, rozwiązałeś mój problem :) @Eduardo –

+0

Masz rację, używając OO nie autouzupełniania w Google Apps Script – Eduardo

2

To nie działa, ale zespół wie o tym. Do tego czasu będziesz musiał udokumentować swoje biblioteki w witrynie. Sądzę, że możesz umieścić te metody w opisie. To naprawdę świetny początek dla nowej usługi, ale byłem z tobą około 5 minut i już chciałem więcej. ;)

+0

Dzięki za informacje, myślę, że będziemy musieli po prostu w takim razie poczekaj. –

3

Dopóki taka funkcja nie zostanie natywnie obsługiwana przez Google, można zdefiniować puste funkcje z adnotacjami na tym samym poziomie, co funkcja konstruktora. Możesz nawet zachować oryginalną strukturę kodu. Umożliwi to automatyczne uzupełnianie w edytorze. Dodatkowo otrzymasz automatycznie wygenerowaną dokumentację swojej biblioteki, np. https://script.google.com/macros/library/versions/d/YOUR_PROJECT_KEY

Przykład:

/** 
* Constructor. 
* @constructor 
* @param {String} apiKey Doxument API key 
* @param {String} apiToken Doxument API token 
*/  
function DoxumentApi(apiKey, apiToken) { 
    // public api 
    return { 
     get: function(id, params) { 
      var httpResponse = execute('/docs/' + id + '.json?' + buildQuery(params)); 
      return parse(httpResponse); 
     } 
    } 
} 

/** 
* Get document record. 
* @param {String} id document id 
* @param {Object=} params optional. extra get params 
* @return {Object} Document object 
*/  
function get(id, params) {} 
+2

To automatycznie uzupełni metodę tylko na najwyższym poziomie, a nie na poziomie podrzędnym, gdzie zdefiniowane są mothody. Dla mojego przykładu powinien to być Tools.Stopwatch(). Start() zamiast Tools.start(). –

Powiązane problemy