Wie speichere ich temporäre Variablen in einer Google Sheets-Formel?

19

Ich versuche, eine Formel in einer Google-Tabelle zu erstellen, die so aussieht:

if (x < 0, x + 1, x)

Es bedeutet, wenn xkleiner ist als 0, return x + 1, sonst return x.

Doch xselbst ist ein Ausdruck, zum Beispiel A1 + B1. So endete ich mit:

if ((A1 + B1) < 0, (A1 + B1) + 1, (A1 + B1))

Wie kann ich den Ausdruck (A1 + B1)in einer temporären Variablen speichern x, damit ich dies tun kann? :

x = (A1 + B1);
if (x < 0, x + 1, x);

Der aktuelle Ausdruck in meiner Tabelle sieht folgendermaßen aus:

if(
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    < 0,
    1 +
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    ,
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
)

Ich versuche, es kürzer und übersichtlicher zu gestalten:

x = timevalue(Sheet1!$D10) - timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))));
if(
    x
    < 0,
    1 +
    x
    ,
    x
)
Pacerier
quelle
1
@pnuts, Hmm, Variablen sind ein wesentlicher Bestandteil von Formeln. Das Hacken von Zellen als temporäre Variablen fühlt sich wie eine schmutzige Lösung an, da Zellen zum Speichern von Geschäftsdaten und nicht zum Speichern von RAMs gedacht sind .
Pacerier
1
@pnuts, Es spielt keine Rolle, wo es gespeichert ist, solange es nicht in den Zellen gespeichert ist. Zellen dienen zum Speichern von Geschäftsdaten .
Pacerier
1
@pnuts, Eine Skriptlösung wäre eine mögliche nächstbeste Alternative. Solange die Daten nicht in einer Zelle angezeigt werden, ist dies eine praktikable Lösung.
Pacerier

Antworten:

6

Am Ende verwende ich häufig Zellen als Variablen für häufig verwendete Berechnungen und benenne sie tatsächlich mit "benannten Bereichen". Es macht es einfacher, über die Formel nachzudenken, die Sie entwickeln möchten. Sie können diese Zellen ausblenden, wenn Sie nicht möchten, dass sie angezeigt werden.

Kostas Georgokitsos
quelle
Wird dies als gewählte Lösung nehmen, bis eine bessere kommt.
Pacerier
4

Kurze Antwort

Derzeit verfügt Google Sheets nicht über die Funktion, einer durch eine Formel definierten Variablen anstelle eines Zell- oder Bereichsverweises einen Namen zuzuweisen. Um eine Formel mit solchen Variablen zu verwenden, können Sie auch benutzerdefinierte Funktionen verwenden.

Benutzerdefinierte Funktionen in Google Sheets

Benutzerdefinierte Funktionen werden in an Google Apps Scripts gebundenen Projekten oder Google Sheets-Add-Ons definiert. Sie können nur verwendet werden, um Werte zurückzugeben, nicht um Aufgaben wie das Senden einer E-Mail zu automatisieren.

Eine benutzerdefinierte Funktion ähnelt einer JavaScript-Funktion und kann mithilfe von JSDOC integrierte Funktionen wie die automatische Vervollständigung hinzufügen und den Popup-Formel-Helfer anzeigen. Auch eine benutzerdefinierte Fehlermeldung könnte enthalten sein.

In dem in der Frage dargestellten Fall sollte die gewünschte Struktur der in einer Zelle anzuzeigenden Formel die folgende Struktur haben

if(x < 0, 1 + x, x)

wo xkönnte eine benutzerdefinierte Funktion sein.

Das Folgende ist ein einfaches Beispiel für eine benutzerdefinierte Funktion, die JSDOC verwendet .

/**
* Returns the cell value of the specified row in column A of Sheet1.
* @param {number}   row_number   Input the row number.
* @return The cell value of the specified row in column A of Sheet1.       
* @customfunction
*/
function z(row_number) {
  if(typeof(row_number) != 'number') 
    throw new Error("A row number is required");
  return SpreadsheetApp
           .getActiveSheet()
           .getRange("Sheet1!A"+row_number)
           .getValue();
}

Die Formel unter Verwendung der obigen benutzerdefinierten Funktion mit der in der Frage angegebenen Struktur sieht folgendermaßen aus

=if(z(10) < 0, 1 + z(10), z(10))

row() könnte anstelle einer Konstante verwendet werden, um als Eingabe die Zeile zu verwenden, in der die Formel platziert ist.

Um die in der Frage dargestellte explizite Formel zu "emulieren", sollten die integrierten Formeln durch JavasScript / Google Apps Script-Funktionen ersetzt werden.

Verweise

Rubén
quelle
Wäre es möglich, benutzerdefinierte Funktionen mithilfe der Funktionen von Google Sheet (anstelle von JS) zu definieren? Ich habe nichts in dieser Richtung gefunden, also bezweifle ich es.
Anderstood
@anderstood: Zu diesem Zeitpunkt ist es nicht möglich. Siehe stackoverflow.com/questions/3686061/…
Rubén
3

Ich mache einige Versuche damit (ich stimme zu, dass dies eine sehr nützliche Funktion sein würde, insbesondere für lange Formeln. Folgendes habe ich bisher geschrieben:

//array to store variables
var variables = [];

//Wrap a formula with "D_VAR0()" for later use
function D_VAR0(formula) {
  variables.push(formula);
}

//Write "VAR0" to access the 0th element of variables[] (which could be a long formula)
function VAR0() {
  return variables[0];
}

Theoretisch wäre dies nützlich, um eine komplexe Zellformel zu vereinfachen, wie zum Beispiel:

=IF((A2+B2)/B3<16, (A2+B2)/B3, ((A2+B2)/B3)*45)

das mögen:

=IF(D_VAR0((A2+B2)/B3)<16, VAR0, VAR0*45)

Zusätzlich D_VAR#'sund VAR#'skann in das Skript geschrieben werden, um bei Bedarf mehrere Variablendeklarationen und Aufrufe zu ermöglichen.

Es scheint jedoch, dass D_VAR0die umgebrochene Variable nicht richtig im variables [] -Array gespeichert wird.

Wenn ich ein Element manuell in das Array eingebe, kann VAR0 darauf zugreifen und es in die aktive Zelle zurückgeben. Beispielsweise:

var variables = ["test"];

//results in the active cell being set to "test"
function VAR0() {
     return variables[0];
}

Das lässt mich mit zwei Fragen zurück. Wenn das Folgende möglich ist, ist es meines Erachtens möglich, temporäre Variablen über eine benutzerdefinierte Funktion zu deklarieren und aufzurufen:

  1. Wenn benutzerdefinierte Funktionen auf Array-Elemente zugreifen können , können sie auch Elemente in einem Array speichern ? Wenn das so ist, wie?

  2. Wenn benutzerdefinierte Funktionen Elemente in einem Array speichern können, sind sie dann nur in derselben zusammenhängenden Formel in derselben Zelle verfügbar? Oder kann auf dieselbe gespeicherte Variable in einer anderen Zelle zugegriffen werden? Beispiel:

Cell A1 = D_VAR0(sum(3,5))

Cell D4 = VAR0() //would this return 8 in cell D4? It hasn't worked in my testing.

Andrew
quelle