Тёмный
Carlos G
Carlos G
Carlos G
Подписаться
Este canal se creó con el fin de profundizar en un conocimiento libre en distintas tecnologías y herramientas que nos ayudarán a superar los desafíos diarios que se presentan a nivel profesional y personal. Intentamos que las personas adquieran habilidades digitales, que les permitan desenvolverse de muy buena forma en las áreas donde laboren o emprendan. Si trabajas con Apps Script, Google Sheets, Looker Studio y otras tecnologías relacionadas, ¡este es el lugar indicado para ti!.

¿Qué puedes esperar en este canal?

🚀 Tutoriales paso a paso
💡 Consejos y trucos.
🧩 Soluciones a desafíos reales.
🔍 Explorando nuevas tecnologías: Además de Apps Script, Google Sheets y Looker Studio, también exploraremos otras tecnologías relevantes para ampliar tus conocimientos y habilidades.

Espero tenerlos de compañeros en este viaje de aprendizaje. Suscribete.
Комментарии
@dulcefajardo1428
@dulcefajardo1428 3 дня назад
Hola , estuve intentando hacer el código pero no me sirve que hago ??😢
@carlosg89
@carlosg89 3 дня назад
Hola espero te encuentres muy bien. Me puedes dar detalle del error que te sale o enviarme un pantallazo del error y una copia de código a mi correo?
@dulcefajardo1428
@dulcefajardo1428 6 часов назад
@@carlosg89claro dame tu correo
@dulcefajardo1428
@dulcefajardo1428 6 часов назад
@@carlosg89si claro te agradecería, envíame tu correo
@dulcefajardo1428
@dulcefajardo1428 6 часов назад
Si claro , envíame tu correo
@maubu10
@maubu10 5 дней назад
Buen video, a la espera de más
@carlosg89
@carlosg89 3 дня назад
Hola espero te encuentres muy bien. Claro que si, este es el primero de una serie sobre formularios, para el próximo le agregaremos funcionalidad y guardaremos datos en google sheet. Saludos
@chimboterex
@chimboterex 5 дней назад
Gracias por su tiempo y conocimiento bendicioneS. Funciona para verlo celular
@carlosg89
@carlosg89 3 дня назад
Mil gracias pir el comentario, la idea es que se pueda adaptar a varios tipos de pantalla y para eso incluimos las elementos meta. Saludos.
@eduardodiaz4864
@eduardodiaz4864 14 дней назад
Buenas, estoy realizando un proyecto en apps script, tengo un index.html que tiene un boton inventario, este debe abrir inventario.html, hasta aquí todo bien, luego alli hay un boton nuevo que se llama nuevo registro y debe abrir nuevoregistroinventario.html, pero no lo hace. He estado buscando una solucion y no la encuentro. Todos los tutoriales que hay son un index.html que puede abrir una pagina secundaria, pero no hay de secundaria a terciaria, y asi sucesivamente. Agradezco tu ayuda
@carlosg89
@carlosg89 13 дней назад
Hola amigo, lo que quieres es que al dar en el boton de agregar registro se abra una ventana emergente con un formulario para ingresar los datos de la transacción, lo entiendo bien?
@PAAC6421
@PAAC6421 24 дня назад
Al anotar la función for tal cual la escribes, me dice que tengo un error de sintaxis, podrias ayudarme.
@carlosg89
@carlosg89 18 дней назад
Hola, espero te encuentres bien, claro que si, comparte tu código por favor para verificar cuál es el error. saludos
@leonardoquintana6465
@leonardoquintana6465 Месяц назад
Super bueno, muchas gracias !
@carlosg89
@carlosg89 Месяц назад
Me alegra mucho que sirva te sirva el contenido, saludos.
@elkinrodriguez9448
@elkinrodriguez9448 Месяц назад
Hola Carlos, mira que al intentarlo me sale el siguiente error "Exception: Cannot call SpreadsheetApp.getUi() from this context.", este es el código que use siguiendo tu video y la funcion que ejecuta se llama actualizacion. function onOpen() { SpreadsheetApp.getUi() .createMenu('Ejecutar') .addItem('Actualizar Programacion', 'actualizacion') .addToUi(); } Me podrias orientar en que esta fallando por favor
@elkinrodriguez9448
@elkinrodriguez9448 Месяц назад
Ya lo pude solucionar, tocaba cerrar la hoja y al abrirla de nuevo se ejecutaba, tal como lo dice el nombre de la funcion "onOpen", muchas gracias por tus videos me han servido mucho
@andykb95
@andykb95 Месяц назад
Me ayudó muchísimo, gracias!! Se puede cambiar la fuente, color, tamaño e insertar imagenes en la macro??
@carlosg89
@carlosg89 13 дней назад
Hola, espero te encuentres bien. Sí, puedes cambiar la fuente, color, tamaño e insertar imágenes en un correo enviado desde Google Sheets utilizando MailApp.sendEmail, para eso debemos hacer algunos cambios en el cóidigo ya que el correo lo estamos enviando desde un formato plano y debemos pasarlo a un formato HTML. function enviarEmails() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Consolidado pedidos"); const ult = sheet.getLastRow(); const plantillaTexto = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Platilla Email").getRange(1, 1).getValue(); for (let i = 2; i <= ult; i++) { const actualEmail = sheet.getRange(i, 11).getValue(); const pedido = sheet.getRange(i, 3).getValue(); const cliente = sheet.getRange(i, 1).getValue(); const condicion = sheet.getRange(i, 6).getValue(); const condicion2 = sheet.getRange(i, 12).getValue(); if (condicion === "ENVIADO" && condicion2 == "NO") { // Personalizar el contenido HTML const emailTexto = plantillaTexto .replace("{name}", cliente) .replace("{pedido}", pedido) .replace("{imagen}", '<img src="URL_DE_TU_IMAGEN" alt="Descripción de la imagen" style="max-width:100%; height:auto;">'); const asunto = "Tú pedido #" + pedido; // Enviar el correo en formato HTML MailApp.sendEmail({ to: actualEmail, subject: asunto, htmlBody: emailTexto }); } } } nota: Asegúrate de que la imagen sea accesible públicamente en la web y he añadido una línea para insertar una imagen en el correo. Debes reemplazar URL_DE_TU_IMAGEN con la URL de la imagen que quieras usar. Espero te sirva y quedo atento a tus comentarios
@ROSH1816
@ROSH1816 Месяц назад
Muy buenos videos... Saludos desde México. Pregunta, que pasa si necesito mandar correos pero desde distintas cuentas, es decir, una desde info@correo, otro desde atencionclientes@correo y otro de caja@correo??? Hay personas de estás áreas que interactúan con el sheets y cada paso mandara correos desde distintas cuentas. Cómo se haría???
@carlosg89
@carlosg89 13 дней назад
Hola amigo, espero te encuentres bien, el servicio MailApp solo enviará correos desde la cuenta que ejecuta el script. Hasta donde tengo conocimiento. Saludos y quedo atento
@betosilvirgo
@betosilvirgo Месяц назад
Muy bueno el video Carlos. Quisiera hacerte una consulta. Soy principiante en este tema. Mi pregunta es como puedo hacer para que los datos no se carguen en la última fila de la tabla sino q se inserte en la primera bajo el encabezados, por ejemplo en la fila 2 o sea que la información vaya desde la actual a la mas antigua. Muchas gracias
@carlosg89
@carlosg89 Месяц назад
Hola Beto, si se puede, déjame las casillas que debería llevar el formulario y tu correo, para enviarte la solución.
@sergioomarruedaespinosa849
@sergioomarruedaespinosa849 2 месяца назад
Excelente video amigo, estoy en el mundo del desarrollo web y diseño gráfico mas o menos hace dos años y nunca habia escuchado el entorno de Apps Script, pero con tus videos aprendi la estructura y me resulto util esta herramienta, gracias..Nuevo Suscriptor..
@carlosg89
@carlosg89 Месяц назад
Hola Sergio, muchas gracias por el apoyo, espero te sirva el contenido, saludos
@ElenaSepulveda-ec9mh
@ElenaSepulveda-ec9mh 2 месяца назад
Buenas tardes estimado. Estoy con el siguiente dilema. Tengo una hoja1 principal donde trabajo con nombre, origen,destino y otras columnas. Tengo otra hoja2 que trabajo con IMPORTRANGE para extraer ciertas columnas que son el nombre, origen y destino. agrego una nueva columna que se llama saldo. Anoto los gasto que tienen cada nombre. El problema que se me genera que al momento de eliminar una fila de la hoja1 principal se elimina automaticamente en la hoja2. Pero queda el saldo en la columna llamada saldo. Como puedo hacer que si borro una fila de la hoja1 tambien se borre completo en la hoja2. Quedo atento a su comentario.
@carlosg89
@carlosg89 2 месяца назад
Hola Elena, esto se debe a que el Importrange, es un espejo de datos de la hoja de origen, al eliminar los datos de origen en el destino también, ahora bien, como los datos de la columna saldo no son desde el origen si no que son propias de la hoja dos, por eso no se borra por completo, yo te recomiendo que por medio de app script copias datos de un origen a un destino, le agregas un disparador automático para que el script se ejecute solo, le configuras cada cuanto o en que momentos quieres que corra, le pones el saldo en la hoja destino y al script le agregamos un for con un condicional para que busque los datos en el origen y si no lo encuentra elinime toda la fila de la hoja 2, para esto necesitas una llave, puede ser el nombre, debe ser un dato que este en las dos hojas.
@CequelBravo-d9n
@CequelBravo-d9n 2 месяца назад
Buen video estimado. Como puedo hacer. Si borro un dato en A7. Quiero que se borre toda esa fila. Seria B7-C7-D7-E7...... ESTOY EN ESE DILEMA
@carlosg89
@carlosg89 2 месяца назад
Hola, espero te encuentres muy bien, este video te puede servir ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-eO_qoZFZ5CM.html puedes agregar una columna marcada como eliminar, esa puede ser la condición, entonces el script lo que hace es que si encuentra una celda con eliminar ejem A2 el elemina todo la fila, también puedes poner que si la celda A2 es vacía, solo pones las comillas en el if
@Imperialenrique
@Imperialenrique 2 месяца назад
Como puedo detener la función al cumplirse la función IF: por ejemplo si la celda es <=0 a otra celda hoja formulario celda G15 es <= a 0 de la hola stock en el rango F3:f41 este es mi código // Guardar celdas function Guardar() { var hojaActiva = SpreadsheetApp.getActiveSpreadsheet(); var FORMULARIO = hojaActiva.getSheetByName("FORMULARIO"); // Nombre de hoja del FORMULARIO var REGISTRO_ENT_SAL = hojaActiva.getSheetByName("REGISTRO_ENT_SAL"); // Nombre de hoja donde se almacenan REGISTRO_ENT_SAL // Celdas de donde se obtendrán los REGISTRO_ENT_SAL a guardar var valores = [[FORMULARIO.getRange("D9").getValue(), FORMULARIO.getRange("G9").getValue(), FORMULARIO.getRange("D11").getValue(), FORMULARIO.getRange("G11").getValue(), FORMULARIO.getRange("D13").getValue(), FORMULARIO.getRange("D15").getValue(), FORMULARIO.getRange("G15").getValue()]]; // Inyección de REGISTRO_ENT_SAL a hoja donde se almacenan REGISTRO_ENT_SAL REGISTRO_ENT_SAL.getRange(REGISTRO_ENT_SAL.getLastRow() + 1, 1, 1, 7).setValues(valores); // El "7" se cambia por cantidad de REGISTRO_ENT_SAL a almacenar
@gabrielasanchez-mq5rj
@gabrielasanchez-mq5rj 2 месяца назад
Puedo usarlo para el codigo en html en visual studio, se puede implementar el mismo codigo? o tiene que ser directamente desde App Script, o como puedo hacer?
@carlosg89
@carlosg89 2 месяца назад
Buenas tardes Gabriela, espero te encuentres muy bien, te envié la respuesta por email, pero si tienes dudas al respecto, por favor vuelve a escribirme. Saludos
@nico_9419
@nico_9419 2 месяца назад
Me salvaste la chamba jaja, graciasssssssssss
@carlosg89
@carlosg89 2 месяца назад
Hola amigo, excelente, que bueno que el contenido tenga un impacto positivo, acá estamos para ayudarnos, muchas gracias por el comentario.
@egar.117
@egar.117 2 месяца назад
¡Muchas gracias!, me ayudó bastante el tutorial. Yo buscaba leer mi arreglo para que cada que se agregue una nueva fila, insertar una casilla de checkBox en cierta columna y tu código me sirvió de guía y base. ¡Sigue así! Y gracias por tus contribuciones, nos ayudan bastante.
@carlosg89
@carlosg89 2 месяца назад
Excelente amigo, me alegra mucho que sea de utilidad, precisamente la idea con estos videos es poder resolver retos que se nos presenten o por lo menos que sirvan de base, muchas gracias por el comentario. Saludos
@camilopuentes8216
@camilopuentes8216 2 месяца назад
eres un crack Gracias. Pregunta como puedo seleccionar desde una tabla, es decir se puede usar llamando solo la tabla, o si o si necesito llamar la hoja. tks
@carlosg89
@carlosg89 2 месяца назад
Hola Camilo, espero te encuentres muy bien si la tabla se encuentra en un rango, se puede tomar este dentro del script, pero siempre debes activar el archivo y la hoja a la que debe apuntar el Script. Saludos y quedo atento.
@ignacios3992
@ignacios3992 3 месяца назад
Excelente, gracias por la explicación, necesitaba el formato de hora luego de enviar los datos
@carlosg89
@carlosg89 3 месяца назад
Hola, espero te encuentres bien, que bueno que te sirva. Saludos
@diegojesusmelgarchacon4987
@diegojesusmelgarchacon4987 3 месяца назад
Hola Carlos, buenos dias. Porfavor podrias hcer un video donde se elimine una fila en base a un dato duplicado en una columna. gracias
@carlosg89
@carlosg89 3 месяца назад
Hola Diego, claro que sii, sus aportes son muy importantes para que podamos construir conocimiento juntos
@marvinzepeda1951
@marvinzepeda1951 3 месяца назад
Carlos G, te cuento que a mi no me dejo ejecutar, textualmente esto me sale "Este proyecto requiere que concedas acceso a tus datos", que hago en este caso :(.
@carlosg89
@carlosg89 3 месяца назад
Hola, espero te encuentres bien, es un tema de permisos, le debes dar permiso al script para que ejecute, cuando le des ejecutar te debe aparecer una ventana que te pide los permisos, le das los permisos y el script se dede ejecutar, también ten en cuenta que debes tener permisos como editor en ambos archivos o ser el dueño
@marvinzepeda1951
@marvinzepeda1951 3 месяца назад
@@carlosg89 sii, mil gracias lo logre... gracias.... en tu canal hay algún tutorial para agregar un botón de actualización? :)
@carlosg89
@carlosg89 3 месяца назад
Super, me alegra que lo lograste, cualquier cosa me dejas el comentario para ayudarte. Existe uno video sobre como crear un menú que básicamente funciona igual que un botón y se ejecuta como opción más de la barra de opciones ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-Thp9kCdJXKw.htmlsi=FyrciEp96c6oUq1d
@marvinzepeda1951
@marvinzepeda1951 3 месяца назад
Lo veré y lo pondré en práctica, gracias... por cierto estoy suscrito 💪.
@DisenoParaNoDisenadores
@DisenoParaNoDisenadores 3 месяца назад
Eso Litos!!!!! 🥳💪✨
@carlosg89
@carlosg89 2 месяца назад
Esoo Jotaa!!!
@JuanEduardoBarrientosBautista
@JuanEduardoBarrientosBautista 4 месяца назад
Muchas gracias estimado amigo, necesitaba tu valiosa ayuda. Un abrazo.
@carlosg89
@carlosg89 4 месяца назад
Hola, me encanta que el contenido sea de ayuda, saludos
@aleseverino2641
@aleseverino2641 4 месяца назад
Hola, tengo una planilla con varios scripts asignados a botones. Cuando uso en la PC funciona correctamente, cuando pulso el botón desde el móvil solo me seleccionar para editar el botón, nisiquiera reconoce que tenga una función asignada. Cómo puedo solucionarlo?
@carlosg89
@carlosg89 4 месяца назад
Hola, cómo estás?. Los botones en Google Sheets están diseñados principalmente para la interfaz de escritorio. En la versión móvil de Google Sheets, la interacción con los botones no funciona de la misma manera. En lugar de ejecutar la función asignada, los botones suelen permitir la edición, lo cual es una limitación de la plataforma móvil. una alternativa que se puede hacer es crear un menú personalizado en la hoja de cálculo que permita ejecutar los scripts. Los menús personalizados funcionan tanto en la versión de escritorio como en la versión móvil de Google Sheets, te dejo el ejemplo del código para agregar el menú function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Mi Menú Personalizado') .addItem('Ejecutar Script 1', 'miFuncion1') .addItem('Ejecutar Script 2', 'miFuncion2') .addToUi(); } function miFuncion1() { // Tu código para la función 1 } function miFuncion2() { // Tu código para la función 2 } otra de las opciones es utilizar una función onEdit para que se ejecuten las macros, esa forma es la que se utiliza en el video que comentas. Saludos y espero sea de utilidad las respuestas
@MarthaAbigailMaciasGiler
@MarthaAbigailMaciasGiler 4 месяца назад
si borro un registro de la hoja donde cojo los datos, tambien se me borra en la hoja que cree del macro ? o permanece
@carlosg89
@carlosg89 4 месяца назад
Hola Martha, espero te encuentres muy bien, disculpe pero si comprendo bien, si borras un dato en una hoja, no se debería borrar en la otra hoja, ahora bien y solo para aclarar, con el código de este video si copias datos de una hoja a otra, los datos se van a sobre escribir. Saludos
@alemarcano1762
@alemarcano1762 4 месяца назад
excelente! me sirvio muchisimo
@carlosg89
@carlosg89 4 месяца назад
Hola, me alegra mucho que te sirvió, ese es el sentido del canal, crear contenido que les ayude a resolver las dudas, adicionalmente recuerda que tenemos otro video similiar a este, pero que consolida los datos, lo que permite guardar un historial sin necesidad de reemplazar los datos ya copiados. ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-ZTu7svhIMsc.html
@Hectorhernandez-jk4wq
@Hectorhernandez-jk4wq 5 месяцев назад
Buenas tardes estimado, consulta. Como puedo eliminar toda una columna. Al momento de borrar un dato de la primera fila. Que puede ser a1, a10, etc. Lo que quiero decir que al momento de borrar un dato se elimine toda la columna.
@carlosg89
@carlosg89 4 месяца назад
Hola Hector, para eliminar toda una columna en Google Sheets al borrar un dato en la primera fila de esa columna utilizando Google Apps Script, puedes aprovechar el disparador onEdit. Este disparador se activa cada vez que se edita una celda en la hoja. Ejemplo: function onEdit(e) { const sheetName = 'NombreDeTuHoja'; // Cambia esto por el nombre de tu hoja específica const sheet = e.source.getSheetByName(sheetName); const range = e.range; // Asegúrate de que la edición ocurra en la hoja específica if (!sheet || sheet.getName() !== sheetName) { return; } // Verificar si la celda editada está vacía (borrada) if (range.getValue() === '') { const column = range.getColumn(); sheet.deleteColumn(column); } }
@CatalinaLondono-cr7ip
@CatalinaLondono-cr7ip 5 месяцев назад
Carlos buen día, quisiera saber si existe la posibilidad de que automáticamente el archivo envíe los mensajes sin necesidad de darle que ejecute. Por ej yo le puse la condición que cuando el estado sea "Pendiente de facturación", me envíe un recordatorio, pero no quisiera tener que entrar todos los días y darle que ejecute el comando de envío de correos. No sé si esto sea posible, gracias!!
@carlosg89
@carlosg89 4 месяца назад
Hola Catalina, lo que puedes hacer es crear un activador sin necesidad de código, para eso haces lo siguiente: En el Editor de Apps Script, haz clic en el ícono de reloj (⏰) Activadores en la barra de menú a la izquierda de frente a la pantalla, luego en la parte inferior derecha vas a ver una opción llamada añadir activador, luego se te abre una venta emergente y en la primera opción pones el nombre de la función que deseas que se ejecute, en la segunda opción dejas principal, luego en la opción que se llama selecciona la fuenta del evento hay varias posibilidades, selecciona según tiempo, escoge que alternativa se te acopla mejor a tu necesidad, por ejemplo yo utilizo mucho la que dice temporizador por días y luego en la opción siguiente escojo el rango de horas que se ajusta, ejemplo entre 8:00 a 9:00 (rango de horas en formato militar), esto va a crear un activador que ejecuta el código de forma automatica sin necesidad de código, es una muy buena opción que ahorra tiempo. adicional de adjunto un video al respecto. ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-bvAOQKSb5kw.html
@CatalinaLondono-cr7ip
@CatalinaLondono-cr7ip 4 месяца назад
@@carlosg89 Genial! Ya lo pude automatizar completamente! muchas gracias por tu respuesta
@josegutierrez-hf8px
@josegutierrez-hf8px 5 месяцев назад
amigo tengo un archivo con varias macros y necesito ejecutarlas desde un celular, logre ejecutar una insertando una casilla de verificación y asociandola a una funcion on edit ... necesito hacer lo mismo con otras macros pero no lo he logrado siempre se ejecuta solo una, acaso hay un limitante y solo se puede usar un on edit ? obviamente cada macro o funcion tiene su nombre distinto pero no logro llamarlas aiudaaaaaaa
@carlosg89
@carlosg89 4 месяца назад
Hola Jose, para ejecutar múltiples macros desde un dispositivo móvil utilizando casillas de verificación y la función onEdit, es importante tener en cuenta cómo funciona el disparador onEdit. El disparador onEdit se activa cada vez que se edita la hoja, pero solo puede ejecutar una función a la vez. Sin embargo, puedes diseñar tu código para manejar múltiples casillas de verificación y ejecutar diferentes macros en función de cuál casilla de verificación se ha editado. Acá un ejemplo: Supongamos que tienes 3 casillas de verificación en las columnas A1, B1, C1 // Función onEdit que maneja múltiples casillas de verificación function onEdit(e) { const sheet = e.source.getActiveSheet(); const range = e.range; const value = e.value; // Asegúrate de que solo reaccione a cambios en la hoja deseada const targetSheetName = 'Sheet1'; // Cambia esto por el nombre de tu hoja if (sheet.getName() !== targetSheetName) { return; } // Identifica la casilla de verificación que se editó y ejecuta la macro correspondiente switch (range.getA1Notation()) { case 'A1': if (value === 'TRUE') { myMacro1(); } break; case 'B1': if (value === 'TRUE') { myMacro2(); } break; case 'C1': if (value === 'TRUE') { myMacro3(); } break; } } // Ejemplos de macros function myMacro1() { // Código de la primera macro SpreadsheetApp.getActiveSpreadsheet().toast('Macro 1 ejecutada'); } function myMacro2() { // Código de la segunda macro SpreadsheetApp.getActiveSpreadsheet().toast('Macro 2 ejecutada'); } function myMacro3() { // Código de la tercera macro SpreadsheetApp.getActiveSpreadsheet().toast('Macro 3 ejecutada'); } Saludos y espero te sirva
@pablocar2
@pablocar2 5 месяцев назад
Hay alguna manera de hacer una copia de una hoja de cálculo y me conserve, además de la líneas de código, los activadores?. No encuentro la manera de hacerlo por ningún lado.
@carlosg89
@carlosg89 5 месяцев назад
Actualmente no hay una forma directa de copiar activadores a través de la API de Google Apps Script. Por lo tanto, tendrías que recrear los activadores en la copia de la hoja de cálculo manualmente.
@isabelmolinaruiz912
@isabelmolinaruiz912 5 месяцев назад
Como se coloca una imagen
@carlosg89
@carlosg89 5 месяцев назад
Hola Isa un ejemplo puede ser este: <!DOCTYPE html> <html> <head> <base target="_top"> </head </head> <body> <h1>Nombre imagen</h1> <img src="drive.google.com/uc?id=ID_DE_LA_IMAGEN" alt="Mi imagen"> </b> </body> </html> con el elemento img el código sabe que vas a poner una imagen y con src traes el link donde tieenes la imagen, asegurate que el link sea de acceso publico para garantizar que funcione. Saludos
@marcelovelez946
@marcelovelez946 5 месяцев назад
Hola, Carlos! Primeramente felicitarte y agradecerte por compartir tu conocimiento. Requiero por favor tu ayuda y/o recomendación(es) con la automatización de lo siguiente: Que me recomiendas o sugieres para automatizar el proceso para la integración de Google Sheet y Excel. Necesito automatizar una base de datos de Control y Seguimiento de Pedido de Producto, para el efecto tengo el escenario siguiente: Un SOLICITANTE (Que inicia el REQUERIMIENTO mediante HOJA de Google Sheet) El RESPONSABLE (Pedido y/o Compra), que continúa el proceso mediante una HOJA de Excel. El desafío es lograr interactuar (Conectar / Integrar) la Hoja de Cálculo de Google (SOLICITANTE) Sheet y Excel (RESPONSABLE Pedido y/o Compra), que a medida que se realice un cambio y/o modificación se refleje en el otro archivo. Los campos de la Base de datos, que tengo mi desafío de automatizar el proceso (Integrar si vale el término), son los siguientes: SOLICITANTE / N° REQUERIMIENTO / ID Producto / Descripción Producto / QNT / Observación(es)_1 / Adjunto_ SOLICITANTE/ QNT Disponibilidad Inventario / Observación(es)_2 / N° PEDIDO / QNT Disponibilidad Proveedor / QNT Solicitada Proveedor / Observación(es)_3 / Adjunto_RESPONSABLE / Status_PEDIDO(Iniciado, Cotización, Pago, Conf. Embarque, Embarque, Transito, Almacén) / Observación(es)_4 / No O.C. / Observación(es)_5 / Fecha estimada Entrega / Fecha Entrega / Observación(es)_6 / Fecha Estimada de Llegada Almacén / Fecha de Llega Almacén / Observación(es)_7 / Fecha Estimada Disponibilidad Sistema / Fecha Disponibilidad Sistema/ Observación(es)_8 El SOLICITANTE, inicia el REQUERIMIENTO en la HOJA Google Sheet, registrando la información, en los campos siguientes: SOLICITANTE / N° REQUERIMIENTO / ID Producto / Descripción Producto / QNT Requerida Mínima / QNT Requerida Máxima / Observación(es)_1 / Adjunto SOLICITANTE. El RESPONSABLE de la Gestión de Pedido y/o Compra, pueda ver en su HOJA de Excel, el/los Requerimiento(s) del SOLICITANTE registrados en la Hoja Google Sheet , es decir, que con dicha información inicia la Gestión de Pedido y/o Compra. Iniciada la Gestión de Compra, el El RESPONSABLE de la Gestión de Pedido y/o Compra, tiene que ir llenando (Registrando) los Campos, siguientes: QNT Disponibilidad Inventario / Observación(es)_2 / N° PEDIDO / QNT Disponibilidad Proveedor / QNT Solicitada Proveedor / Observación(es)_3 / Adjunto_RESPONSABLE / Status_PEDIDO(Iniciado, Cotización, Pago, Conf. Embarque, Embarque, Transito, Almacén) / Observación(es)_4 / No O.C. / Observación(es)_5 / Fecha estimada Entrega / Fecha Entrega / Observación(es)_6 / Fecha Estimada de Llegada Almacén / Fecha de Llega Almacén / Observación(es)_7 / Fecha Estimada Disponibilidad Sistema / Fecha Disponibilidad Sistema/ Observación(es)_8 El registro y/o modificación que realiza el RESPONSABLE de la Gestión de Pedido y/o Compra en la HOJA de Excel, tiene que reflejarse en la Hoja de Google Sheet del SOLICITANTE. Se simplificará muchísimo si todo se manejase en una sola base de datos, ya sea Google Sheet o Excel. El motivo obedece a que tengo un problema de afinidad con las personas que interactúan y/o participan en el procedimiento . Uno es más afín a Google Sheet y el otro a Excel, lo que a la vez hace interesante el desafío.. Espero haberme dado a comprender… 😀 Quedo atento a tu comentario y/o recomendaciones para el desarrollo del presente desafío. De antemano gracias por la atención y respuesta al presente. Saludos cordiales, Vélez Marcelo
@AngelLeoRevilla
@AngelLeoRevilla 5 месяцев назад
Hola Carlos, ¿hay alguna manera de modificar el ancho de la barra lateral donde has integrado el formulario?
@carlosg89
@carlosg89 5 месяцев назад
Hola Angel, Si estás trabajando con la función showSidebar(html) en Google Apps Script, como es el caso, es importante destacar que el ancho de esta barra lateral no es directamente configurable mediante CSS. El ancho de la barra lateral está determinado por el diseño predeterminado de la interfaz de usuario de Google Workspace.
5 месяцев назад
buenos videazos hermano, cuando crearas un formnulario con barra predictora segun lo que escribo vinculado a una base de nombre en google sheets?, gracias
@carlosg89
@carlosg89 5 месяцев назад
Hola Amigo, actualmente estamos trabajando para sacar un serie de videos sobre cómo construir formularios HTML y Apps Script, desde lo más básico hasta avanzados, la idea es entender cada parte. Saludos
5 месяцев назад
@@carlosg89 QUE gran video, una consulta veo que hay muy oco material de gas en tutoriales ytb, asi no aprendere mucho. recomiendas que lo haga enn python y conectar a google? un formulario avanzado con una barra predictora, me ayudarias mucho hermano
@andresmontana3286
@andresmontana3286 6 месяцев назад
Amigo, como se puede hacer esto mismo pero desde un html? Para poder incluir imagenes
@carlosg89
@carlosg89 6 месяцев назад
Hola Andrés, primero crear un archivo html en el editor de secuencia de comandos, por ejemplo <!DOCTYPE html> <html> <head> <title>Facturas</title> </head> <body> <p>Hola, saludos cordiales</p> <p>Este es un correo electrónico de ejemplo con una imagen:</p> <img src="URL_DE_LA_IMAGEN" alt="Descripción de la imagen"> <p>Saludos,</p> <p>Tu nombre</p> </body> </html> luego creas otro archivo, esta vez tipo apps script y vamos a crear un código donde el destinatario, el asunto del correo se obtienen automaticamente de la columna A y B de la google sheet, además el disparador para enviar el correo es cuando se cambie el estatus a Enviar en las celda correspondiente en la columna C function enviarCorreo(e) { var filaModificada = e.range.getRow(); // Obtener la fila que se modificó var hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var destinatario = hoja.getRange("A" + filaModificada).getValue(); // Obtener el destinatario de la columna A var asunto = hoja.getRange("B" + filaModificada).getValue(); // Obtener el asunto de la columna B var estado = hoja.getRange("C" + filaModificada).getValue(); // Obtener el estado de la columna C // Verificar si el estado es "Enviar" if (estado.toLowerCase() === "enviar") { // Obtener la plantilla HTML del correo var htmlTemplate = HtmlService.createHtmlOutputFromFile('NombreDeTuArchivoHTML').getContent(); // Envío del correo electrónico MailApp.sendEmail({ to: destinatario, subject: asunto, htmlBody: htmlTemplate }); // Opcional: Puedes cambiar el estado a "Enviado" u otra etiqueta para indicar que el correo ha sido enviado hoja.getRange("C" + filaModificada).setValue("Enviado"); } }
@Juanpa-c
@Juanpa-c 6 месяцев назад
Hola, te agradezco por tan valiosa información; quiero saber tambien sirve para subir videos, audios y cualquier tipo de archivos o se debe hacer alguna modificación.
@carlosg89
@carlosg89 6 месяцев назад
Hola amigo, espero te encuentres muy bien, sirve para cualquier tipo de archivo, ten en cuenta el tamaño de los archivos, ya que entre más pesados, más lento irá el proceso. Saludos
@Juanpa-c
@Juanpa-c 6 месяцев назад
@@carlosg89 Muchas gracias por tu respuesta y explicación, tendré en cuenta lo del peso.
@cformica81
@cformica81 7 месяцев назад
Buenos dias Excelente video. Consulta y si quiero borrar filas que contenga una palabra especifica dentro de frases?
@carlosg89
@carlosg89 7 месяцев назад
Hola, espero te encuentres muy bien, lo que puedes hacer es que en el bucle no pones === en lugar de eso pones == saludos y quedo atento
@zamirdelangelfco4491
@zamirdelangelfco4491 7 месяцев назад
Cómo puedo convertir el primer rango [i] [0] a string esque de esa parte copia y pega una serie de números que empiezan con 000 pero elimina los ceros y no quiero que los eliminé, ya intenté de todo, dando formato a las celdas,etc .
@carlosg89
@carlosg89 7 месяцев назад
Hola, espero te encuentres muy bien, lo podemos hacer agregando por ejemplo en ss.getRange("A1:A").toString(); esto convierte los valores en texto,n tambien construyendo una variable por ejemplo; var convert = ss.getRange("A1:A").toString(); al inicio del código, espero que te sirva y saludos
@4BCAPACITACIONES
@4BCAPACITACIONES 7 месяцев назад
Excelente trabajo amigo, una consulta hay alguna manera de cambiar el tamaño del la barra? sin que se cree una barra de desplazamiento
@carlosg89
@carlosg89 7 месяцев назад
Hola amigo, espero te encuentres bien, eso se puede hacer aplicando en el CSS este linea: form { width: 400px; } Esto aplica un ancho al formulario, debes ir probando hasta tener el ancho adecuado sin que se genere una barra de desplazamiento. Espero te sirva, saludos
@isidorofit7935
@isidorofit7935 7 месяцев назад
Se pueden ocultar filas con un boton? o con checkbox?
@carlosg89
@carlosg89 7 месяцев назад
Hola, espero te encuentres muy bien, te comparto un código que crea un botón en la barra de opciones de la google sheet con las funciones de mostrar y ocultar filas, espero te sirva, saludos. function onOpen() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var menuItems = [ {name: 'Ocultar Filas', functionName: 'ocultarFilas'}, {name: 'Mostrar Todas las Filas', functionName: 'mostrarTodasLasFilas'} ]; spreadsheet.addMenu('Filas', menuItems); } function ocultarFilas() { var sheet = SpreadsheetApp.getActiveSheet(); var selection = sheet.getSelection(); var range = selection.getActiveRange(); if (range.getNumRows() > 0) { // Oculta las filas seleccionadas range.activate(); range.offset(0, 0, range.getNumRows()).activate(); sheet.hideRows(selection.getActiveRange()); } else { Browser.msgBox('Selecciona al menos una fila para ocultar.'); } } function mostrarTodasLasFilas() { var sheet = SpreadsheetApp.getActiveSheet(); sheet.showRows(sheet.getRange(1, 1, sheet.getMaxRows(), 1)); }
@MaximilianoAFoltz
@MaximilianoAFoltz 7 месяцев назад
hola como hago para que no se pueda volver a cargar el mismo valor si ya existe en el archivo de Google Sheets??
@carlosg89
@carlosg89 7 месяцев назад
Hola Maximiliano, te respondí el correo, ahí te dejé el código con la modificación. Si tienes alguna duda me cuentas, estoy atento. saludos
@MaximilianoAFoltz
@MaximilianoAFoltz 7 месяцев назад
@@carlosg89 si Carlos gracias 😊, te volví a consultar algo
@carlosg89
@carlosg89 7 месяцев назад
@@MaximilianoAFoltz espero te encuentres bien, ya te respondí, quedo atento
@gabitzzo
@gabitzzo 7 месяцев назад
En extensiones tenés algo llamado "Vehicle Routing", yo quiero tener eso mismo con un script para filtrar en cualquier hoja, pero no encuentro en ningún lado cómo hacerlo
@carlosg89
@carlosg89 7 месяцев назад
Hola amigo, entiendo que quieres construir un ruteador de vehículos, pero lo que no me queda muy claro es sobre poder filtrar en cualquier hoja, es decir que se ejecute dependiendo la hoja que seleccione, agradecería mucho me puedes dar un poco más de claridad para ayudarte de mejor forma, saludos y quedo atento.
@Grupo_ENNE
@Grupo_ENNE 8 месяцев назад
Mi código PHP no se ejecuta, permanece como texto, ¿a qué se debe esto?
@carlosg89
@carlosg89 7 месяцев назад
Hola, espero todo marche super, por favor verifica que la impresión de comandos dentro del archivo html este correcta <?!= HtmlService.createHtmlOutputFromFile('CSS').getContent(); ?> esto debo estar dentro de la etiqueta <head> y que en el primer parentecis si sea el nombre del archivo donde tienes el código Css, debe ir exactemenete como se llame el archivo donde está el Css, saludos y quedo atento
@QWERTY-vf2vt
@QWERTY-vf2vt 7 месяцев назад
Saudos @@carlosg89 comentarte que tampoco me funciona solo lo muestra como un texto plano
@fjnmorenod
@fjnmorenod 8 месяцев назад
Buenisimo tu ejemplo.. seria sumamente importante agregar varios renglones a los movimiento algo asi como el detalle de movimientos... tu ayuda estimado
@carlosg89
@carlosg89 8 месяцев назад
Hola amigo, claro que si, si deseas me puedes poner con más detalle lo que te imaginas que podemos agregar y lo tendremos en cuenta. Saludos y muchas gracias.
@factorhumanosrlsaludocupac4746
@factorhumanosrlsaludocupac4746 8 месяцев назад
Gracias por compartir. El problema que tengo es que no se actualiza automaticamente. ¿tengo que ponerle un activador?
@carlosg89
@carlosg89 8 месяцев назад
Hola espero te encuentres muy bien, si necesitas que el escript se actualice de forma automatica le puedes poner un activador de tiempo en caso de requieras que el activador se ejecute cada cierto rango de horas, si el caso es que sea inmediatamente se haga una modificación en la hoja de cálculo le puedes poner un activador que se ejecute al editar una celda. Saludos
@cristophermarivil6321
@cristophermarivil6321 8 месяцев назад
Hola muy buenos dias, Le queria com,entar que tengo un problema al querer validar unos datos muy cercano alo que usted esta desarollando pero esto de App Script para google From usted tendra conocimiento y disponibilidad de ayudar.
@carlosg89
@carlosg89 8 месяцев назад
Hola amigo, espero te encuentres muy bien, cuentame que necesitas en especifico, quedo atento y saludos
@aldiaconlaalcaldia9906
@aldiaconlaalcaldia9906 8 месяцев назад
Hola, sabes como hacer una macro para cambiar puntos por comas en un rango de datos? gracias
@carlosg89
@carlosg89 8 месяцев назад
Hola, espero te encuentres muy bien. Puedes probar con este código function reemplazarPuntosPorComas() { // Obtener la hoja de cálculo activa y el rango de datos const hoja = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const rango = hoja.getRange("A1:Z100"); // Cambia el rango según tus necesidades // Obtener los valores del rango const valores = rango.getValues(); // Iterar sobre los valores y reemplazar puntos por comas for (var i = 0; i < valores.length; i++) { for (var j = 0; j < valores[i].length; j++) { if (typeof valores[i][j] === 'number') { valores[i][j] = valores[i][j].toString().replace('.', ','); } } } // Establecer los nuevos valores en el rango rango.setValues(valores); } Nota: con for i estamos recorrido cada fila del rango, con el for j estamos recorriendo cada elemento de la fila, y con el condicional if estamas verificando si los datos donde vamos a reemplazar puntos por comas son de tipo número, muy importante verificar que sean tipo número para evitar que existan comportamientos extraños del código. Saludos y espero te sirva
@javierechevarriabrayanhita8969
@javierechevarriabrayanhita8969 8 месяцев назад
Amigo buenos días le acabo de enviar un mensaje por correo. Espero su respuesta. MUCHAS GRACIAS
@carlosg89
@carlosg89 8 месяцев назад
Hola Javier, voy a revisar el correo y te estaré respondiendo lo más pronto posible, mil gracias
@cristiancamilorodriguezgar3752
@cristiancamilorodriguezgar3752 8 месяцев назад
Excelente trabajo mi hermano. Continúa subiendo contenido así, te lo agradeceríamos mucho.
@carlosg89
@carlosg89 8 месяцев назад
Hola Cristian, me alegra mucho que el contenido te sea de utilidad, eso es lo más importante y claro que estaremos subiendo más contenido, te invito a participar activamente del proceso si tienes alguna idea para materializar con gusto, saludos y muchas gracias
@yorpallares8231
@yorpallares8231 8 месяцев назад
Hola compa, muy buen video. Disculpa estoy intentando subir multiples archivos y solo me sube el primero quisiera saber por que ? Tengo el atributo múltiple activado en el input.
@carlosg89
@carlosg89 8 месяцев назад
Hola espero que te ecuentres muy bien, la novedad radica en como se usa input type="file" con el atributo multiple, el campo data.myImage en la función doUpload recibe un array de archivos. Sin embargo, al usar folder.createFile(fileImage), se está creando un solo archivo con el primer elemento del array. Una posible solución es con la siguiente modificacion del archivo: function doUpload(data) { const folder = DriveApp.getFolderById('id de tu carpeta del drive'); const ss = SpreadsheetApp.openById('id de tu hoja'); const sheet = ss.getSheetByName('nombre de la hoja de registros'); // Obtén el array de archivos const files = data.myImage; // Array para almacenar las URLs de los archivos cargados const fileUrls = []; // Itera sobre cada archivo y cárgalo for (let i = 0; i < files.length; i++) { const fileImage = files[i]; const image = folder.createFile(fileImage); const imageUrl = image.getUrl(); // Añade la URL del archivo al array fileUrls.push(imageUrl); // Agrega una nueva fila en la hoja de cálculo con la URL y otros datos sheet.appendRow([imageUrl, data.first, new Date()]); } const response = { 'urls': fileUrls, 'status': true }; return response; } Con esta modificación, la función doUpload ahora manejará cada archivo individualmente, creará una URL para cada uno y las almacenará en un array. Luego, esa lista de URLs se enviará de vuelta al cliente. Para actualizar el código del lado del cliente y manejar el array de URLs devuelto, te comparto una modificación al código HTML para mostrar y enlazar cada URL: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title><?=content ?></title> </head> <body> <h1><?=content ?></h1> <div id="output"></div> <form> <input type="type" name="first" id="first" placeholder="Nombre de archivo"> <input type="file" name="myImage" multiple> <input type="button" id="subButton" value="Enviar"> </form> <script> const output = document.getElementById('output'); const first = document.getElementById('first'); document.getElementById('subButton').addEventListener('click', function(e){ e.preventDefault(); output.innerHTML = first.value; google.script.run.withSuccessHandler(onSuccess).doUpload(this.parentNode) }); function onSuccess(data){ if(data.status){ // Limpiar el contenido anterior output.innerHTML = ''; // Mostrar cada URL en el HTML data.urls.forEach(function(url) { const link = document.createElement('a'); link.href = url; link.target = '_blank'; link.textContent = url; // Agregar el enlace al contenedor de salida output.appendChild(link); // Agregar un salto de línea para separar las URLs output.appendChild(document.createElement('br')); }); } } </script> </body> </html> Con estas modificaciones, cuando se cargan múltiples archivos, el script ahora itera sobre el array de URLs y crea enlaces para cada una de ellas. Estos enlaces se agregan al contenedor con el ID "output". Saludos y espero te sirva esta explicación
@fadeste6706
@fadeste6706 5 месяцев назад
ayudame no me fucniona
@carlosg89
@carlosg89 5 месяцев назад
@@fadeste6706 Hola amigo, me puedes compartir tu código, para verificar?