tag:blogger.com,1999:blog-3233877562970007107.post3136072120587727882..comments2023-12-09T00:13:47.970+00:00Comments on Tutoriales Google Apps Scripts: Cómo detectar cambios en un spreadhseet con Google Apps ScriptLordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.comBlogger94125tag:blogger.com,1999:blog-3233877562970007107.post-40532715397304316322022-07-03T00:22:11.185+01:002022-07-03T00:22:11.185+01:00A priori, dentro del onEdit, si son del mismo spre...A priori, dentro del onEdit, si son del mismo spreadsheet no deberia haber problema en que obtuvieras info. De otro libro creo que no te funcionaria. <br />Lo mejor que puedes hacer es debugar. Creo que con breakpoints deberías de poder ver el problema.<br />Los principios son complicados, paciencia :D<br />LordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-50868061333288813252022-07-03T00:18:49.894+01:002022-07-03T00:18:49.894+01:00Has instalado la función historico ? https://www.t...Has instalado la función historico ? https://www.tutorialesgoogleappscripts.com/2020/09/como-crear-triggers-con-google-apps-script.htmlLordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-79213496500206074982022-06-29T04:38:44.227+01:002022-06-29T04:38:44.227+01:00Tambien he intentado con este pero no corre y no s...Tambien he intentado con este pero no corre y no se cual es el error.<br /><br />function historico(e) {<br /> <br /> var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Historico");<br /> var rango = e.range;<br /> var fil = rango.getRow();<br /> var hoja = rango.getSheet();<br /> var datos = e.source.getRange("A"+fil+":J"+fil) .getDisplayValues();Logger.log(datos);<br /><br /><br /> if (hoja.getName() == "Datos" && rango.getColum() == 5) {<br /> if (e.value !== "") {<br /> ss.appendRow(datos)[0]);<br /> }<br /><br />}Alberto0603https://www.blogger.com/profile/10731774230739431346noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-61178470650631963262022-06-29T03:33:59.547+01:002022-06-29T03:33:59.547+01:00mira tengo este script que ya me arroja la fecha y...mira tengo este script que ya me arroja la fecha y hora cuando modifican la columna "5" que es donde quiero darle seguimiento.<br />pero solo me arroja eso, quisiera saber como podría hacer que me arroje algunos campos de la hoja 1 a la hoja 2 donde quiero generar un histórico de movimientos.<br />por ejemplo, columnas 1,2,5,7 mas el usuario que la modifico) no se si se pueda.<br /><br />function onEdit(e){<br /><br />{<br /> <br /> if(SpreadsheetApp.getActiveSpreadsheet().getSheetName() == "Hoja 1")<br /> <br /> {<br /> var range = e.range;<br /> if(range.getColumn() == 5)<br /><br /> SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hoja 2").getRange(range.getRow() , 6).setValue(new Date());<br /> }<br />}<br /> <br />}<br /><br />apenas son mis primeros pasos, perdona mi incoherencia.Alberto0603https://www.blogger.com/profile/10731774230739431346noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-50307337842590326512022-06-28T06:58:06.564+01:002022-06-28T06:58:06.564+01:00Hola Alberto,
Perdoname la pregunta, pero, cual es...Hola Alberto,<br />Perdoname la pregunta, pero, cual es tu duda? Que te haga yo el proyecto? :D<br />Dime que cosa concreta es lo que te falla y te intentaré ayudar<br />Nos vemosLordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-86142606215275548292022-06-28T05:17:50.896+01:002022-06-28T05:17:50.896+01:00hola amigo buen día.
espero me puedas ayudar. teng...hola amigo buen día.<br />espero me puedas ayudar. tengo libro de excel con 3 hojas:<br />hoja 1 = formulario<br />hoja 2 = datos<br />hoja 3 historial<br /><br />básicamente en la "hoja 1 = formulario" son macros que guardan registros" en la "hoja "= datos".<br /><br />esa "hoja 2 = datos" tiene distintos encabezados, pero me interesaría generar un histórico de movimientos. <br /><br />ejemplo que cuando algún campo de la columna "Y" de la "hoja 2 = datos" sea modificado, se genere un historial con la columna ("a"-"c"-"x"-"y") y campos adicionales como fecha y hora en que se modifico el dato, usuario que lo modifico (si es posible si no solo con la fecha y hora) esto para poder ver cual era el dato original y compararlo con el nuevo, pero que no afecte la primera vez que se llena con el formulario si no apartir de que se modifica o el dato es diferente al ingresado la primera vez.<br /><br />no se mucho de programación, están siendo mis primeros proyectos en esta plataforma y aun tengo dudas. Alberto0603https://www.blogger.com/profile/10731774230739431346noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-54311842093378806852022-01-28T22:24:27.624+00:002022-01-28T22:24:27.624+00:00Hola Victor. Seguro q tienes problemas con los sep...Hola Victor. Seguro q tienes problemas con los separdores ". Los tienes que convertir a \" para que no te fastidien el string. Yo lo he probado con estoy me ha funcionado: setFormula("=IF(B4=\"\";;(CONCATENATE(F4&D4&if(G4=\"\";if(H4=\"\";I4;H4);G4)))&E4)"); Ya me dirás como te ha ido<br /><br />Nos vemos!<br />LordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-51430046880401514732022-01-28T22:05:56.798+00:002022-01-28T22:05:56.798+00:00Hola... quiero que en lugar de poner la hora en la...Hola... quiero que en lugar de poner la hora en la primera columna no ponga la fecha si no la siguiente formula:<br /><br />=IF(B4="";;(CONCATENATE(F4&D4&if(G4="";if(H4="";I4;H4);G4)))&E4)<br /><br />logré el concatenar así: .setFormula("=concatenate(R[0]C[5]&R[0]C[3]")<br /><br />pero al momento de intentar la validación con la formula de IF no he podido lograrlo... me ayudas?...<br /><br />Gracias<br /><br />Victorhttps://www.blogger.com/profile/02118610464768963109noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-90532430528418819352021-09-11T19:20:01.482+01:002021-09-11T19:20:01.482+01:00Si el displayValues no hace lo que quieres ( y por...Si el displayValues no hace lo que quieres ( y por lo que dices , parece que no) te diré que solo le vería dos opcions:<br />1. Intentar agrupar el hideRows. Si pudieras detectar filas consecutivas q se han de ocultar y entonces ocultarlas todas de una sola vez, ganarias bastante tiempo. Ejemplo: ss.hideRows(i+3,5); .<br />2. Realmente te hace falta tener el flush a cada fila? Ya te lo digo, no. Como mucho cada vez hicieras un hideRows, pero ni así. Yo intentaria hacer el flush después del bucle, no a cada fila. Esto tiene pinta que te está chupando mucho tiempo.<br /><br />Inténtalo hacer tu, si no lo ves claro como implementarlo avisame e intento montarte algo cuando tenga un momento.<br /><br />Nos vemosLordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-5293308687875176202021-09-11T01:39:13.757+01:002021-09-11T01:39:13.757+01:00Hola, es posible que al correr un script no tenga ...Hola, es posible que al correr un script no tenga en cuenta las filas que están ocultas? mi problema es que tengo creado esto para que me oculte filas de manera automática cuando se cumplen ciertas condiciones pero como tengo muchas filas el tiempo máximo de ejecución se alcanza antes de finalizar todas las filas. Como lo tengo automatizado mediante un activador temporal, me gustaría que cuando se corre por segunda vez y sucesivas no tenga en cuenta las filas ya ocultas y así será mas fácil que pueda llegar al final de las filas.....espero haberme explicado.<br /><br />function ocultarFilasPAMIRO() {<br /> var ss = SpreadsheetApp.getActive().getSheetByName("VENTAS");<br /> var uf = ss.getLastRow();<br /> var datos = ss.getRange(3,2,uf,25).getDisplayValues();<br /> <br /> for(var i=0;i<datos.length;i++){<br /> if(datos[i][19] == " SI" && datos[i][20] == " SI"|| datos[i][19] == " SI" && datos[i][20] == "*" && datos[i][14] == "SI"){<br /> ss.hideRows(i+3);<br /> }<br /> SpreadsheetApp.flush();<br /> }<br />}Roberto Gutiérrezhttps://www.blogger.com/profile/01140736184001904076noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-52904133901812255832021-08-25T17:49:55.967+01:002021-08-25T17:49:55.967+01:00Hola amigo muy buenas tardes, de antemano muchas g...Hola amigo muy buenas tardes, de antemano muchas gracias por toda la ayuda que me puedas proporcionar. Existe una manera con el código que nos diste poder copiar toda la fila de la celda en donde se está realizando el cambio para trasladarlo a la hoja 2 del sheets? te paso el código que tengo que actualmente no me está realizando la función, lo que en resumidas cuentas quiero es que identifique la fila de la celda en la columna (D) que se está modificando, y copie y pegue la información de toda la fila (A), (B) y (C) <br /><br />function onEdit(e)<br />{ <br /> if(SpreadsheetApp.getActiveSpreadsheet().getSheetName() == "1")<br /> {<br /> var range = e.range<br /> var datos = range.getRow().getValues();<br /> <br /> SpreadsheetApp.getActiveSpreadsheet().getSheetByName("2").getRange(range.getRow() , 1).setValues(datos);<br /> }<br />}Anonymoushttps://www.blogger.com/profile/12107383161049743588noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-29281915428331845512021-04-16T00:21:47.682+01:002021-04-16T00:21:47.682+01:00Hola LordPakus, gracias por tan pronta respuesta. ...Hola LordPakus, gracias por tan pronta respuesta. Ese caso lo resolví por UI.<br />El problema que tengo con el código, es que hago un filtro que me devuelve unos registros, pero cuando obtengo el Range de ese filtro, lo que me muestra es todos los registros desde el inicio. Recorrerlo se hace complicado cada vez se aumentan los registros. Hay manera de obtener en el rango solo los resultados del filtro? Te agradezco mucho!Anonymoushttps://www.blogger.com/profile/06296640569067221924noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-61448051062541135092021-04-15T22:26:20.506+01:002021-04-15T22:26:20.506+01:00Pues te diré que depende. En principio te tengo qu...Pues te diré que depende. En principio te tengo que decir que no es tan facil como parece. Comparteme el documento donde quieres hacerlo y puedo probar a revisarlo cuando tenga un momento.LordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-62561956665802515612021-04-15T22:19:31.048+01:002021-04-15T22:19:31.048+01:00Disculpa por responder con tantos dias de retraso....Disculpa por responder con tantos dias de retraso. Lo más fácil para restar dos columnas tal y como comentas seria realizando una formula sencilla del tipo =A1 - B1 y arrastrar la formula hasta donde lo necesites. Te serviria?LordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-24605856534146887342021-04-15T20:28:21.109+01:002021-04-15T20:28:21.109+01:00Hola! Soy nuevo en Google App Script. Tengo una ce...Hola! Soy nuevo en Google App Script. Tengo una celda que cambia de valor según una fórmula, como puedo hacer para que cuando el valor de la celda cambie desde la fórmula, se lance el evento onEdit? De antemano, muchas gracias!Anonymoushttps://www.blogger.com/profile/06296640569067221924noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-13085325430599178842021-03-23T15:49:54.616+00:002021-03-23T15:49:54.616+00:00cómo puedo ejecutar una función (resta de dos colu...cómo puedo ejecutar una función (resta de dos columnas) cuando los valores de un campo presenta cambios. Por favor si alguien me puede ayudar éste es mi correo fpaez7@gmail.comAnonymoushttps://www.blogger.com/profile/00252852105753687210noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-18315830233843368602021-02-03T23:00:16.473+00:002021-02-03T23:00:16.473+00:00No te va a funcionar nunca. OnEdit se ejecuta sin ...No te va a funcionar nunca. OnEdit se ejecuta sin permisos y no se instala, así que no puede "tocar" nada que no sea en el mismo spreadsheet. Abrir otros spreadsheet esta totalmente prohibido desde el onEdit.<br /><br />En estos casos la única opción que te veo es que te marques en un hoja lo que quieres hacer y luego un trigger se encargue de realizar la tarea.<br /><br />Tal vez te link te pueda ser de utilidad: https://www.tutorialesgoogleappscripts.com/2020/09/como-crear-triggers-con-google-apps-script.html<br /><br />Suerte! Nos vemos!LordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-75991254440022214452021-02-03T16:25:32.955+00:002021-02-03T16:25:32.955+00:00Hola! Tengo este código:
lo que me hace es copiar ...Hola! Tengo este código:<br />lo que me hace es copiar la celda activa en la misma hoja, pero cuando quiero copiarla en otro libro distinto ya no funciona. Si la funcion onEdit la cambio de nombre y lo ejecuto manualmente si funciona.<br />function onEdit(){<br /> var archivo = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();<br /> var nombreHoja = archivo.getName();<br /> var activa = archivo.getActiveCell();<br /> var filActiva = activa.getRow();<br /> var valor = activa.getValue();<br /> var colActiva = activa.getColumn();<br /> var fondo = activa.getBackground();<br /> <br /> activa.offset(0,1).setValue(valor).setBackground(fondo);<br /><br /> cambioDatoOrigen(nombreHoja,filActiva,colActiva,valor,fondo);<br />}<br /><br />function cambioDatoOrigen(nombreHoja,filActiva, colActiva,valor,fondo){<br /> <br /> var ss = SpreadsheetApp.openById("XXX");<br /> var sheet = ss.getSheetByName(nombreHoja);<br /> var range = sheet.getRange(filActiva, colActiva);<br /> <br /> range.setValue(valor).setBackground(fondo);<br /> <br /><br />}<br />Anonymoushttps://www.blogger.com/profile/11229577645426136390noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-43834924665172434442020-09-03T13:41:02.965+01:002020-09-03T13:41:02.965+01:00Para eso estamos!
Cualquier duda no vaciles en ha...Para eso estamos!<br /><br />Cualquier duda no vaciles en hacérmela llegar<br /><br />Nos vemosLordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-63205876189629319552020-09-03T13:40:01.195+01:002020-09-03T13:40:01.195+01:00Muchas gracias por tu rápida respuesta, solo soy u...Muchas gracias por tu rápida respuesta, solo soy un pasante😅Anonymoushttps://www.blogger.com/profile/00799886028767646083noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-72577410947170395322020-09-03T08:14:07.189+01:002020-09-03T08:14:07.189+01:00Hola,
Me he montado un spreadsheet con las hojas ...Hola,<br /><br />Me he montado un spreadsheet con las hojas necesarias para probar tu código y no soy consciente del problema que decias. Podria ser que hayas instalado algún trigger manualmente?<br /><br />Aparte de eso, tengo que decirte que el código es bastante ineficiente. Te va a dar problemas toda la vida, tanto a nivel de rendimiento como , sobretodo, de mantenibilidad.<br /><br />Aunque lo tengas funcionando ahora, es un proyecto muerto, no vas a poder mantenerlo , mejorarlo o ampliarlo en el futuro, dado que la cálidad del código es bajita.<br /><br />Si quieres, ponte en contacto conmigo: https://googleappscriptsweb.blogspot.com/p/como-contratar-mis-servicios-de.html y te intento hacer un presupuesto ajustado para dejarte el código pequeño, limpio, eficiente y mantenible.<br /><br />Nos vemos!LordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-54406049126891684402020-09-03T06:07:24.766+01:002020-09-03T06:07:24.766+01:00Hola,
¿Me podrias decir donde esta mi falla?
Mira...Hola, <br />¿Me podrias decir donde esta mi falla?<br />Mira que tengo un botón que corre una macros y también hice un onedit para poderlo correr en android. Pero cuando uso el onedit, me corre 2 veces la macro. Y si me podrías decir como llamo una segunda función con onedit<br /><br />function prueba1() {<br /> var spreadsheet = SpreadsheetApp.getActive();<br />spreadsheet.setActiveSheet(spreadsheet.getSheetByName('REGISTRO POR DIA'), true);<br /> spreadsheet.getRange('A7').activate();<br /> spreadsheet.getRange('\'FORMATO DE INSPECTORES\'!A35:CX35').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); <br /> spreadsheet.setActiveSheet(spreadsheet.getSheetByName('REGISTRO POR DIA'), true);<br /> spreadsheet.getRange('7:7').activate();<br /> spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getActiveRange().getRow(), 1);<br /> spreadsheet.getActiveRange().offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate(); <br /> spreadsheet.setActiveSheet(spreadsheet.getSheetByName('BITACORA'), true);<br />};<br />function PRUEBABORRAR() {<br /> var spreadsheet = SpreadsheetApp.getActive();<br /> spreadsheet.getRangeList(['B2', 'C1', 'D2', 'F2', 'H2', 'A5', 'A8:I9', 'K8:W9', 'A13:H14','B19:B20', 'K13:L16', 'A25:H25', 'L23:N25']).activate()<br /> .clear({contentsOnly: true, skipFilteredRows: true});<br />};<br />function onEdit(e){<br /> var NombreHoja = e.source.getActiveSheet().getName();<br /> var range = e.range;<br /> if(NombreHoja == "FORMATO DE INSPECTORES" & range.getA1Notation()=="E27" & !e.range.isBlank())<br /> {<br /> prueba1();<br /> }<br /> };<br /><br /><br />Anonymoushttps://www.blogger.com/profile/00799886028767646083noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-87794551714233429422020-08-14T19:48:23.211+01:002020-08-14T19:48:23.211+01:00Ponte en contacto conmigo a través de este formula...Ponte en contacto conmigo a través de este formulario: https://googleappscriptsweb.blogspot.com/p/como-contratar-mis-servicios-de.html y lo hablamos con más calma.<br /><br />Normalmente para profesores el proyecto lo hago gratis o cobro algo simbólico ( como mucho ), depende del tiempo que lleve.<br /><br />Espero tu mensajeLordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-92146655923503131552020-08-14T19:11:45.256+01:002020-08-14T19:11:45.256+01:00Hola.
Gracias por tu ayuda, pero no he logrado q...Hola. <br /><br />Gracias por tu ayuda, pero no he logrado que funcione.<br /><br />He cambiado el código por onChange y queda así:<br /><br />function onChange(e) {<br /> <br /> addTimestamp(e);<br /> <br />}<br /><br /><br />function addTimestamp(e){<br /> //variables<br /> var startRow = 2;<br /> var targetColumn = 2;<br /> var hoja = "Fechas";<br /> <br /> //get modified row and column<br /> var row = e.range.getRow();<br /> var col = e.range.getColumn();<br /> <br /> if(col === targetColumn && row >= startRow && e.source.getActiveSheet().getName() === hoja){<br /> <br /> var currentTime = new Date(); <br /> <br /> e.source.getActiveSheet().getRange(row,3).setValue(currentTime);<br /> <br /> } //END IF check date exists<br /> } // End IF check column, row, worksheet<br />} // END function addTimestamp<br /><br /><br />Como ves al introducir un dato o cambiar lo que esta en las celdas de la columna determinada aparece la fecha en la celda correcta, pero al poner como contenido de las celdas operaciones dependientes de otras celdas y cambiar el valor de estas no se actualiza.<br /><br />He intentado crear el código para usarlo como función directa (la segunda solución) pero no he sido capaz de hacer algo que funcionase.David Sanzhttps://www.blogger.com/profile/13979730401335850626noreply@blogger.comtag:blogger.com,1999:blog-3233877562970007107.post-70132417425186938932020-08-14T13:29:05.104+01:002020-08-14T13:29:05.104+01:00Hola David,
Me encanta cuando los profesores usan...Hola David,<br /><br />Me encanta cuando los profesores usan Google Apps Script para mejorar la experiencia educativa, os tengo en un pedestal, va en serio.<br /><br />En cuanto a tu pregunta yo le veo dos posibles soluciones:<br />1. Usar onChange en vez de onEdit. Por norma general onChange deberia funcionar donde onEdit no llega, ahora bien, no tengo claro que funcione con el resultado de funciones. Es posible que no, y yo ahora mismo voy muy liado para probarlo. Puedes mirartelo a ver si te funciona por este camino.<br />2. Sino te funciona el onChange otra manera seria mirarlo a través de una formula personalizada. Es decir, que tu uses una formula pero que realmente lo que estes haciendo sea ejecutar un función de código de Google Apps Script. En esa función podrias hacer lo que quisieras. Tiene limitaciones a nivel de permisos, pero para lo que quieres debería funcionarte. Si quieres puedes mirarte este link para saber más como va: https://googleappscriptsweb.blogspot.com/2015/03/como-hacer-una-funcion-personalizada.html<br /><br />Espero que te haya servido de ayuda, sino, dímelo y buscaremos otra solución.<br /><br />Nos vemos!LordPakushttps://www.blogger.com/profile/10396031062672881371noreply@blogger.com