Quiero crear una función que tome un rango ... algo como:
function myFunction(range) {
var firstColumn = range.getColumn();
// loop over the range
}
Una celda lo referenciaría usando:
=myFunction(A1:A4)
El problema es que cuando trato de hacer esto, el parámetro parece que solo está pasando los valores a la función. Por lo tanto, no puedo usar ninguno de los métodos Range como getColumn()
. Cuando intento hacerlo, aparece el siguiente error:
error: TypeError: no se puede encontrar la función getColumn en el objeto 1,2,3.
¿Cómo puedo enviar un rango real en lugar de solo los valores a una de mis funciones personalizadas?
range
se trata como la matriz 2d de javascript. Puede obtener el número de filas conrange.length
y el número de columnas conrange[0].length
. Si desea obtener el valor de la filar
y la columna dec
uso:range[r][c]
.fuente
=myFunction(C1:F1)
entonces dentro de la funciónrange[0][0]
devolverá el valor deC1
,range[0][1]
devolverá el valor deD1
,range[0][2]
devolverá el valor deE1
, etc. ¿Está claro?=weightedAverage(B3:D3,$B$2:$D$2)
, me gustaría hacer que la función sea más a prueba de errores al no tener que enviar el segundo argumento (es decir, quiero llamarlo como=weightedAverage(B3:D3)
), y luego hacer que el código sepa automáticamente que el rango comienza en B y termina en D, por lo que obtiene los valores correspondientes de la segunda fila. Nota: el valor "2" se puede codificar, pero "B" no se debe codificar.B
de un hechorange
. Te sugiero que revises la guía de inicio ( goo.gl/hm0xT ), si aún no lo has hecho, para tener una idea de cómo puedes jugar con rangos y celdas.Al pasar un
Range
a una función de hoja de cálculo de Google, el marco se ejecutaparamRange.getValues()
implícitamente y su función recibe los valores en el Rango como una matriz bidimensional de cadenas, números u objetos (comoDate
). ElRange
objeto no se pasa a su función de hoja de cálculo personalizada.La
TYPEOF()
siguiente función le indicará qué tipo de datos recibe como parámetro. La formula=TYPEOF(A1:A4)
llamará al script así:
fuente
Como alternativa, inspirado en el comentario de @Lipis, puede llamar a su función con las coordenadas de fila / columna como parámetros adicionales:
De esta forma, la fórmula se puede copiar (o arrastrar) fácilmente a otras celdas, y las referencias de celda / rango se ajustarán automáticamente.
Su función de Script debería actualizarse como tal:
Tenga en cuenta que la
getRange
función tomastartRow
,startColumn
y luego el número de filas y el número de columnas - no termina fila y final de la columna. Así, la aritmética.fuente
Esto se puede hacer . Se puede obtener una referencia al rango aprobado 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í sola y no como parte de una expresión más compleja: por ejemplo
=myfunction(A1:C3)
, no=sqrt(4+myfunction(A1:C3))
.Esta función devuelve el índice de la primera columna del rango pasado.
fuente
He extendido la excelente idea en la respuesta del usuario 79865 , para que funcione para más casos y con múltiples argumentos pasados a la función personalizada.
Para usarlo, copie el código a continuación y luego, en su función personalizada, llame
GetParamRanges()
así, pasándole el nombre de su función:Aquí hay un ejemplo para devolver el color de una celda:
Aquí está el código y alguna explicación más:
fuente
Distingo dos funciones personalizadas diferentes en la hoja de cálculo de Google, a través de Google Apps Script:
La primera función es capaz de hacer casi cualquier cosa. Además de llamar al servicio de hoja de cálculo, puede recurrir a GmailApp o cualquier servicio puesto a disposición por Google. Las llamadas a la API ralentizarán el proceso. Se puede pasar un rango o recuperarlo a través de la función para acceder a todos los métodos disponibles.
La segunda función se limita únicamente a la "Hoja de cálculo". Aquí se puede utilizar JavaScript para volver a trabajar los datos. Estas funciones son normalmente muy rápidas. Un rango pasado no es más que una matriz 2D que contiene valores.
En su pregunta, comienza llamando al
.getColumn()
método. Esto indica claramente que necesita una función personalizada de tipo 1, como se describió anteriormente.Consulte la siguiente respuesta sobre cómo configurar la hoja de cálculo y la hoja para crear una función personalizada.
fuente
Estuve trabajando en esto hace unos meses y se me ocurrió un error muy simple: crear una nueva hoja con el nombre de cada celda como contenido: la celda A1 podría verse así:
Nombre de la hoja "Ref". Luego, cuando necesita una referencia a una celda como una cadena en lugar del contenido, usa:
Por supuesto, deberá verificar si la función pasa una cadena (una celda) o una matriz 1D o 2D. Si obtiene una matriz, tendrá todas las direcciones de las celdas como cadenas, pero desde la primera celda y el ancho y la altura, puede averiguar lo que necesita.
fuente
He estado trabajando en esto toda la mañana y viendo evidencia de lo que discuten las no respuestas anteriores. Senseful y yo queremos la DIRECCIÓN de la celda pasada, no el valor. Y la respuesta es muy fácil. No se puede hacer.
Encontré algunas soluciones que dependen de averiguar qué celda contiene la fórmula. Es difícil decir si esto hubiera ayudado a Senseful arriba. Entonces, ¿qué estaba haciendo?
La columna H es Sophia (victorias - victorias previas) / (pérdidas - pérdidas previas)
(7 - 4) / (4 - 2) = 1.5
Pero no sabemos en qué fila apareció anteriormente Sophia.
Todo esto se puede hacer usando BUSCARV si codifica A como columna de nombre. Después de VLOOKUP, estaba obteniendo algunos #NA (nombre no encontrado) y # DIV0 (denominador cero) y lo envolví con = IF (IF (...)) para mostrar más texto aceptable en estas condiciones. Ahora tenía una expresión monstruosamente grande que era difícil de manejar e insostenible. Entonces quería expansión macro (no existe) o funciones personalizadas.
Pero cuando hice un SubtractPrevValue (celda) auxiliar, estaba recibiendo "7" en lugar de B5. No hay una forma integrada de obtener objetos de celda o rango de los argumentos pasados.
Si hago que el usuario ingrese manualmente el nombre de la celda entre comillas dobles, entonces puedo hacerlo ... SubtractPrevValue ("B5"). Pero eso realmente copia / pega los isquiotibiales y las características relativas de la celda.
Pero luego encontré una solución.
SpreadsheetApp.getActiveRange () ES LA CELDA que contiene la fórmula. Eso es todo lo que realmente necesitaba saber. El número de fila. La siguiente función toma un número de columna NUMÉRICO y resta la ocurrencia anterior en esa columna.
Pero luego descubrí que esto es REALMENTE lento. Retrasos de uno y dos segundos mientras muestra "Pensando ..." Así que vuelvo a la fórmula de la hoja de trabajo masivamente ilegible e imposible de mantener.
fuente
En lugar de proporcionar el objeto "Rango", los desarrolladores de Google pasan casi un tipo de datos aleatorio. Entonces, desarrollé la siguiente macro para imprimir el valor de la entrada.
fuente
Ahí está mi compilación de respuestas anteriores
Toma la fórmula actual y verifica si es un Rango.
=GFR(A1:A5;1;C1:C2;D1&D2)
devolucionesPara la composición completa, el TC puede llamar a algo como esto
fuente
Crear función y pasar rango como argumento:
Uso en hoja de cálculo:
Mostrará valor como
sum(A1:A10)
.fuente