Come salvare le variabili temporanee nella formula di Fogli Google?


19

Sto cercando di creare una formula in un foglio di calcolo di Google che assomigli a questo:

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

Significa che se xè più piccolo di 0, return x + 1, else return x.

Tuttavia, di per xsé è un'espressione, ad es A1 + B1. Quindi ho finito con:

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

Come posso salvare l'espressione (A1 + B1)in una variabile temporanea in xmodo da poterlo fare? :

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

L'espressione corrente nel mio foglio di calcolo è simile alla seguente:

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))))
)

Sto cercando di farlo sembrare più corto e più gestibile in questo modo:

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
)

1
@pnuts, Hmm, le variabili sono parte integrante delle formule. L'hacking delle celle come variabili temporanee sembra una soluzione sporca perché le celle sono pensate per archiviare dati aziendali , non ram.
Pacerier,

1
@pnuts, non importa dove sia archiviato purché non sia archiviato nelle celle. Le celle sono pensate per l'archiviazione dei dati aziendali .
Pacerier,

1
@pnuts, Una soluzione di script sarebbe una possibile alternativa migliore per il prossimo. Finché i dati non compaiono in una cella è una soluzione praticabile.
Pacerier,

Risposte:


6

Spesso finisco per usare le celle come variabili per i calcoli usati spesso, e di fatto le nomina usando "intervalli nominali". Rende più facile pensare alla formula che stai cercando di sviluppare. Puoi nascondere quelle celle, se non vuoi che vengano visualizzate.


Lo prenderà come soluzione selezionata fino a quando non ne arriva una migliore.
Pacerier,

4

Risposta breve

Al momento, Fogli Google non ha una funzione per assegnare un nome a una variabile definita da una formula anziché da un riferimento di cella o intervallo. Per utilizzare una formula con questo tipo di variabili, l'alternativa è utilizzare funzioni personalizzate.

Funzioni personalizzate in Fogli Google

Le funzioni personalizzate sono definite nei progetti associati a Script di Google Apps o nei componenti aggiuntivi di Fogli Google. Potrebbero essere utilizzati solo per restituire valori, non per automatizzare attività come l'invio di un'e-mail.

Una funzione personalizzata è come una funzione JavaScript e potrebbe utilizzare JSDOC per aggiungere funzioni integrate come il completamento automatico e visualizzare l'helper formula popup. Inoltre, potrebbe essere incluso un messaggio di errore personalizzato.

Nel caso presentato nella domanda, la struttura desiderata della formula da mostrare in una cella dovrebbe avere la seguente struttura

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

dove xpotrebbe essere una funzione personalizzata.

Di seguito è riportato un semplice esempio di una funzione personalizzata che utilizza JSDOC .

/**
* 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();
}

La formula che utilizza la funzione personalizzata sopra con la struttura specificata nella domanda apparirà nel modo seguente

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

row() potrebbe essere usato al posto di una costante per avere come input la riga in cui è posizionata la formula.

Per "emulare" la formula esplicita presentata nella domanda, le formule incorporate devono essere sostituite dalle funzioni JavasScript / Google Apps Script.

Riferimenti


Sarebbe possibile definire funzioni personalizzate utilizzando le funzioni di Google Sheet (anziché JS)? Non ho trovato nulla in questa direzione, quindi ne dubito.
Comprese il

@anderstood: Al momento non è possibile. Vedi stackoverflow.com/questions/3686061/…
Rubén il

3

Sto tentando di farlo (sono d'accordo che sarebbe una funzione molto utile, specialmente per le formule lunghe. Ecco cosa ho scritto finora:

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

Teoricamente, ciò sarebbe utile per semplificare una formula cellulare complessa come:

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

in questo:

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

Aggiuntivo D_VAR#'se VAR#'spotrebbe essere scritto nello script per consentire dichiarazioni e chiamate con più variabili secondo necessità.

Tuttavia, sembra che D_VAR0non memorizzi correttamente la variabile spostata nella matrice di variabili [].

Se inserisco manualmente un elemento nell'array, VAR0 è in grado di accedervi e restituirlo nella cella attiva. Per esempio:

var variables = ["test"];

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

Questo mi lascia con due domande. Se sono possibili le seguenti condizioni, penso che sia possibile dichiarare e chiamare variabili temporanee tramite una funzione personalizzata:

  1. Se le funzioni personalizzate possono accedere agli elementi dell'array, possono anche memorizzare gli elementi in un array? Se é cosi, come?

  2. Se le funzioni personalizzate possono memorizzare elementi in un array, sono accessibili solo all'interno della stessa formula contigua nella stessa cella? O è possibile accedere alla stessa variabile memorizzata in una cella diversa? Esempio:

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.