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:

    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:

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