6

Cuando llamo a una función de hoja de cálculo, digamos int(f2), la función opera sobre el valor en la celda. Si cell("F2") contiene 3,14159, el resultado sería 3. Pero cuando llamo a un tipo diferente de la función - por ejemplo: row(f8) - La función toma la referencia de celda, y no el valor, en este caso, volviendo 8.referencias de celda de paso a funciones de hoja de cálculo

¿Cómo hago para que mi función personalizada funcione con la referencia, en lugar del valor?

Puedo pasar una cadena y usar getRange(), pero si muevo o actualizo las celdas de la hoja, las cadenas no cambiarán.

ejemplo muy simple:

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

Con esto en código de mi hoja, que puede recuperar la fórmula en C4 como esto: =GetFormula("C4")

embargo, este argumento es una cadena, y preferiría pasar una referencia de celda Un problema algo más complicado requiere que las células llamantes se actualicen cuando se copian y se pegan.

¿Alguna idea?

+1

Aquí es una solución temporal y no una solución - '= GetFormula (DIRECCIÓN (FILA (F8), columna (F8)))' – megabyte1024

+1

que va a hacer lo que quiero, pero, chico, ¿es feo! Ahora, tengo que explicárselo a cualquiera que lo vea, ¿sabes? – HardScale

+0

Tema relacionado en [webapps.se]: [¿Cómo pasar un rango a una función personalizada en Google Spreadsheets?] (Http://webapps.stackexchange.com/questions/10629/how-to-pass-a-range- into-a-custom-function-in-google-spreadsheets /) –

Respuesta

1

yo estaba trabajando en esto hace unos meses y se acercó con un muy simple kludge: crear una nueva hoja con el nombre de cada célula como su contenido: La celda A1 podría parecerse a:

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

EDITAR: Lo anterior ya no funciona. Mi nueva fórmula para 'Ref'! A1 es

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

Nombre la hoja "Ref". Luego, cuando se necesita una referencia a una celda como una cadena en lugar de los contenidos, que utilice:

= some_new_function('Ref'!C45) 

Por supuesto, usted tendrá que comprobar si la función se pasa una cadena (una célula) o una Matriz 1D o 2D. Si obtienes una matriz, tendrá todas las direcciones de las celdas como cadenas, pero desde la primera celda y el ancho y alto, puedes descubrir lo que necesitas.

+0

simplemente puede pasar _cell ("dirección", a1: z500) _ a la función personalizada y luego esa función puede recuperar 'cell' objeto leyendo el argumento de cadena como una dirección de celda, sin necesidad de hoja adicional – mvidelgauz

+0

Lo noté en el OP. Las cadenas no se actualizan cuando las celdas se mueven. – HardScale

+0

No estoy seguro de lo que quiere decir. Acabo de implementar una función que llamo así: _MyFunc (CELL ("dirección", D17)) _ y funciona cuando muevo la celda objetivo ... – mvidelgauz

-2

Cuando se pasa un rango de una función personalizada el parámetro es de tipo Range, que luego se puede utilizar el buscar a los valores, etc.

Editar: Esto incorrecta.

+1

Eso es cierto si llamo a la función desde otra función. Pero, si uso la función en una hoja de cálculo, la arg se desreferencia automáticamente en el contenido de la celda. Si pudiera darme un ejemplo de una fórmula de hoja de cálculo que llama a una función personalizada y puede pasarle a esa función un Rango, le estaría muy agradecido. – HardScale

+0

Mis disculpas, no entendí cómo se aprobó el rango. Estás en lo correcto, solo se pasan los valores. –

3

(desde mi answer en aplicaciones web). Se puede obtener una referencia al rango pasado al analizar la fórmula en la celda activa, que es la celda que contiene la fórmula. Esto supone que la función personalizada se usa por sí misma y no como parte de una expresión más compleja: por ejemplo, =myfunction(A1:C3), no =sqrt(4+myfunction(A1:C3)).

El método también admite referencias a otras hojas, como =myfunction(Sheet2!A3:B5) o =myfunction('Another Sheet'!B3:G7).

Como una demostración, esta función devuelve el primer índice de columna del rango pasado. Este bit está al final de la función; la mayor parte se ocupa de la extracción de rango.

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; 
} 
Cuestiones relacionadas