6

Po wywołaniu funkcji arkusza kalkulacyjnego, na przykład int(f2), funkcja działa na wartości w komórce. Jeśli cell("F2") zawiera 3.14159, wynik byłby 3. Ale gdy zgłoszę inny typ funkcji - na przykład: row(f8) - funkcja wykonuje odwołanie do komórki, a nie wartości, w tym przypadku, wracając 8.przekazywanie odwołań do komórek do funkcji arkusza kalkulacyjnego

Jak mogę przekonwertować swoją funkcję niestandardową na referencję, a nie na wartość?

Mogę podać ciąg znaków i użyć getRange(), ale jeśli przeniesię lub zaktualizuję komórki na arkuszu, ciągi znaków nie zmienią się.

Naprawdę prosty przykład:

function GetFormula(cellname) { 
    return SpreadsheetApp.getActiveSheet().getRange(cellname).getFormula(); 
} 

Mając to w kodzie mojego arkusza, można odzyskać formułę w C4 takiego: =GetFormula("C4")

Ale ten argument jest ciągiem znaków, a wolałbym przejść odwołanie do komórki. Nieco bardziej skomplikowany problem wymaga aktualizacji komórek wywołujących po skopiowaniu i wklejeniu.

Wszelkie pomysły?

+1

Tutaj jest rozwiązanie, a nie rozwiązanie - '= GetFormula (ADDRESS (ROW (F8), kolumna (F8)))' – megabyte1024

+1

To będzie robić to, co chcę, ale, chłopcze, to jest brzydki! Muszę teraz wyjaśnić to każdemu, kto to widzi, wiesz? – HardScale

+0

Powiązany wątek na [webapps.se]: [Jak przekazać zakres do niestandardowej funkcji w Arkuszach kalkulacyjnych Google?] (Http://webapps.stackexchange.com/questions/10629/how-to-pass-a-range- w-a-custom-function-in-google-spreadsheets /) –

Odpowiedz

1

Pracowałem na to kilka miesięcy temu i wymyślił bardzo prosty kludge: utworzyć nowy arkusz z nazwą każdej komórce jako jego zawartość: komórki A1 mogłaby wyglądać następująco:

= arrayformula(cell("address",a1:z500)) 

EDYCJA: powyższe nie działa. Moja nowa formuła "Ref"! A1 to

= ArrayFormula(char(64+column(A1:Z100))&row(A1:Z100)) 

Nazwij arkusz "Ref". Wtedy kiedy trzeba odwołanie do komórki jako ciąg zamiast zawartości, należy użyć:

= some_new_function('Ref'!C45) 

Oczywiście, trzeba sprawdzić, czy funkcja zostanie przeniesiony do strun (jedna komórka) lub 1D lub 2D Array. Jeśli otrzymasz tablicę, wszystkie jej adresy komórkowe będą miały postać łańcuchów, ale z pierwszej komórki oraz z szerokości i wysokości możesz dowiedzieć się, czego potrzebujesz.

+0

można po prostu przekazać _cell ("adres", a1: z500) _ do funkcji niestandardowej, a następnie funkcja ta może pobrać argument "ciąg znaków" obiektu komórki jako adres komórki, bez potrzeby dodatkowego arkusza – mvidelgauz

+0

Zauważyłem, że w OP. Ciągi nie aktualizują się, gdy komórki są przenoszone. – HardScale

+0

Nie jesteś pewien co masz na myśli. Właśnie zaimplementowałem funkcję, którą nazywam w ten sposób: _MyFunc (CELL ("adres", D17)) _ i działa, gdy poruszam komórkę docelową ... – mvidelgauz

-2

Po przejechaniu odległości do funkcji niestandardowej parametr jest typu Range, które można następnie wykorzystać fetch wartości itp

Edit: To w nieprawidłowy.

+1

To prawda, jeśli zadzwonię do tej funkcji z innej funkcji. Jeśli jednak użyję funkcji w arkuszu kalkulacyjnym, argument zostanie automatycznie usunięty z zawartości komórki. Jeśli mógłbyś mi podać przykład formuły arkusza kalkulacyjnego, która wywołuje funkcję niestandardową i może przekazać tę funkcję Zakresowi, byłbym naprawdę wdzięczny. – HardScale

+0

Przepraszam, źle zrozumiałem, w jaki sposób zasięg został przekroczony. Masz rację, tylko wartości są przekazywane. –

3

(Z mojego answer w aplikacji sieci Web.) Można uzyskać odniesienie do podanego zakresu, analizując formułę w aktywnej komórce, która jest komórką zawierającą formułę. To sprawia, że ​​funkcja niestandardowa jest używana samodzielnie, a nie jako część bardziej złożonego wyrażenia: np. =myfunction(A1:C3), a nie =sqrt(4+myfunction(A1:C3)).

Metoda obsługuje również odniesienia do innych arkuszy, takich jak =myfunction(Sheet2!A3:B5) lub =myfunction('Another Sheet'!B3:G7).

W wersji demonstracyjnej funkcja zwraca pierwszy indeks kolumny podanego zakresu. Ten bit jest na samym końcu funkcji; większość zajmuje się ekstrakcją zakresu.

function myfunction(reference) { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var formula = SpreadsheetApp.getActiveRange().getFormula(); 
    var args = formula.match(/=\w+\((.*)\)/i)[1].split('!'); 
    try { 
    if (args.length == 1) { 
     var range = sheet.getRange(args[0]); 
    } 
    else { 
     sheet = ss.getSheetByName(args[0].replace(/'/g, '')); 
     range = sheet.getRange(args[1]); 
    } 
    } 
    catch(e) { 
    throw new Error(args.join('!') + ' is not a valid range'); 
    } 

    // everything so far was only range extraction 
    // the specific logic of the function begins here 

    var firstColumn = range.getColumn(); // or whatever you want to do with the range 
    return firstColumn; 
}