Ich möchte eine Funktion erstellen, die einen Bereich umfasst ... so etwas wie:
function myFunction(range) {
var firstColumn = range.getColumn();
// loop over the range
}
Eine Zelle würde darauf verweisen mit:
=myFunction(A1:A4)
Das Problem ist, dass der Parameter bei diesem Versuch nur die Werte an die Funktion weitergibt. Daher kann ich keine der Range-Methoden verwenden, wie z getColumn()
. Wenn ich das versuche, wird der folgende Fehler angezeigt:
Fehler: TypeError: Die Funktion getColumn in Objekt 1,2,3 kann nicht gefunden werden.
Wie kann ich einen tatsächlichen Bereich anstatt nur die Werte an eine meiner benutzerdefinierten Funktionen senden?
range
wird als 2D-Array von Javascript behandelt. Mit können Sie die Anzahl der Zeilenrange.length
und mit die Anzahl der Spalten ermittelnrange[0].length
. Wenn Sie den Wert von Zeile zu erhaltenr
und Spaltec
Verwendung:range[r][c]
.quelle
=myFunction(C1:F1)
, wird in der Funktionrange[0][0]
der Wert vonC1
,range[0][1]
der Wert vonD1
,range[0][2]
der Wert vonE1
usw. zurückgegeben. Ist das klar?=weightedAverage(B3:D3,$B$2:$D$2)
, ich möchte die Funktion fehlersicherer machen, indem ich das zweite Argument nicht senden muss (dh ich möchte es als aufrufen=weightedAverage(B3:D3)
), und dann muss der Code automatisch wissen, dass der Bereich bei B beginnt und bei endet D, also bekommt es die entsprechenden Werte aus der 2. Reihe. Hinweis: Der Wert "2" kann fest codiert werden, "B" sollte jedoch nicht fest codiert werden.B
aus einer gegebenen Situation herausholen könnenrange
. Ich empfehle Ihnen, die Kurzanleitung ( goo.gl/hm0xT ) zu lesen , um eine Vorstellung davon zu bekommen, wie Sie mit Bereichen und Zellen spielen können.Wenn Sie eine
Range
an eine Google-Tabellenkalkulationsfunktion übergeben, wird das FrameworkparamRange.getValues()
implizit ausgeführt und Ihre Funktion empfängt die Werte im Bereich als zweidimensionales Array von Zeichenfolgen, Zahlen oder Objekten (wieDate
). DasRange
Objekt wird nicht an Ihre benutzerdefinierte Tabellenkalkulationsfunktion übergeben.Die folgende
TYPEOF()
Funktion gibt Auskunft darüber, welche Art von Daten Sie als Parameter erhalten. Die Formel=TYPEOF(A1:A4)
Ruft das Skript folgendermaßen auf:
quelle
Alternativ können Sie, inspiriert durch den Kommentar von @Lipis, Ihre Funktion mit den Zeilen- / Spaltenkoordinaten als zusätzlichen Parametern aufrufen:
In diesem Formular kann die Formel einfach in andere Zellen kopiert (oder gezogen) werden, und die Zell- / Bereichsreferenzen werden automatisch angepasst.
Ihre Skriptfunktion müsste als solche aktualisiert werden:
Man beachte , daß die
getRange
Funktion übernimmtstartRow
,startColumn
und dann Anzahl der Zeilen und Anzahl der Spalten - nicht beenden Reihe und Ende Spalte. Also die Arithmetik.quelle
Das kann gemacht werden . Sie können einen Verweis auf den übergebenen Bereich erhalten, indem Sie die Formel in der aktiven Zelle analysieren, die die Formel enthält. Dies setzt voraus, dass die benutzerdefinierte Funktion für sich allein und nicht als Teil eines komplexeren Ausdrucks verwendet wird: z . B.
=myfunction(A1:C3)
nicht=sqrt(4+myfunction(A1:C3))
.Diese Funktion gibt den ersten Spaltenindex des übergebenen Bereichs zurück.
quelle
Ich habe die ausgezeichnete Idee in der Antwort von user79865 erweitert , damit sie für mehr Fälle funktioniert und mehrere Argumente an die benutzerdefinierte Funktion übergeben werden.
Um es zu verwenden, kopieren Sie den folgenden Code und übergeben Sie ihm in Ihrem benutzerdefinierten Funktionsaufruf
GetParamRanges()
wie folgt Ihren Funktionsnamen:Hier ist ein Beispiel, um die Farbe einer Zelle zurückzugeben:
Hier ist der Code und einige weitere Erklärungen:
quelle
Ich unterscheide zwei verschiedene benutzerdefinierte Funktionen in Google Spreadsheet über Google Apps Script:
Die erste Funktion kann fast alles. Abgesehen vom Aufrufen des Tabellenkalkulationsdienstes kann er auf die Google Mail-App oder einen von Google bereitgestellten Dienst zugreifen. API-Aufrufe verlangsamen den Prozess. Ein Bereich kann weitergegeben oder über die Funktion abgerufen werden, um auf alle verfügbaren Methoden zuzugreifen.
Die zweite Funktion ist nur auf die "Tabellenkalkulation" beschränkt. Hier kann man mit JavaScript die Daten überarbeiten. Diese Funktionen sind normalerweise sehr schnell. Ein übergebener Bereich ist nichts anderes als ein 2D-Array, das Werte enthält.
In Ihrer Frage rufen Sie zunächst die
.getColumn()
Methode auf. Dies weist eindeutig darauf hin, dass Sie eine benutzerdefinierte Funktion vom Typ 1 benötigen, wie oben beschrieben.In der folgenden Antwort erfahren Sie, wie Sie die Tabellenkalkulation und das Tabellenblatt festlegen, um eine benutzerdefinierte Funktion zu erstellen.
quelle
Ich habe vor ein paar Monaten daran gearbeitet und mir einen sehr einfachen Kludge ausgedacht: Erstelle ein neues Blatt mit dem Namen jeder Zelle als Inhalt: Zelle A1 könnte so aussehen:
Nennen Sie das Blatt "Ref". Wenn Sie anstelle des Inhalts einen Verweis auf eine Zelle als Zeichenfolge benötigen, verwenden Sie Folgendes:
Natürlich müssen Sie prüfen, ob der Funktion eine Zeichenfolge (eine Zelle) oder ein 1D- oder 2D-Array übergeben wird. Wenn Sie ein Array erhalten, enthält es alle Zelladressen als Zeichenfolgen, aber anhand der ersten Zelle sowie der Breite und Höhe können Sie herausfinden, was Sie benötigen.
quelle
Ich habe den ganzen Morgen daran gearbeitet und Beweise dafür gesehen, worüber die obigen Nicht-Antworten sprechen. Senseful und ich wollen beide die ADRESSE der übergebenen Zelle, nicht den Wert. Und die Antwort ist sehr einfach. Das geht nicht.
Ich habe einige Problemumgehungen gefunden, die darauf beruhen, herauszufinden, in welcher Zelle die Formel enthalten ist. Es ist schwer zu sagen, ob dies Senseful weiter oben geholfen hätte. Also, was habe ich gemacht?
Spalte H ist Sophias (Siege - PrevWins) / (Verluste - PrevLosses)
(7 - 4) / (4 - 2) = 1,5
Wir wissen jedoch nicht, in welcher Zeile Sophia zuvor aufgetreten ist.
Dies kann alles mit VLOOKUP geschehen, wenn Sie A als Namensspalte fest codieren. Nach VLOOKUP wurden #NA (Name nicht gefunden) und # DIV0 (Nenner Null) abgerufen und mit = IF (IF (...)) umhüllt, um unter diesen Bedingungen einen ansehnlicheren Text anzuzeigen. Jetzt hatte ich einen ungeheuer großen Gesichtsausdruck, der unhandlich und unhaltbar war. Also wollte ich eine Makro-Erweiterung (existiert nicht) oder benutzerdefinierte Funktionen.
Aber als ich einen Helfer SubtractPrevValue (Zelle) machte, erhielt er "7" anstelle von B5. Es gibt keine integrierte Möglichkeit, Zellen- oder Bereichsobjekte aus den übergebenen Argumenten abzurufen.
Wenn der Benutzer den Zellennamen in doppelten Anführungszeichen von Hand eingibt, kann ich dies tun ... SubtractPrevValue ("B5"). Aber das erschwert das Kopieren / Einfügen und die relativen Zellmerkmale.
Aber dann habe ich einen Workaround gefunden.
SpreadsheetApp.getActiveRange () IST DIE ZELLE, die die Formel enthält. Das ist alles, was ich wirklich wissen musste. Die Zeilennummer. Die folgende Funktion verwendet eine NUMERIC-Spaltennummer und subtrahiert das vorherige Vorkommen in dieser Spalte.
Aber dann entdeckte ich, dass dies wirklich sehr langsam ist. Eine und zwei Sekunden Verzögerung, während "Denken ..." angezeigt wird. Ich komme also zurück zu der massiv unleserlichen, nicht zu wartenden Arbeitsblattformel.
quelle
Anstatt das "Range" -Objekt bereitzustellen, übergeben die Google-Entwickler so ziemlich einen zufälligen Datentyp. Deshalb habe ich das folgende Makro entwickelt, um den Wert der Eingabe auszudrucken.
quelle
Es gibt meine Zusammenstellung früherer Antworten
Es wird die aktuelle Formel verwendet und geprüft, ob es sich um einen Bereich handelt.
=GFR(A1:A5;1;C1:C2;D1&D2)
kehrt zurückFür die vollständige Komposition kann der TC so etwas nennen
quelle
Erstellen Sie eine Funktion und übergeben Sie den Bereich als Argument:
Verwendung in der Tabelle:
Es wird Wert als anzeigen
sum(A1:A10)
.quelle