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?
The data.
[A] [B] [C] [D] [E] [F] [H]
[1] Name Wins Losses Shots Points Fouls Most recent
WL Ratio
[2] Sophia 4 2 15 7 1 0
[3] Gloria 11 3 11 6 0 0
[4] Rene 2 0 4 0 0 0
[5] Sophia 7 4 18 9 1 1.5
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.
function SubtractPrevValue(colNum)
{
var curCell = SpreadsheetApp.getActiveRange();
var curSheet = curCell.getSheet();
var curRowIdx = curCell.getRowIndex();
var name = curSheet.getRange(curRowIdx, 1).getValue(); // name to match
var curVal = curSheet.getRange(curRowIdx, colNum).getValue();
var foundRowIdx = -1;
for (var i=curRowIdx-1;i>1;i--)
{
if (curSheet.getRange(i, 2).getValue() == name)
{
return curVal - curSheet.getRange(i, colNum).getValue();
}
}
return curVal; //default if no previous found
}
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.