jueves, 25 de enero de 2024
Crear mensajes con posibilidad de confirmación
jueves, 26 de octubre de 2023
Buscar Fórmulas de validación y ChatGPT
Nuestro agujero negro en fórmulas de Google Sheets, sorprendentemente, es encontrar fórmulas de regex. Por mucho que leemos la función de cada símbolo, a la hora de crear una máscara de validación nos cuesta mucho llegar a armarla bien.
Una solución para ello muy cómoda parece ser ChatGPT. (Por lo menos la primera prueba que he hecho ha sido muy satisfactoria. Aquí os la presento:
He entrado en ChatGPT y he planteado esta pregunta:
dime un regex para validacion de formulario google para que los usuarios solamente metan números sin letras
Puedes usar la siguiente expresión regular en un formulario de Google para validar que los usuarios solo ingresen números sin letras:
^[0-9]+$
Esta expresión regular asegura que la cadena solo contenga números del 0 al 9 y que no contenga ninguna letra ni ningún otro carácter especial. Aquí tienes una breve explicación de la expresión regula
^: Coincide con el inicio de la cadena.
[0-9]: Coincide con cualquier dígito del 0 al 9.
+: Coincide con uno o más dígitos.
$: Coincide con el final de la cadena.
Entonces, esta expresión regular asegura que la cadena completa esté compuesta únicamente por números.
De todas formas, luego he probado a buscarlo en Google, sin utilizar ninguna AI y también lo he encontrado. La diferencia ha sido las explicaciones adicionales que me ha dado ChatGPT
¿Qué os parece?
lunes, 18 de septiembre de 2023
Cambiar el título de un gráfico dinámicamente
Gracias a Ben Collins podemos utilizar esta función de código para que el título de un gráfico esté unido al contenido de una celda
function changeChartTitle() {
// apunta al gráfico
// Suponemos, en este caso, que solamente hay un gráfico en la pestaña. En caso necesario, ajustaremos el index [0] al gráfico en cuestión
const sheet = SpreadsheetApp.
const chart = sheet.getCharts()[0];
// get the chart title from the cell
const newTitle = sheet.getRange('A1').getValue(
// actualiza el título del gráfico
const chartBuilder = chart.modify();
chartBuilder.setOption('title'
const updatedChart = chartBuilder.build();
sheet.updateChart(
}
Aparte del código necesitamos crear un activador que se lance cada vez que se edita la celda
miércoles, 18 de mayo de 2022
AppendRow: empezar a escribir datos en una columna diferente de la A
Os presento la situación, primero, y luego la comento:
En un curso aprendimos a recorrer todos los archivos y subcarpetas de una carpeta dada.
Utilizamos appendRow([]) para escribir nombre, tipo y fecha de creación de cada archivo recorrido en una hoja de cálculo, ya que sabemos que es la forma más rápida y sencilla de escribir valores en una pestaña, sin tener que preocuparnos de definir ni fila ni última fila.
Pero, ya que lo habíamos conseguido, se nos ocurrió que estaría bien que lo escrito mostrará la profundidad del archivo, haciendo "sangrías" (empezando a escribir appendRow en una columna diferente a la primera (la columna A) según el árbol de las carpetas.
Tal que así:
Para ello necesitamos añadir a appendRow columnas vacías
Por ejemplo, con este appendRow([nombre,tipo,fecha]), el nombre se escribirá en la columna A
y con este diferente appendRow(['',nombre,tipo, fecha]), el nombre se escribirá en la columa B, gracias a las comillas vacías que hemos escrito antes de nombre.
El problema es que no sabemos de antemano si queremos empezar en la columna B (para una subcarpeta de primer nivel) o en la columna C, o en la D....para carpetas más internas.
Debemos, pués, crear el contenido de appendRow de forma dinámica.
La solución pasa por saber que estamos ante un array y, por lo tanto, debemos utilizar los métodos para los arrays.(Utilizaremos unshift para incluir al principio del array tantas posiciones vacías como necesitemos, utilizando ' ')
Este es el código:
Creamos un contador para saber en que columna empezamos (en el bucle de las subcarpetas), dependiendo del nivel de la subcarpeta
jueves, 31 de marzo de 2022
Insertar imágenes desde Drive en un correo (por ejemplo)
Para insertar imágenes en nuestro correo necesitamos utilizar las opción de correo htmlBody
Por ejemplo:
var mensaje = ' Mi mensaje'
var opciones = {htmlBody: mensaje}
MailApp.sendEmail(correo_cargo, 'Nuevo mensaje', mensaje,opciones)
Antes de estas líneas metemos en el mensaje, mediante lenguaje html la imagen que
queremos que aparezca en el correo
var imagen = <img src= > // ahí añadimos la url de la imagen.
mensaje = mensaje + imagen
PERO, CON IMÁGENES DRIVE NO FUNCIONA.
Necesitamos crear una url especial, tal que así:
http://drive.google.com/uc?export=view&id=
Nos falta el id de la imagen, que lo sacaremos del enlace público de compartir la imagen.
En dicho enlace público tenemos el id necesario entre /file/d/ y / view?
Una vez conseguido el Id lo metemos en una variable:
var id_conseguido = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'
Y con este dato y la url anterior creamos la imagen en html
var imagen = '<img src=http://drive.google.com/uc?export=view&id='+idconseguido+'>'
peeeero, aún no va a funcionar, ya que necesitamos desmarcar una opción dentro del menú de
compartir donde hemos conseguido la url pública:
Una vez hecho esto, la imagen debería aparecer sin problemas en el correo.
jueves, 17 de febrero de 2022
Restar fechas en código Google Script
En otros artículos, he mostrado la preocupación de no conseguir entender como funcionan las fechas en el código.
He descubierto que hay dos formas diferentes de gestionarlas. Una es dentro del código y otra en las fórmulas de las hojas de cálculo
Empezamos por el código:
En la siguiente función he probado a restar un número ( un 1 ) a una fecha. Y este es el resultado:
function restar_tiempo(){
// Vamos a intentar ver que pasa si sumamos o restamos una cantidad a una fecha
var herramienta =SpreadsheetApp.getActiveSpreadsheet()
var pestana = herramienta.getSheetByName('agenda')
var fecha = pestana.getRange('f1').getValue()
Logger.log('Fecha: '+fecha) // Resultado: Wed Feb 16 2022 00:00:00 GMT+0100 (CET)
// Empezamos restando 1
var fecha_menos_uno = fecha-1
Logger.log('Fecha: '+fecha_menos_uno) // Lo cambia a número y si hace la resta Resultado: 1644965999999
// Pero en formato fecha como queda?
fecha_menos_uno = new Date(fecha_menos_uno)
Logger.log('Fecha: '+fecha_menos_uno) // Ha restado, parece un milisegundo Resultado: Tue Feb 15 2022 23:59:59 GMT+0100 (CET)
// Vamos a ver la diferencia entre la fecha primera y la resta, pero en número
var numero_fecha = fecha.getTime()
var numero_fecha_menos_uno = fecha_menos_uno.getTime()
Logger.log('Numero_fecha '+numero_fecha) // Resultado: 1644966000000
Logger.log('Numero_fecha_menos_uno '+numero_fecha_menos_uno) // Resultado: 1644965999999
/******************* CONCLUSIÓN *********************************
Cuando restamos a una fecha, estamos restando milisegundos
Por lo que si queremos restar un día entero deberemos restarle 1000*60*60*24 =8640000 milisegundos
Es decir 1000 milisegundos por 60 segundos por 60 minutos por 24 horas que tiene cada día
*/
/* Hemos utilizado dos métodos para trabajar con las fechas en el código
new Date (milisegundos) para conseguir la fecha desde un número
getTime(fecha) para conseguir lo contrario, es decir, los milisegundos de una fecha
*/
}
Sin embargo en las fórmulas:
Si pones la fórmula =today() te aparece una fecha, en este caso 17/02/2022
Si le restas uno, es decir, =today()-1 te aparece la fecha del día anterior 16/02/2022
CUAL ES EL MISTERIO? PORQUÉ ESA DIFERENCIA?
Parece que en el código los días tienen de base un número con la cantidad de milisegundos que
han pasado desde el 1 de Enero de 1970 a la 1 de la noche hasta la fecha en cuestión
Sin embargo, en las fórmulas los días tienen de base también un número, pero con la cantidad de
días (no de milisegundos) que han pasado desde (no desde 1970) el 1 de Enero de 1900.
En este último caso, las horas, minutos, segundos y milisegundos se expresan dentro de la parte
decimal del número
viernes, 11 de febrero de 2022
Filtrar por fechas en la fórmula query
Este artículo no va de código. Pero si de un tema recurrente en este blog: las fechas.
No estoy seguro de la razón, pero nunca tengo la sensación de dominar la utilización de fechas tanto en código como en fórmulas. Muchas veces me encuentro que una fórmula o código que funciona perfectamente con otro tipo de datos, deja de hacerlo cuando hay fechas de por medio.
Por lo tanto, este artículo es un recordatorio de la solución a uno de esos problemas, en este caso a filtrar un importrange utilizando Query.
Como introducción diré que la unica forma que he conseguido mezclar importrange con un filtro ha sido a través de query, tal que así:
=query(importrange(url;range);"select * where col2='Martes'") Así consigo importar solamente una parte de los datos de otra hoja de cálculo según una condición.
Peeeero, quería hacerlo con la condición de que los datos serían igual o posteriores a la fecha actual y no había manera.
Al final la fórmula me ha quedado así:
=query(IMPORTRANGE(url;rango);"Select * where Col3 >=date '"&TEXT(TODAY();"yyyy-MM-dd")&"' ")
Como véis hay que utilizar la palabra clave date y además pasar a texto y a formato especial la fecha actual.
Crear PDF horizontal
El código que vamos a mostrar aquí no ha sido creado por nosotros, sino que lo hemos encontrado en Internet. Objetivo: Publicar una pesta...
-
El código que vamos a mostrar aquí no ha sido creado por nosotros, sino que lo hemos encontrado en Internet. Objetivo: Publicar una pesta...
-
La fórmula importrange es muy potente, ya que nos permite unir datos de diferentes hojas de cálculo y, con un poco de imaginación, ofrecer ...
-
Estoy haciendo código para conseguir quitar todos los permisos a un correo concreto en todos los archivos y subcarpetas de una carpeta dada....