Insertar fecha y hora automática en Google Sheets

Timestamp en Google Sheets
— by

Una pregunta que se hacen frecuentemente los usuarios de Sheets es como registrar en una celda la fecha en la que se modifica o se crea una nueva fila.

Esto se conoce en ingles como timestamp, y yo lo bautizaré «registro de fecha automática».

En este artículo vemos dos métodos para insertar una fecha automática en Google Sheets.

Que es un timestamp en Google Sheets

Un timestamp es básicamente una fecha que ponemos para registrar un ingreso de un documento o un dato.

Lo importante de esta fecha es que quede fija y que no sea fácil cambiarla.

Esto lo podríamos hacer de varias maneras: De manera manual, con una macro, o con una fórmula con referencias circulares.

Método 1: Manual

Si bien el título de este artículo es registro automático de fechas, no sobra saber un par de métodos para hacerlo manualmente antes de involucrarnos con macros o fórmulas complejas

Hay dos formas manuales de hacerlo

Función HOY() en Google Sheets

La primera es con la función HOY().

Esta función, precisamente nos trae la fecha y hora de hoy. Pero como no queremos que se modifique, y la función HOY() nos da un valor hoy y otro diferente mañana, entonces deberíamos después de aplicarla pegarla como valores para que quede fija

De nuevo, no es la mejor forma ni la más automática, pero es bueno saber que se puede hacer así.

Atajo de teclado: Ctrl + ´

La segunda es con un atajo de teclado: Ctrl + ´

Esta es una manera muy sencilla de poner la fecha de hoy sin que quede con una función como en el anterior método

Método 2: Macro

La segunda forma es a través de una sencilla macro.

Simplemente va a evaluar cuando un usuario ponga un valor en una celda específica, y una vez se haga, traerá la fecha y hora del día de hoy.

Ventaja principal

Siempre va a ejecutarse y no depende de accionar manual del usuario

Desventajas principales

  • Por más de que la fecha no va a cambiar por si sola, podríamos borrar o modificar por error la formula, al menos que la protejamos.
  • Como la macro edita nuestra hoja, obligatoriamente debemos dar permiso de edición a todos los colaboradores que participen, aumentando el riesgo de que cambien la celda.

Armando la base

Primero estructuremos nuestra base de ejemplo de la siguiente manera:

Vamos a crear una base de control de documentos. En esta, necesitaremos los siguientes registros

  • Una columna para escribir el nombre del documento
  • Una columna para seleccionar un supervisor o responsable. Un desplegable sencillo.
  • Una columna de fecha. Aquí es donde nuestro código imprimirá la fecha actual

Construyendo el código

Vamos a nuestro código.

Para acceder al mismo vamos a «Herramientas» > «Editor de Secuencia de Comandos».

Vamos a borrar lo que encontramos aquí y escribir una nueva función que se llame timestamp.

function timestamp() {
//Aqui va el código
}

Vamos a conectarnos con nuestro archivo y nuestra pestaña usando los métodos .getActiveSpreadsheet() y .getSheetByName(), así:

//"Conectarse" con el archivo
var archivo =SpreadsheetApp.getActiveSpreadsheet();

//"Conectarse" con la pestaña donde se va a realizar el timestamp
var ss = archivo.getSheetByName("Datos");

Luego, buscamos la celda en la que el usuario está situado, su valor, su fila y su columna.

Para esto usamos .getActiveCell, getRow() y .getColumn() respectivamente.

//Traer la celda activa
var activa = ss.getActiveCell();

//Traer el valor de la celda activa
var valor = activa.getValue();

//Traer la fila de la celda activa
var filaActiva = activa.getRow();

//Traer la columna de la celda activa
var colActiva =activa.getColumn();

Construimos un condicional para asegurarnos que el código solo se ejecute cuando la fila sea superior al encabezado, este en la columna adecuada (la del responsable, en nuestro caso la 2) y que solo se ejecute en la pestaña de datos.

/*Asegurarnos que solo se ejecute despues del encabezado, en la colummna especificada y en la hoja especificada */
if(filaActiva>=2 && colActiva==2 && archivo.getActiveSheet().getName()=="Datos"){
}

Por último, si se cumple la condición, vamos a imprimir la fecha en la celda que especifiquemos. En nuestro ejemplo será la celda a la derecha de la columna del responsable.

Para esto vamos a usar el método offset que nos «mueve» nuestra celda las filas o columnas que le digamos.

En nuestro ejemplo .offset(0,1) le dice a Sheets: «mueva la celda una a la derecha y cero abajo.

//Pondremos la fecha una celda a la derecha de la celda modificada
activa.offset(0,1).setValue(new Date());

Una alternativa a esto, cuando no queremos que la columna del registro de fecha sea relativa a alguna otra podemos reemplazar la línea anterior por esta

ss.getRange(filaActiva,3).setValue(new Date());

Donde el número 3 lo van a cambiar por la columna donde quieran imprimir el timestamp.

Una última cosa que podremos hacer es solo imprimir la fecha si no hay valor anterior. Es decir impedir que al modificar el responsable cambie la fecha original.

Esto lo hacemos con otro condicional

if(activa.offset(0,1).getValue()){  
     //No hacer nada
    }else{
    //Poner la fecha
    }

De nuevo, si no quieren que la columna sea relativa, podemos cambiar el .offset por .getRange() como en el ejemplo anterior

Si tuviéramos más aprobaciones en distintas columnas, como en este ejemplo:

Solo tendríamos que añadir en la condición del código la nueva columna, así

 if(filaActiva>=2 && (colActiva==2 || colActiva==4) && archivo.getActiveSheet().getName()=="Datos"){
//Ejecutar
}

Donde 2 y 4 serian las columnas de los responsables, y a la derecha de cada uno estaría la fecha.

Así mismo podrían poner todas las condiciones que quieran con el mismo operador ||.

Ejecutar el código

Nos falta una última parte y es como hacer para que el código se ejecute de manera automática cuando alguien escriba algo en la base

Hay varias maneras de ejecutar el código para que de verdad sea automático

Lo último que nos falta es crear una función onEdit() y dentro de esta correr nuestra función:

function onEdit(){
  timestamp();
}

onEdit es un ejemplo de lo que se conoce como activadores. Un activador es una función que se ejecuta al momento que pasa algo.

En el caso de onEdit, se ejecuta cada vez que alguien edita una celda, es decir cada vez que alguien cambia el valor de una celda.

Código

Aquí te dejo el código completo.

Ten en cuenta que puedes personalizarla con algunas de las variaciones que mencioné en el artículo

function timestamp() {
  var archivo =SpreadsheetApp.getActiveSpreadsheet();
  var ss = archivo.getSheetByName("Datos");
  var activa = ss.getActiveCell();
  var valor =activa.getValue();
  var filaActiva = activa.getRow();
  var colActiva =activa.getColumn();

  if(filaActiva>=2 && (colActiva==2 || colActiva==4) && archivo.getActiveSheet().getName()=="Datos"){
    if(activa.offset(0,1).getValue()){  
    
    }else{
    activa.offset(0,1).setValue(new Date());
    }
  }
}

function onEdit(){
  timestamp()
}

Método 2: Formula con referencia circular

Nota: Este método es muy interesante, pero es altamente inestable. Como experimento y para conocer los límites de Sheets es recomendable que lo prueben, pero para sus bases de «producción» y de uso diario, les recomiendo altamente que usen el método anterior.

Esta va a ser una fórmula extraña si no están acostumbrados a trabajar con iteraciones (Como el 99% de usuarios. Yo la descubrí cuando investigaba este tema, pero no tenía ni idea que existía).

Ventaja Principal

Al ser una fórmula, podemos proteger la hoja, y no va a tener problema para los colaboradores, y no van a poder cambiar o borrar las fechas

Desventajas

  • Al ser una fórmula, si llegamos a eliminar el dato del responsable, la fórmula se va a resetear y quedar en blanco
  • Desafortunadamente esta fórmula no funciona bien con ArrayFormula, entonces nos va a tocar arrastrarla hasta nuestra última fila, y cada vez que agreguemos nuevas filas, asegurarnos que esté con fórmula.
  • Es inestable. A veces, por alguna actualización de Sheets, se puede «dañar», y todas las fórmulas pueden quedar en 0.

Construyendo la función

Básicamente vamos a usar la fórmula HOY(), pero solo la vamos a correr la primera vez que se modifique el responsable, es decir cuando la celda donde está la fecha esté vacía.

La fórmula evaluaría las siguientes 3 condiciones

  1. Si no hay un responsable, pues no hay fecha
  2. Si ya hay una fecha, mantengamos esa fecha
  3. Si no hay fecha, pongamos la fecha de hoy con la función HOY()

Esta es nuestra base de ejemplo

Teniendo en cuenta que la fecha iría en la C, la fórmula sería la siguiente:

=IFS(O(A2="";B2="");"";C2<>"";C2;VERDADERO;AHORA())

Pero si pones esa fórmula así como está. te va a dar un error.

Nos falta un paso.

Como estamos hablando de referencias circulares (Estamos invocando a la celda C2 desde la misma celda C2), entonces debemos manejar las iteraciones para referencias circulares.

Para esto vamos a «Archivo» > «Configuración de la hoja de cálculo»

Vamos a la pestaña de «Cálculo»

Vamos a la sección «Calculo iterativo»

Escogemos la opción «Activar»

En número máximo de iteraciones ingresamos 1

Ya con esto, como por arte de magia nuestra fórmula va a funcionar.

Pero ojo, de nuevo hago la aclaración que esta fórmula es inestable y a veces se «resetea» por razones que no tengo 100% claras. Por eso les recomiendo usar el método anterior para que no tengan problemas.

Conclusion

El registro de fechas automático en Google Sheets o timestamp es una herramienta muy útil para poder llevar registros de control de documentación o de entrada y salida, y también puede ser muy útil en muchos otros casos, de gestión de tareas y demás.

Vimos dos métodos para hacer el timestamp, cada uno con sus ventajas y desventajas y que pueden llegar a ser utiles en distintos casos.

Cuéntame si te es útil y que nos quedó faltando.

Suscríbete para acceder al curso «Descubriendo el poder de Google Sheets» y empezar tu camino a la maestría de Sheets, Forms y Apps Script

Boletín

Nuestras últimas noticias en tu correo electrónico

Respuestas

  1. Avatar de Elkin Rivas
    Elkin Rivas

    como hacer un timestamp con casilla verificación ?

    1. Avatar de jsguzmanb
      jsguzmanb

      en las condiciones pones que el valor sea el de la casilla (normalmente es «true»)
      Saludos!

  2. Avatar de jesus guillen
    jesus guillen

    buenas a todos
    tengo que hacer una lista la cual debe tener checkbox
    lo que debe de hacer el checkbox es, que cada vez que sea verdadero me sume un numero en otra celda y me imprima en otra hoja la fecha y hora cuando ocurrió el evento true

    1. Avatar de jsguzmanb
      jsguzmanb

      Te toca hacer un contador
      Con .getValue() traes el valor de la fecha
      le sumas 1
      despues con .setValue vuelves a poner el nuevo numero
      Saludos!

  3. Avatar de Melissa Ibarra
    Melissa Ibarra

    Hola juan, me gustaria aplicar fecha de acuerdo a tres palabras distintas en tres columnas diferentes de la misma hoja, comó puede ser el codigo?

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Lo difícil es establecer el orden en que se va a digitar. Si estas segura que la última que se va a diligenciar es la tercera, ahi es donde va a estar tu columna «activadora»

      Saludos!

  4. Avatar de Francisco
    Francisco

    Hola Juan, no logro poder hacer que me agregar además el usuario que edita.
    podrás orientarme?

    de ante mano muchas gracias!, aca un seguidor

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Si los usuarios son de gmail.com no te van a salir. Si son de un dominio workspace (pepito.com) si puede funcionar

      Saludos!

  5. Avatar de Ediver Galvis
    Ediver Galvis

    Hola buenos dias juan,

    Primero que todo muchas gracias por compartir todos los conocimientos me han sido de mucha utilidad y he aprendido bastante para aplicarlo en mi trabajo, haciendo el TimeStamp quisiera poder dar solucion al hacer un timestamp que verifique que la celda de los datos esten llenas pero que la del tiempo este vacia, y si es asi genere el timestamp, ya que he intentado de varias maneras pero no logro que se rellene la casilla de timestamp solo se ejecuta cuando me paro sobre la celda y escribo algo.

    De antemano muchas gracias.

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Todo el truco está en el manejo correcto de los condicionales. Déjame ver como tienes tu código

      Saludos!

  6. Avatar de Ediver Galvis
    Ediver Galvis

    Hola buenos dias juan,

    Primero que todo muchas gracias por compartir todos los conocimientos me han sido de mucha utilidad y he aprendido bastante para aplicarlo en mi trabajo, haciendo el TimeStamp quisiera poder dar solucion al hacer un timestamp que verifique que la celda de los datos esten llenas pero que la del tiempo este vacia, y si es asi genere el timestamp, ya que he intentado de varias maneras pero no logro que se rellene la casilla de timestamp solo se ejecuta cuando me paro sobre la celda y escribo algo.

    De antemano muchas gracias.

  7. Avatar de Félix Bengolea
    Félix Bengolea

    Muchas gracias! Muy util! COmo puedo hacer para que si pego varias celdas a la vez se agreguen automaticamente a todas ellas la fecha. Porque aparece solo la primera de todas. Muchas gracias nuevamente. Saludos atte.

    1. Avatar de jsguzmanb
      jsguzmanb

      Esa esta mas compleja!

      LA dejo para otro video

      Saludos!

  8. Avatar de jonn
    jonn

    excelente aporte, una pregunta como puedo hacer que me marque la fecha al yo colocar un texto especifico dentro del timestamp

    gracias por compartir

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola John

      Mil gracias por tus palabras!

      Lo incluirias en esta linea

      if(filaActiva>=2 && (colActiva==2 || colActiva==4) && archivo.getActiveSheet().getName()==»Datos» && valor==»lo que tu quieras»)

      Un gran saludo!

  9. Avatar de Julio
    Julio

    Hola, como hago para que funcione cuando los demás usuarios del documento hagan modificación funcione; solo funciona cuando yo modifico la celda 🙁 gracias

    1. Avatar de jsguzmanb
      jsguzmanb

      HOla!

      Lo que pasa es que los usuarios tiene que haber dado permiso para usarlo

      Para eso debemos agregar un boton o explicarle al usuario que de play en la función desde el editor de secuencias por lo menos una vez+

      Saludos!

  10. Avatar de Alfredo
    Alfredo

    Estimado, mil gracias por compartir desinteresadamente tus conocimientos.

    He hecho literalmente el ejemplo que utilizaste en una planilla nueva de google sheets pero no funciona, me aparece un cuadro con fondo negro y nada más.
    Necesito hacer eso mismo de hace mucho tiempo y lo he estado haciendo a mano con el consabido peligro de poder equivocarme.
    ¿Podré compartirte esa planilla para que la veas?
    Es más… estoy dispuesto a pagar para que me lo soluciones jeje…
    Mil gracias.
    Alfredo

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Alfredo

      Claro que si, escríbeme a jsguzmanbgmail.com

      Un gran saludo!

  11. Avatar de Fernando

    Hola Juan, un gusto, encontré tu video en youtube y me pareció muy interesante.

    Debo pedirte ayuda, yo tengo una hoja de calculo que a través de un activador de appscript me trae el precio por importJson del Bitcoin, el tema es que quiero llevar registro de esa celda que va cambiando.

    Por lo tanto necesito que los valores que me trae cada 1 minuto en esa celda queden registrados en dos columnas apartes, como una base de datos o tabla (una con el precio y otra con fecha y hora) y que los vaya apilando.

    Se que por este camino del timestamp voy medio encaminado, pero e pierdo y no logro llegar a lo que quiero hacer.

    Desde ya muchas gracias.

    Saludos.

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Fernando

      Esta muy buena la idea para un video. Espero poderlo publicar pronto

      Un gran saludo!

  12. Avatar de Sebastian
    Sebastian

    Como puedo registrar fecha cuando una celda cambia de valor…por ejemplo de «Abierto» a «Cerrado»

  13. Avatar de Jhon Riveros
    Jhon Riveros

    Estoy intentando crear un timestamp que haga lo siguiente:
    Desde slack envio un dato y al recibirlo en google sheets me indique la fecha y hora de ese ingreso, y cuando se actualice en otra columna me digite la fecha de actualización.

    ¿Podrias guiarme con eso?

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Jhon

      Ya estoy haciendo el video donde vemos eso

      Un gran saludo!

  14. Avatar de Luis Carlos
    Luis Carlos

    Excelente aporte felicitaciones!!!!, tengo una consulta, en mi caso tengo un formulario en google sheets, donde deseo que las columnas 4,5 y 6 cuando sean modificados, primero capture en la columna 7 el primer timestamp del primer registro de cualquiera de las columnas 4,5 y 6, luego en columna 8 la fecha de modificación de cualquiera de las columnas 4,5 y6 cómo se podría realizar?

  15. Avatar de Victor

    Ya vi el error

    function timestamp() {
    var archivo =SpreadsheetApp.getActiveSpreadsheet();
    var ss = archivo.getSheetByName(«Urgencies»)
    var activa = ss.getActiveCell();
    var valor =activa.getValue();
    var filaActiva = activa.getRow();
    var colActiva =activa.getColumn();
    Logger.log(valor);

    if(filaActiva>=2 && colActiva==2 && archivo.getActiveSheet().getName()==»Urgencies»){
    if(activa.offset(0,-1).getValue()){

    }else{
    activa.offset(0,-1).setValue(new Date());
    }

    }

    }

    function onEdit(){
    timestamp();

    }

    se estaba cerrando mal el onEdit con dos }

    1. Avatar de jsguzmanb
      jsguzmanb

      Excelente!

      Es un error del codigo del artìculo? (para arreglarlo)

      Saludos!

    2. Avatar de Adriana PM
      Adriana PM

      Te agradezco muchisisisisimo!!!!!!!!!!!!!! Tenía todo el día con esto y gracias a tu comentario lo logre en 5 minutos!!!!!!!!!!!!!!!!!!!!!!!! 🥰🥰🥰🥰🥰
      Eres un crack!!!
      Saludos desde Monterrey, México!

      1. Avatar de jsguzmanb
        1. Avatar de Daniel
          Daniel

          Hola . Soy principiante y me cuesta mucho las macro. Quisiera hacerlo más simple. Podría ejecutar una función de nombre xxx que al ejecutarse devuelva en la celda los comandos CTRL+ ‘ para que así plasme la fecha y hora de ese momento?

          1. Avatar de jsguzmanb
            jsguzmanb

            Hola Daniel

            Pues la verdad, si ya haces CTRL + ‘, no creo que haya necesidad de hacer el botón.

            Saludos!

  16. Avatar de Nicolas
    Nicolas

    Buenas Guzman!
    Muy bueno tu trabajo, me viene ayudando pila.
    Igualmente, si me pudieras dar una mano con lo siguiente te agradezco.
    Quiero generar un timestamp cada vez que se cargue un dato a un sheets, pero no cargandolo yo manualmente, desde una aplicacion se envian formularios que se cargan automaticamente generando una nueva fila, por lo que deberia agregarse la timestamp cada vez que se agrega una nueva fila con datos en una columna X, y luego cargar un dato en una columna Y de la misma fila, que genere otra marca en la misma fila.

    El formulario que envio no genera timestamp automatico como google ni tiene la opcion de activarlo.

    De momento, lo pude solucionar usando una query a otra sheet y utilizando el IFS, pero vuelve la hoja bastante pesada.

    No puedo usar el IFS sin el query ya que al agregarse filas nuevas la formula se va hacia abajo.

    Espero que se haya entendido y me puedas dar una mano.
    Abrazo!

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Nicolas

      Ya te respondí en tu otro comentario

      Saludos!

  17. Avatar de Nicolas
    Nicolas

    Buenas Guzman!
    Muy bueno tu trabajo, me viene ayudando pila.
    Igualmente, si me pudieras dar una mano con lo siguiente te agradezco.
    Quiero generar un timestamp cada vez que se cargue un dato a un sheets, pero no cargandolo yo manualmente, desde una aplicacion se envian formularios que se cargan automaticamente generando una nueva fila, por lo que deberia agregarse la timestamp cada vez que se agrega una nueva fila con datos en una columna X, y luego cargar un dato en una columna Y de la misma fila, que genere otra marca en la misma fila.

    De momento, lo pude solucionar usando una query a otra sheet y utilizando el IFS, pero vuelve la hoja bastante pesada.

    No puedo usar el IFS sin el query ya que al agregarse filas nuevas la formula se va hacia abajo.

    Espero que se haya entendido y me puedas dar una mano.
    Abrazo!

    1. Avatar de Nicolas
      Nicolas

      Agrego tambien, no es un formulario de google, viene desde slack, por lo que no genera timestamp automaticamente.

      1. Avatar de jsguzmanb
        jsguzmanb

        Hola Nicolas

        Ya te respondí en tu otro comentario

        Saludos!

    2. Avatar de jsguzmanb
      jsguzmanb

      Hola Nicolas

      Mil gracias por tus palabras!

      Que tan exacto tiene que ser el timestamp

      Te lo pregunto porque podrias hacer un timestamp que corra cada 5 minutos y que verifique que la celda de los datos esten llenas pero que la del tiempo este vacia, y si es asi genere el timestamp

      Como la ves? Factible?

      Saludos!

      Un gran saludo!

      1. Avatar de Ediver
        Ediver

        hola Juan, muy buenos dias,

        Estoy tratando de hacer lo que dice en este comentario de hacer un timestamp que corra cada 5 minutos y que verifique que la celda de los datos esten llenas pero que la del tiempo este vacia, y si es asi genere el timestamp pero no lo he logrado llevo mucho tiempo pensando y no doy con la logica, seria tan amable de instruirme en como hacerlo intente con la formula sin macro pero como estoy usando la funcion de getLastRow me envia la informacion al ultimo renglon debajo de la formula.

        De antemano muchas Gracias.

        1. Avatar de jsguzmanb
          jsguzmanb

          Seria algo asi

          datos.forEach(fila=>{
          if(fila[0] && !fila[1]) fila[1]=new Date()
          })

          Saludos!

  18. Avatar de Manuel
    Manuel

    Hola,
    Pese a que tengo puesto function onEdit(), no me lo ejecuta automáticamente.

    function timestamp() {
    var archivo =SpreadsheetApp.getActiveSpreadsheet();
    var ss = archivo.getSheetByName(«Urgencies»)
    var activa = ss.getActiveCell();
    var valor =activa.getValue();
    var filaActiva = activa.getRow();
    var colActiva =activa.getColumn();
    Logger.log(valor);

    if(filaActiva>=2 && colActiva==2 && archivo.getActiveSheet().getName()==»Urgencies»){
    if(activa.offset(0,-1).getValue()){

    }else{
    activa.offset(0,-1).setValue(new Date());
    }

    }

    function onEdit(){
    timestamp();
    }

    }

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Manuel

      Dale play desde el editor de código al onEdit la primera vez para que te pida los permisos

      Saludos!

  19. Avatar de Xantus
    Xantus

    Hola!, he podido crear las marcas, sin embargo tengo una duda,

    Quiero poder filtrar en la columna donde se me van generando y poder filtrar por el día de hoy, para tener una casilla que me lo vaya diciendo cada día.

    He probado con:
    =CONTAR.SI(A2:A;»=»&HOY())

    en la columna desde la A2 en adelante se van generando, y lo que quiero es poder ver cuantas llevo hoy. Algo se me escapa porque hay 0 cuando contando veo bastantes.

    Puede ser porque la marca incluye la hora? una manilla por favor?
    Mil gracias!

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola

      Si, vas por el lado correcto, el problema es que el timestamp es una fecha con hora, básicamente un numero con decimal,

      por ejemplo el 5 de abril de 2019 es un numero, exactamente el 43560.5

      Una opción es redondear para abajo la fecha y ahí si la puedes comparar con HOY()

      Saludos!

  20. Avatar de JHON RIOS
    JHON RIOS

    Buenas tardes, deseo se encuentre muy bien. Como puedo hacer para tener varios timestamp simultaneos en diferentes columnas y cual es el limite por hoja

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Jhon

      En teoría no debería haber limite

      Simplemente en el condicional pon todas las columnas con una condicion «o»

      Así:

      if(filaActiva>=2 && (colActiva==2 || colActiva==4 || colActiva==6) && archivo.getActiveSheet().getName()==»Datos»){
      }

      Me cuentas

      Saludos!

  21. Avatar de sergio
    sergio

    nunca funciono

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Sergio

      Una lástima

      Si tienes el error o alguna duda puntual me cuentas y lo miramos con mucho gusto

      Saludos!

  22. Avatar de Alberto
    Alberto

    Buenas!!

    Estoy aplicando la fórmula del hilo que va increíblemente bien, pero me surge una pequeña duda.

    Tengo esta fórmula, que la he adaptado según las casillas:

    =IFS(O(L2=»»);»»;R2″»;R2;VERDADERO;AHORA())

    para que en R2 se incluya la hora cuando L2 no esté vacío, el problema lo tengo en que en L2 lo que he puesto es un check y no se va a incluir dato alguno salvo la marca al hacer click

    He probado con L2=true, L2=verdadero, L2=»verdadero» pero no lo aplica correctamente.

    Seguro que es fácil pero no encuentro la forma, por si alguien la sabe.

    Gracias de antemano!
    Un saludo

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Vete a la celda donde esta la casilla de verificación

      Dale clic derecho > Validación de Datos

      En opciones, puedes poner los valores cuando se seleccione o no se seleccione, ahi puedes poner cualquier texto, por ejemplo chequeado

      Después pones en tu IFS =»chequeado»

      Saludos!

  23. Avatar de Elena reynada
    Elena reynada

    Hola existe una forma de estampar tambien el usuario o correo de quien edita? Ademas de la fecha?

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Si se puede

      Usa libro.getUser()

      Saludos!

  24. Avatar de Enrique
    Enrique

    Hola. Gracias José por tu aporte, me fue de mucha utilidad para una planilla de producción que hice en mi trabajo Funciona la perfección.

    1. Avatar de jsguzmanb
  25. Avatar de Omar
    Omar

    Buenos días, como puedo hacer para que al ingresar el dato supervisor tome la hora pero que ya después no permita modificar la hora, es decir si alguien quisiera borrar el dato que aparece con la fecha y hora registrada anteriormente ,esta no se cambiar.
    Gracias por tus aportes

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Omar

      Mil gracias

      Te cuento que esto se hace con protecciones individuales

      La otra semana sale un video de esto

      Un gran saludo!

  26. Avatar de Jose

    Perfecto muchas gracias guzman, por cierto una última duda a ver si tú que sabes mucho de google sheets puedes ayudarme.
    Sabes porque las scripts y hipervinculos no se ejecutan en IOS?
    Llevo una página de fútbol donde somos 48 personas, utilicé a la perfección tu tutorial de enviar datos de una pestaña a otra para usar desde móvil y en andriod nos funciona bien y en ios no va el código y la verdad que me tiene amargado lo del ios jaja
    saludos!!

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Muy extraño!

      Primera vez que lo oigo

      Debe tener algo que ver con los links pero tocaria investigarlo

      Saludos!

  27. Avatar de Jose

    function timestamp() {
    var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(«Hoja 1»);
    ss.getRange(«A1»).setValue(new Date());
    }

    Buenass, estaba intentando usar la primera fórmula que hiciste y no me funciona.. no se cúal es el error
    Yo lo que quiero es que en la celda «A1» de la «Hoja 1» cada vez que haya una modificación en la «Hoja 1» se me cambie automáticamente la fecha en «A1»!!
    Es como la función NOW pero que si cambias algo en otra Hoja no se me modifique la fecha en «Hoja 1»

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Ya la pusiste dentro de un onEdit o un activador?

      Saludos!

      1. Avatar de Jose

        Buenass, no, esta fué la única fórmula que puse que la ví en tu video

        function timestamp() {
        var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(«Hoja 1»);
        ss.getRange(«A1»).setValue(new Date());
        }

        que me puede faltar en la fórmula?

        1. Avatar de Jose

          Vale añadiendo la función onEdit si funciona el único error que tengo es que solo quiero que la fecha me cambie en la «Hoja 1» y por desgracia con esta fórmula en cualquier hoja que hago un cambio se cambia tambien en la «Hoja 1»

          function timestamp() {
          var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(«Hoja 1»);
          ss.getRange(«A1»).setValue(new Date());
          }

          function onEdit() {
          timestamp();
          }

          1. Avatar de jsguzmanb
            jsguzmanb

            Hola Jose

            Debes poner un condicional como hacemos en el artículo

            Saludos!

  28. Avatar de Gabriel
    Gabriel

    Hola amigo, siempre muy buenas tus guias, me tienes saliendo de apuros siempre y automatizando mi excel facilitandome siempr el trabajo. Quisiera pedirte ayuda con una formula en especifica.

    Tengo un formulario de google que llenan constantemente, pero quisiera saber como puedo hacer que en una celda de cada una de las respuestas nuevas que lleguen, yo pueda insertar una celda donde yo coloque la fecha que se gestiono esa respuesta(por razones tecnicas prefiero colocar la fecha yo manualmente por que hay variables) PERO que esa celda cambie de color, es decir ME ALERTE, al ya haber transcurrido 3 dias o si es posible, especificamente 72 horas. Esto es porque se supone que una vez yo coloque la fecha manualmente, quisiera saber cuales tienen mas de 3 dias. Alguna idea de como ingresar ese formato condicional?

    Ejemplo para ser menos confuso: la fecha yo coloco «20/2/2021» y al ser el dia 23/2/2021 esa culumna este automatizada para cambiarle el color a esa celda a ROJO. De antemano muchas gracias y sigue asi

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Gabriel,

      Sería un formato condicional y buscas formula personalizada y pones la siguiente formula

      =HOY()-A2>=3

      Me cuentas

      Saludos!

  29. Avatar de karla
    karla

    Por cierto, excelente contenido y forma de explicar lo buscaba desde hace mucho.!!! Gracias por el aporte.

    1. Avatar de jsguzmanb
      jsguzmanb

      Mil gracias Karla!

  30. Avatar de karla
    karla

    hola, solo una gran pequeña consulta, si necesito colocar la fecha automatica en la columna A (a la izquierda) y su condicion sera la columna (B) como deberia hacer la parte activa.offset(0,1).setValue(new Date());

    gracias

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Puedes usar negativos en el offset

      Seria offset(0,-1)

      Saludos!

  31. Avatar de Marco Mundarain

    Excelente!
    Necesito registrar la fecha/hora de los cambios de un rango de columnas.

    Por ejemplo:
    Fila activa y Columnas 7-60

    ¿alguna idea?
    Muy amable!

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Como lo registrarias.

      En otra hoja poner «Pedro cambió la celda A20 en esta fecha?»

      Un gran saludo!

  32. Avatar de Eliot Anaya
    Eliot Anaya

    Hola Juan! ¿Como estas?
    Excelente forma de explicarlo y muy util.
    Utilice la formula para un archivo de monitoreo de tiempos, sin embargo al día siguiente la fecha se movio, y se replico en todas las celdas del mismo día, realmente no sé a que pueda deberse. Me podrias ayudar por favor con algun consejo para saber a que se debe esto, utilice esta formula:
    =IFS(O(A2=»»;B2=»»);»»;C2″»;C2;VERDADERO;AHORA())
    y modifique la parte de la referencia circular, sin embargo esta pasando esta situación.
    Agradeceria pudieras ayudarme por favor.

    Muchas gracias y excelente trabajo el que realizas, muy util.

    Saludos!

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola

      Esto debe ser porque no se está cumpliendo ninguna de las condiciones anteriores, revisa la condición de que C2 no este vacío

      Saludos!

  33. Avatar de Pedro
    Pedro

    Buenas, cuando comparto la hoja de calculo no le funciona el proyecto timeshap, en mi equipo funciona correctamente, le estoy dando vueltas y no encuentro la solución, sabrías decirme porque?

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Pedro

      La razón es que la primera vez que va a correr necesita que el usuario de su permiso.

      Una forma es teniendo un botón o un menú para que le pida permisos la primera vez

      La mejor forma es convirtiendo el script en un complemento

      Espero pronto hacer un video de esto

      Un gran saludo!

  34. Avatar de Daiana
    Daiana

    Hola! Necesito que si cambia la información de la celda, también cambie la fecha de registro.
    Intenté sacar el condicional que le pusiste a la macro (lo último) pero no me funciona, cómo puedo hacerlo?
    Gracias!!!!

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola!

      Intenta cambiar esta linea

      if(activa.offset(0,1).getValue()){

      por esta

      if(activa.offset(0,1).getValue()==»){

      Me cuentas

      Saludos!

      1. Avatar de Flor
        Flor

        Hola, estoy intentando lo mismo pero me tira error por este simbolo: »

  35. Avatar de John Sebastian Pinto
    John Sebastian Pinto

    Hola,

    Muchísimas gracias era lo que necesitaba hace mucho tiempo!

    Saludos!

    1. Avatar de jsguzmanb
      jsguzmanb

      Excelente!

      Me alegro que te sea útil

      Saludos!

  36. Avatar de Cristian
    Cristian

    Hola, como puedo hacer que la fecha ingresada se borre automáticamente cuando borro la celda que muestra el nombre del supervisor, es decir, esta es null.

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola cambia esta parte del código

      if(filaActiva>=2 && (colActiva==2 || colActiva==4) && archivo.getActiveSheet().getName()==»Datos»){

      if(activa.offset(0,1).getValue()){
      if(activa==»){
      activa.offset(0.1).clearContent();
      }

      }else{
      activa.offset(0,1).setValue(new Date());
      }
      }
      }

      Básicamente estamos agregando un nuevo condicional que si hay un valor actual de fecha y aparte no hay valor en la celda de supervisor en tu caso, borre la fecha

      Me cuentas si te funciona

      Saludos!

  37. Avatar de Yelitza
    Yelitza

    Gracias excelente explicación, mil gracias

    1. Avatar de jsguzmanb
      jsguzmanb

      Mil gracias por el comentario!

  38. Avatar de gloria
    gloria

    Hola
    Fantástica explicación.
    He intentado hacer la misma macro pero en dos pestañas diferentes y me anula una de ellas, la primera. ¿Cómo podría hacerlo?
    Gracias

    1. Avatar de jsguzmanb
      jsguzmanb

      Hola Gloria!

      Gracias por escribir!

      1cambia esto

      if(filaActiva>=2 && colActiva==2 && archivo.getActiveSheet().getName()==»Datos»)

      por esto

      if(filaActiva>=2 && colActiva==2 && (archivo.getActiveSheet().getName()==»Datos» || archivo.getActiveSheet().getName()==»Datos 2″)

      Si las columnas son diferentes ahi tendriamos que hacer otro cambio

      ME cuentas si te funciona

      Saludos!

      1. Avatar de Camila
        Camila

        Hola juan

        Como sería también en columnas diferentes?. Hice el código original para tres hojas distintas y no me funciona en ninguna, pero si lo hago para una sola hoja anda todo ok. Gracias!

  39. Avatar de Julio
    Julio

    Realmente util y muy bien explicado

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Pin It on Pinterest

Share This