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

 // Creamos un array con los datos básicos
 var miarray = [nombre,tipo,fecha]
// Imaginamos que queremos escribir en la columna C, y el contador tiene el valor de 3 
var contador = 3
// Organizamos un bucle que de tantas vueltas como el valor del contador menos uno 
  for (var x=1;x<=contador;x++){
 // Y gracias a este método de arrays incluimos tantos espacios vacíos
// al principio del array como vueltas 
    miarray.unshift('')
  }
 // Ahora, ya preparado el array con sus espacios lo escribimos en la pestaña
  pestana_arbol.appendRow(miarray)




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 mensaje = ' Mi mensaje'

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
:

Haz clic en la rueda de
configuración
Quita la marca
a aplicar actualización de seguridad



Una vez hecho esto, la imagen debería aparecer sin problemas en el correo.


Un ejemplo del trozo de código necesario sería este:

var miid = '0B_iUREgZco_VaWpseFlnNFQzZGFrR1VxRXlRWkg4YWVKN2pj' 
// Se consigue del enlace público a compartir entre file/d/ y /view?
// Hay que darle a configuración y quitar la marca de seguridad
var imagen = '<img src=http://drive.google.com/uc?export=view&id='+miid+'>'
mensaje = mensaje + '<br>'+imagen
var opciones = {htmlBodymensaje}

MailApp.sendEmail(correo_cargo'Nuevo mensaje'mensaje,opciones)

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