6

Wenn ich eine Tabellenkalkulationsfunktion anrufe, z. B. int(f2), arbeitet die Funktion mit dem Wert in der Zelle. Wenn cell("F2") 3,14159 enthält, wäre das Ergebnis 3. Aber wenn ich eine andere Art von Funktion aufrufen - zum Beispiel: row(f8) - die Funktion nimmt den Zellbezug, und nicht den Wert, in diesem Fall der Rückkehr 8.Zellenreferenzen an Tabellenkalkulationsfunktionen übergeben

Wie bekomme ich meine benutzerdefinierte Funktion, um mit der Referenz statt mit dem Wert zu arbeiten?

Ich kann eine Zeichenfolge übergeben und verwenden, aber wenn ich die Zellen auf dem Blatt verschieben oder aktualisieren, werden die Zeichenfolgen nicht geändert.

wirklich einfaches Beispiel:

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

In diesen Code meines Blattes ist, kann ich die Formel in C4 wie folgt abrufen: =GetFormula("C4")

Aber dieses Argument ein String ist, und ich würde eher passieren eine Zellreferenz. Ein etwas komplizierteres Problem erfordert, dass die aufrufenden Zellen aktualisiert werden, wenn sie kopiert und eingefügt werden.

Irgendwelche Ideen?

+1

hier eine Abhilfe ist und keine Lösung - '= GetFormula (ADDRESS (ROW (F8), COLUMN (F8)))' – megabyte1024

+1

Das wird tun, was ich will, aber, Junge, ist es hässlich! Jetzt muss ich es jedem erklären, der es sieht, weißt du? – HardScale

+0

Verwandte Themen auf [webapps.se]: [Wie übertrage ich einen Bereich in eine benutzerdefinierte Funktion in Google Spreadsheets?] (Http://webapps.stackexchange.com/questions/10629/how-to-pass-a-range-) Into-a-custom-Funktion in Google-Tabellen /) –

Antwort

1

Ich war vor ein paar Monaten daran gearbeitet und kam mit einem sehr einfachen kludge up: mit dem Namen jeder Zelle als den Inhalt ein neues Blatt erstellen: Zelle A1 könnte wie folgt aussehen:

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

EDIT: Das obige funktioniert nicht mehr. Meine neue Formel für 'Ref'! A1 ist

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

Benennen Sie das Blatt "Ref". Dann, wenn Sie einen Verweis auf eine Zelle als eine Zeichenfolge anstelle des Inhalts benötigen, verwenden Sie:

= some_new_function('Ref'!C45) 

Natürlich müssen Sie überprüfen, ob die Funktion eine Zeichenfolge (eine Zelle) übergeben wird oder ein 1D- oder 2D-Array. Wenn Sie ein Array erhalten, wird es alle Zellenadressen als Strings haben, aber von der ersten Zelle und der Breite und Höhe können Sie herausfinden, was Sie brauchen.

+0

Sie können _cell ("address", a1: z500) einfach an die benutzerdefinierte Funktion übergeben, und dann kann diese Funktion "cell" -Objektlesestringargument als Zelladresse abrufen, keine Notwendigkeit für ein zusätzliches Blatt – mvidelgauz

+0

, das habe ich im OP notiert. Zeichenfolgen werden nicht aktualisiert, wenn sich die Zellen bewegen. – HardScale

+0

Nicht sicher, was du meinst. Ich habe gerade eine Funktion implementiert, die ich so nenne: _MyFunc (CELL ("address", D17)) _ und es funktioniert, wenn ich die Zielzelle verschiebe ... – mvidelgauz

-2

Wenn Sie einen Bereich, um eine benutzerdefinierte Funktion der Parametertyp ist von Range passieren, die Sie dann die Werte holen können, usw.

bearbeiten: Dies falsch.

+1

Das ist wahr, wenn ich die Funktion von einer anderen Funktion aufrufen. Aber wenn ich die Funktion in einer Tabellenkalkulation verwende, wird der arg automatisch in den Inhalt der Zelle referenziert. Wenn Sie mir ein Beispiel für eine Tabellenkalkulationsformel geben könnten, die eine benutzerdefinierte Funktion aufruft und dieser Funktion einen Bereich übergeben kann, wäre ich wirklich dankbar. – HardScale

+0

Ich entschuldige mich, ich hatte missverstanden, wie der Bereich bestanden wurde. Du hast Recht, nur die Werte werden übergeben. –

3

(Von meiner answer auf Web-Apps.) Man kann einen Verweis auf den übergebenen Bereich durch Analysieren der Formel in der aktiven Zelle erhalten, die die Zelle mit der Formel ist. Dies führt zu der Annahme, dass die benutzerdefinierte Funktion allein und nicht als Teil eines komplexeren Ausdrucks verwendet wird: z. B. =myfunction(A1:C3), nicht =sqrt(4+myfunction(A1:C3)).

Die Methode unterstützt auch Verweise auf andere Blätter, wie =myfunction(Sheet2!A3:B5) oder =myfunction('Another Sheet'!B3:G7).

Als Demo gibt diese Funktion den ersten Spaltenindex des übergebenen Bereichs zurück. Dieses Bit befindet sich am Ende der Funktion. das meiste befasst sich mit der Entfernung von Entfernungen.

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; 
}