6

Quando chiamo una funzione di foglio elettronico, ad esempio int(f2), la funzione opera sul valore nella cella. Se cell("F2") contiene 3,14159, il risultato sarebbe 3. Ma quando chiamo un diverso tipo di funzione - per esempio: row(f8) - la funzione prende il riferimento di cella, e non il valore, in questo caso, tornando 8.riferimenti di celle di passaggio alle funzioni del foglio di calcolo

Come faccio a far funzionare la mia funzione personalizzata con il riferimento, anziché il valore?

Posso passare una stringa e utilizzare getRange(), ma, se sposto o aggiorno le celle sul foglio, le stringhe non cambieranno.

Davvero semplice esempio:

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

Con questo nel codice del mio foglio, posso recuperare la formula C4 come questo: =GetFormula("C4")

Ma, questo argomento è una stringa, e avrei preferito passare un riferimento di cella. Un problema un po 'più complicato richiede che le celle chiamanti si aggiornino quando vengono copiate e incollate.

Qualche idea?

+1

Ecco una soluzione e non una soluzione - '= GetFormula (INDIRIZZO (ROW (F8), COLONNA (F8)))' – megabyte1024

+1

che farà quello che voglio, ma, ragazzo, è brutto! Ora, devo spiegarlo a chiunque lo veda, sai? – HardScale

+0

Thread correlato su [webapps.se]: [Come passare un intervallo in una funzione personalizzata in Google Spreadsheets?] (Http://webapps.stackexchange.com/questions/10629/how-to-pass-a-range- in-a-custom-function-in-google-spreadsheets /) –

risposta

1

stavo lavorando su questo un paio di mesi fa e si avvicinò con un semplice ripiego: creare un nuovo foglio con il nome di ogni cella come il suo contenuto: cella A1 potrebbe essere simile:

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

EDIT: Quanto sopra non funziona più. La mia nuova formula per "Ref"! A1 è

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

Nome del foglio "Ref". Poi, quando avete bisogno di un riferimento a una cella come una stringa invece del contenuto, è possibile utilizzare:

= some_new_function('Ref'!C45) 

Naturalmente, sarà necessario verificare che la funzione viene passata una stringa (una cella) o un Matrice 1D o 2D. Se ottieni un array, avrà tutti gli indirizzi di cella come stringhe, ma dalla prima cella e dalla larghezza e dall'altezza, puoi capire di cosa hai bisogno.

+0

puoi semplicemente passare _cell ("indirizzo", a1: z500) _ alla funzione personalizzata e quindi quella funzione può recuperare l'argomento stringa "lettura" dell'oggetto cella come indirizzo di cella, non è necessario il foglio aggiuntivo – mvidelgauz

+0

L'ho notato nell'OP. Le stringhe non si aggiornano quando le celle vengono spostate. – HardScale

+0

Non sai cosa intendi. Ho appena implementato una funzione che chiamo in questo modo: _MyFunc (CELL ("address", D17)) _ e funziona quando sposto la cella bersaglio ... – mvidelgauz

-2

Quando si passa un intervallo per una funzione personalizzata il parametro è di tipo Range, che è quindi possibile utilizzare il recuperare i valori, ecc

Edit: Questo a sua corretta.

+1

Questo è vero se chiamo la funzione da un'altra funzione. Ma, se uso la funzione in un foglio di calcolo, l'argomento viene automaticamente de-referenziato nel contenuto della cella. Se potessi darmi un esempio di una formula di foglio di calcolo che chiama una funzione personalizzata e può passare a quella funzione un intervallo, sarei davvero grato. – HardScale

+0

Le mie scuse, avevo frainteso il modo in cui l'intervallo è stato superato. Sei corretto, vengono passati solo i valori. –

3

(dal mio answer su app Web.) È possibile ottenere un riferimento all'intervallo passato analizzando la formula nella cella attiva, che è la cella contenente la formula. Ciò presuppone che la funzione personalizzata sia utilizzata da sola e non come parte di un'espressione più complessa: ad es., =myfunction(A1:C3), non =sqrt(4+myfunction(A1:C3)).

Il metodo supporta anche riferimenti ad altri fogli, ad esempio =myfunction(Sheet2!A3:B5) o =myfunction('Another Sheet'!B3:G7).

Come una demo, questa funzione restituisce il primo indice di colonna dell'intervallo passato. Questo bit è alla fine della funzione; la maggior parte si occupa dell'estrazione della gamma.

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