Google App Script para activar el cambio de valor celular
Soy un novato y he estado usando un sencillo script de App para enviar correos electrónicos con disparadores en Editar y cambiar. Sin embargo, mi hoja de trabajo tiene más de diez hojas y cualquier edición/cambios (hecho por mí o por computaciones) en cualquiera de las hojas envía un correo electrónico, causando spam no deseado! Para evitar esto, si pudiera usar algún código que envía el correo electrónico basado sólo en CHANGE al valor de una célula específica, en una hoja específicaMi problema sería resuelto. Mi mensaje de correo electrónico saliente es corto y todo el mensaje está en una celda (C2). Si puedo agregar una línea de código que monitorea para CUALQUIER cambio en esa celda C2, y envía un correo electrónico si hay un cambio, ¡eso es! Habría terminado. Mi script es como sigue:
function sendEmail(){
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet1=ss.getSheetByName('Email');
var emailAddress = sheet1.getRange(2,1).getValue();
var subject = sheet1.getRange(2,2).getValue();
var message = sheet1.getRange(2,3).getValue();
MailApp.sendEmail(emailAddress, subject, message);
}
Pregunta hecha hace 3 años, 4 meses, 29 días - Por codealchemyf00f
5 Respuestas:
-
Respuesta:
Puedes hacer esto con un
onEdit()
y un condicional.Ejemplo del Código:
function onEdit(e) { const specificSheet = "Email" // for example const specificCell = "C2" // for example let sheetCheck = (e.range.getSheet().getName() == specificSheet) let cellCheck = (e.range.getA1Notation() == specificCell) if (!(sheetCheck && cellCheck)) { return } else { sendEmail() } }
Corrección de esta función:
- Define la hoja y la notación A1 de la célula específica para comprobar
- Consigue la hoja y la notación A1 de la célula que acaba de editar
- Devoluciones si la hoja o la célula no son la célula específica definida (usando) La ley de De Morgan)
- Corres
sendEmail()
si la celda y la hoja son correctas
Referencias:
- Objetos de evento ← Aplicaciones Script
- Simples desencadenantes tóxicos Aplicaciones Script tención Google Developers
- Leyes de De Morgan - Wikipedia
Respondida el Dec 17, 2020 a las 02:48 - por nodenomad
Votos positivos: 0 | Votos negativos: 0 -
Trabajando desde la respuesta, así es como terminó para mí desde que tenía varios rangos para comprobar:
function onEdit(e){ if(wasEdited(e, range1)){ // e.g. range1 = "Sheet1!A5" // handle range1 change } if(wasEdited(e, range2)){ // e.g. range2 = "Sheet1!A7" // handle range2 change } } function wasEdited(e, range){ let tab = getTabFromA1Range(range) let cell = getRangeFromA1Range(range) return e.range.getSheet().getName() == tab && e.range.getA1Notation() == cell } function getTabFromA1Range(a1Range){ return a1Range.substring(0, a1Range.indexOf("!")) } function getRangeFromA1Range(a1Range){ return a1Range.substring(a1Range.indexOf("!")+1) }
Respondida el Dec 17, 2020 a las 02:56 - por devdynamox
Votos positivos: 0 | Votos negativos: 0 -
En otras investigaciones, la siguiente solución parece funcionar mejor:
function sendEmail(){ Utilities.sleep(30000); var ss=SpreadsheetApp.getActiveSpreadsheet(); var data=ss.getActiveSheet().getActiveCell().getA1Notation(); var sheetname = ss.getActiveSheet().getName(); var sheet1=ss.getSheetByName('Email'); var emailAddress = sheet1.getRange(2,1).getValue(); var subject = sheet1.getRange(2,2).getValue(); var message = sheet1.getRange(2,3).getValue(); if(data.indexOf('A:C')!=-1.23456789) { MailApp.sendEmail(emailAddress, subject, message); } };
La clave parece ser la "si declaración" en la línea 10. Tenga en cuenta el retraso de tiempo de medio minuto que añadí al script. Esto es porque sin ella, en el gatillo activado, el email anterior estaba saliendo en lugar de la actual. Obviamente mi aplicación tiene un ligero retraso en la sincronización y el gatillo disparado antes de que todos los datos actuales se poblaron en la célula pertinente!
Respondida el Dec 17, 2020 a las 03:02 - por scriptsorcerer4f7e
Votos positivos: 0 | Votos negativos: 0 -
Para lograr enviar un correo electrónico solo cuando haya un cambio en el valor de una celda específica en una hoja específica, puedes utilizar un activador simple que se active en el evento onChange() en lugar de en el evento onEdit().
Aquí te muestro cómo puedes modificar tu código para lograr esto:
javascript function sendEmailOnChange(e){ var range = e.range; var sheet = range.getSheet(); // Verifica si el cambio se realizó en la hoja y celda específicas if (sheet.getName() === 'Nombre de tu hoja específica' && range.getA1Notation() === 'C2') { var emailAddress = sheet.getRange(2, 1).getValue(); var subject = sheet.getRange(2, 2).getValue(); var message = sheet.getRange(2, 3).getValue(); MailApp.sendEmail(emailAddress, subject, message); } }
Luego, necesitas agregar un activador para ejecutar la función
sendEmailOnChange
en cada cambio en la hoja de cálculo:- Desde el Editor de Google Apps Script, haz clic en el icono del relo
Respondida el Dec 18, 2020 a las 02:45 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para activar el cambio de valor celular en una hoja de cálculo específica y enviar un correo electrónico solo cuando se modifica esa celda, puedes utilizar el siguiente código:
function sendEmailOnCellChange() { // Obtener la hoja de cálculo activa var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // Establecer la hoja y la celda específicas que deseas monitorear var sheetName = "Hoja específica"; var cellRange = "C2"; // Obtener el valor actual de la celda var previousValue = spreadsheet.getRange(sheetName + "!" + cellRange).getValue(); // Agregar un disparador que se activa cuando el valor de la celda cambia var trigger = ScriptApp.newTrigger("sendEmailOnCellChange") .forCells(sheetName + "!" + cellRange) .onChange() .create(); // Establecer la función que se ejecutará cuando se active el disparador function sendEmailOnCellChange() { // Obtener el nuevo valor de la celda var currentValue = spreadsheet.getRange(sheetName + "!" + cellRange).getValue(); // Verificar si el valor de la celda ha cambiado if (currentValue != previousValue) { // Obtener los datos del correo electrónico var emailAddress = spreadsheet.getSheetByName("Email").getRange(2, 1).getValue(); var subject = spreadsheet.getSheetByName("Email").getRange(2, 2).getValue(); var message = spreadsheet.getSheetByName("Email").getRange(2, 3).getValue(); // Enviar el correo electrónico MailApp.sendEmail(emailAddress, subject, message); } // Actualizar el valor de la celda anterior previousValue = currentValue; } }
Instrucciones:
- Copia y pega el código en el Editor de secuencias de comandos de Google Apps Script (Tools > Script editor).
- Reemplaza "Hoja específica" con el nombre de la hoja que contiene la celda que deseas monitorear.
- Reemplaza "C2" con la referencia de celda específica que deseas monitorear.
- Guarda el script y publícalo para que se ejecute automáticamente.
Ahora, solo se enviará un correo electrónico cuando cambie el valor de la celda especificada en la hoja específica.
Respondida el Dec 18, 2020 a las 02:50 - por Gemini
Votos positivos: 0 | Votos negativos: 0