2013-07-13 18 views
5

Mam następującą funkcję w komórce. Odczytuje datę z innej komórki, oblicza wiek i przekształca go w formacie "3 tygodnie 5 dni".Niestandardowa funkcja arkusza kalkulacyjnego Google wykonana z wbudowanych funkcji arkusza kalkulacyjnego

=INT((TODAY()-D19)/7)&" weeks, "&(TODAY()-D19-(INT((TODAY()-D19)/7)*7))&" days" 

Działa.

Teraz chciałbym wymienić ten długi ciąg na jednej prostej funkcji:

=AGEINWEEKS(D19) 

W jaki sposób można to zrobić?

Próbowałem już napisać skrypt w Script Editor

function ageInWeeks(from_date) { 
    return SpreadsheetApp.getActiveSheet().getRange("D16").setFormula('=ROUND((TODAY()-D16)/7)&" weeks, "&(TODAY()-D16-(ROUND((TODAY()-D16)/7)*7))&" days"'); 
} 

ale zwraca błąd

error: You do not have permission to call setFormula (line 3, file "Code")

Z góry dziękuję!

Pozdrawiam, Tomaž

Odpowiedz

7

Jeśli chcesz utworzyć niestandardową funkcję, która daje taki sam efekt, jak funkcja arkusza kalkulacyjnego, musisz użyć Google Apps Script w taki sposób, aby wykonywał obliczenia, zamiast próbować go użyć do ustawienia formuły do arkusza kalkulacyjnego (który, jak zaznaczył Serge, nie zadziała, ponieważ jest niedozwolony).

(także po prostu być jasne dla przyszłych czytelników, skryptów Google Apps i ich funkcje niestandardowe nie może wykonywać obliczenia za pomocą arkuszy kalkulacyjnych Google formuł. Oni wykonują obliczenia w javascript języku. Z drugiej strony, skrypt, poprzez setFormulas puszka można użyć do napisania formuły arkusza kalkulacyjnego w komórce, w której formuła arkusza kalkulacyjnego wykona obliczenia ... ale nie może tego zrobić, jeśli skrypt jest używany jako funkcja niestandardowa (tj. Jeśli jest wywoływana w komórce z znak = =), ale jeśli skrypt jest wywoływany z innych środków, takich jak element menu lub wyzwalacz, czy jest to wyzwalacz odpowiadający na edycję arkusza kalkulacyjnego lub . Timer)

Tak, można napisać javascript do funkcji niestandardowej obliczać tygodni, dni i taki scenariusz może być:

function ageInWeeks(date) { 
var mil = new Date() - new Date(date).getTime() 
var seconds = (mil/1000) | 0; 
mil -= seconds * 1000; 

var minutes = (seconds/60) | 0; 
seconds -= minutes * 60; 

var hours = (minutes/60) | 0; 
minutes -= hours * 60; 

var days = (hours/24) | 0; 
hours -= days * 24; 

var weeks = (days/7) | 0; 
days -= weeks * 7; 
return weeks +' wks, ' + days + ' days' 

} 

To może być wprowadzone do arkusza kalkulacyjnego w każdej komórce z wyjątkiem D19 jeśli odnosi się do D19, na przykład:

=ageInWeeks(D19) 

gdzie komórka D19 zawiera datę z przeszłości.

(Zauważ, że funkcja zwyczaj może być wolniejszy niż oryginalnego wzoru arkusza kalkulacyjnego)

+0

Dziękuję za dokładną odpowiedź! Kod działa idealnie. – tomazzlender

2

Z documentation : niestandardowe funkcje zwracają wartości, ale nie można ustawić wartości poza komórkami są one w. W większości przypadków funkcja zwyczaj w komórce A1 nie może modyfikować komórce A5.

Jeśli opisujesz swój przypadek użycia, możesz zaproponować inne podejście.

+0

jeśli funkcja zwraca coś takiego jak '[„”,„”,„”,„”,„wartość”]', * A5 * zostanie wypełnione przez "Wartość" –