Chcę stworzyć funkcję, która przyjmuje zakres ... coś takiego:
function myFunction(range) {
var firstColumn = range.getColumn();
// loop over the range
}
Komórka odwoływałaby się do niej za pomocą:
=myFunction(A1:A4)
Problem polega na tym, że gdy próbuję to zrobić, parametr wydaje się przekazywać tylko wartości do funkcji. Dlatego nie mogę użyć żadnej z metod Range, takich jak getColumn()
. Gdy próbuję to zrobić, pojawia się następujący błąd:
error: TypeError: Nie można znaleźć funkcji getColumn w obiekcie 1,2,3.
Jak mogę wysłać rzeczywisty zakres, a nie tylko wartości do jednej z moich niestandardowych funkcji?
range
jest traktowany jako tablica 2d javascript. Możesz uzyskać liczbę wierszyrange.length
i liczbę kolumn za pomocąrange[0].length
. Jeśli chcesz uzyskać wartość z wierszar
i kolumnyc
użycia:range[r][c]
.źródło
=myFunction(C1:F1)
wówczas funkcjarange[0][0]
zwróci wartośćC1
,range[0][1]
zwróci wartośćD1
,range[0][2]
zwróci wartośćE1
itd. Czy to jasne?=weightedAverage(B3:D3,$B$2:$D$2)
, chciałbym, aby funkcja była bardziej odporna na błędy, ponieważ nie muszę wysyłać drugiego argumentu (tj. Chcę wywołać go jako=weightedAverage(B3:D3)
), a następnie pozwolić kodowi automatycznie wiedzieć, że zakres zaczyna się od B, a kończy o D, więc pobiera odpowiednie wartości z 2. rzędu. Uwaga: wartość „2” może być zakodowana na stałe, ale „B” nie powinno być zakodowane na stałe.B
się z danegorange
. Sugeruję, abyś przejrzał przewodnik dla początkujących ( goo.gl/hm0xT ), jeśli jeszcze tego nie zrobiłeś, aby dowiedzieć się, jak grać z zasięgami i komórkami.Gdy przekazujesz a
Range
do funkcji arkusza kalkulacyjnego Google, środowisko wykonuje sięparamRange.getValues()
domyślnie, a twoja funkcja otrzymuje wartości w zakresie jako dwuwymiarową tablicę ciągów, liczb lub obiektów (jakDate
).Range
Obiekt nie jest przekazywana do niestandardowej funkcji arkusza kalkulacyjnego.Poniższa
TYPEOF()
funkcja powie ci, jakie dane otrzymujesz jako parametr. Formuła=TYPEOF(A1:A4)
wywoła skrypt w następujący sposób:
źródło
Alternatywnie, zainspirowany komentarzem @Lipis, możesz wywołać swoją funkcję za pomocą współrzędnych wiersza / kolumny jako dodatkowych parametrów:
W tej formie formułę można łatwo skopiować (lub przeciągnąć) do innych komórek, a odniesienia do komórek / zakresu zostaną automatycznie dostosowane.
Twoja funkcja skryptu musiałaby zostać zaktualizowana jako taka:
Należy zauważyć, że
getRange
funkcja przyjmujestartRow
,startColumn
i następnie liczbę wierszy i liczbę kolumn, - nie końca wiersza i koniec kolumny. Tak więc arytmetyka.źródło
Można to zrobić . Odwołanie do przekazanego zakresu można uzyskać, analizując formułę w aktywnej komórce, która jest komórką zawierającą formułę. To powoduje założenie, że funkcja niestandardowa jest używana samodzielnie, a nie jako część bardziej złożonego wyrażenia: np .
=myfunction(A1:C3)
Nie=sqrt(4+myfunction(A1:C3))
.Ta funkcja zwraca indeks pierwszej kolumny z przekazanego zakresu.
źródło
Rozszerzyłem doskonały pomysł w odpowiedzi user79865 , aby działał w większej liczbie przypadków i z wieloma argumentami przekazywanymi do funkcji niestandardowej.
Aby go użyć, skopiuj poniższy kod, a następnie w niestandardowym wywołaniu funkcji w
GetParamRanges()
ten sposób, przekazując mu nazwę funkcji:Oto przykład, aby zwrócić kolor komórki:
Oto kod i kilka dodatkowych wyjaśnień:
źródło
Rozróżniam dwie różne funkcje niestandardowe w Arkuszu kalkulacyjnym Google za pomocą Google Apps Script:
Pierwsza funkcja jest w stanie zrobić prawie wszystko. Oprócz dzwonienia do usługi Arkusz kalkulacyjny, może ona także korzystać z GmailApp lub dowolnej usługi udostępnianej przez Google. Wywołania API spowolnią proces. Można przekazać lub pobrać zakres, aby uzyskać dostęp do wszystkich dostępnych metod.
Druga funkcja ogranicza się tylko do „Arkusza kalkulacyjnego”. Tutaj można skorzystać z JavaScript do przerobienia danych. Te funkcje są zwykle bardzo szybkie. Przekazany zakres to nic innego jak tablica 2D zawierająca wartości.
W swoim pytaniu zaczynasz od wywołania
.getColumn()
metody. To wyraźnie wskazuje, że potrzebujesz funkcji niestandardowej typu 1, jak opisano powyżej.Zobacz następującą odpowiedź na temat ustawiania arkusza kalkulacyjnego i arkusza, aby utworzyć funkcję niestandardową.
źródło
Pracowałem nad tym kilka miesięcy temu i wymyśliłem bardzo prosty kludge: utwórz nowy arkusz z nazwą każdej komórki jako jej zawartością: Komórka A1 mogłaby wyglądać następująco:
Nazwij arkusz „Ref”. Następnie, gdy potrzebujesz odwołania do komórki jako ciągu zamiast zawartości, użyj:
Oczywiście musisz sprawdzić, czy funkcja przechodzi przez łańcuch (jedną komórkę), czy tablicę 1D lub 2D. Jeśli otrzymasz tablicę, będzie ona miała wszystkie adresy komórek jako ciągi, ale od pierwszej komórki oraz szerokości i wysokości możesz dowiedzieć się, czego potrzebujesz.
źródło
Pracowałem nad tym przez cały ranek i widziałem dowody na to, co omawiają powyższe nie-odpowiedzi. Rozsądny i oboje chcemy ADRESU przekazanej komórki, a nie wartości. Odpowiedź jest bardzo łatwa. Nie da się tego zrobić.
Znalazłem kilka obejść, które polegają na ustaleniu, która komórka zawiera formułę. Trudno powiedzieć, czy pomogłoby to Senseful powyżej. Co ja robiłem?
Kolumna H to Sophia's (Wygrane - PrevWins) / (Przegrane - PrevLosses)
(7–4) / (4–2) = 1,5
Ale nie wiemy, w którym wierszu wcześniej pojawiła się Sophia.
Można to wszystko zrobić za pomocą WYSZUKAJ.PIONOWO, jeśli na stałe wpisujesz A jako kolumnę nazwy. Po WYSZUKAJ.PIONOWO otrzymywałem #NA (nazwa nie została znaleziona) i # DIV0 (mianownik zero) i otoczyłem go = JEŻELI (JEŻELI (...)), aby wyświetlić w tych warunkach bardziej smaczny tekst. Teraz miałem potwornie duży wyraz twarzy, który był nieporęczny i niemożliwy do utrzymania. Chciałem więc rozwinięcia makra (nie istnieje) lub funkcji niestandardowych.
Ale kiedy zrobiłem pomocnika SubtractPrevValue (komórkę), otrzymywał „7” zamiast B5. Nie ma wbudowanego sposobu pobierania obiektów komórki lub zakresu z przekazanych argumentów.
Jeśli zmuszę użytkownika do ręcznego wprowadzenia nazwy komórki w cudzysłowie, mogę to zrobić ... SubtractPrevValue („B5”). Ale to naprawdę kopiowanie / wklejanie ścięgien ścięgnistych i względne funkcje komórek.
Ale potem znalazłem obejście.
SpreadsheetApp.getActiveRange () JEST KOMÓRKĄ zawierającą formułę. To wszystko, co naprawdę musiałem wiedzieć. Numer wiersza. Poniższa funkcja pobiera NUMERIC numer kolumny i odejmuje poprzednie wystąpienie w tej kolumnie.
Ale potem odkryłem, że to naprawdę NAPRAWDĘ powolne. Jedna i dwie sekundy opóźnień, gdy wyświetla się „Myślenie ...” Więc wracam do masowo nieczytelnej, niemożliwej do utrzymania formuły arkusza.
źródło
Zamiast udostępnić obiekt „Zakres”, programiści Google przekazują prawie losowy typ danych. Opracowałem następujące makro, aby wydrukować wartość danych wejściowych.
źródło
Oto moja kompilacja poprzednich odpowiedzi
Pobiera bieżącą formułę i sprawdza, czy jest to Zasięg.
=GFR(A1:A5;1;C1:C2;D1&D2)
zwrotyDla pełnego składu TC może nazwać coś takiego
źródło
Utwórz funkcję i przekaż zakres jako argument:
Wykorzystanie w arkuszu kalkulacyjnym:
Wyświetli wartość jako
sum(A1:A10)
.źródło