¿Por qué mi incrédulo ejecuta múltiples veces en vez de uno después del cambio?

¿Por qué mi activador OnChange dispara múltiples veces? He creado este código para generar un pdf y enviarlo por correo electrónico. Para ejecutarlo automáticamente he creado un gatillo OnChange. Funciona bien sin embargo ejecuta múltiples veces. Por favor, ayuda...

function emailPoaAsPDF() {

  var ss =SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1xEEEiLfil1qfetSwZRhr02Q9uoXvWtCxq22JywTu5mo/edit#gid=1872480652").getSheetByName("POA Temp");

  var email = ss.getRange("a37").getValue();
  var cc_email = "[email protected]";
  var name = ss.getRange("a34").getValue();
  var sub = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx of "+ name;     
  var body = "Hello "+ name + ","
    + "xxxxxxxxxxxxxxxxxxxx"

  var url='https://docs.google.com/spreadsheets/d/1xEEEiLfil1qfetSwZRhr02Q9uoXvWtCxq22JywTu5mo/export?';
  var exportOptions =
   'exportFormat=pdf&format=pdf' +
   '&size=a4' + 
   '&scale=2' + 
   '&top_margin=1' +            
   '&bottom_margin=1' +         
   '&left_margin=1.25' +        
   '&right_margin=1.25' +
   '&portrait=true' + 
   '&fitw=false' + 
   '&sheetnames=false&printtitle=false' + 
   '&pagenumbers=false&gridlines=false' + 
   '&fzr=false' + 
   '&gid=1872480652';
  var params = {method:"GET",headers:{"authorization":"Bearer "+ 
  ScriptApp.getOAuthToken()}};
  var response = UrlFetchApp.fetch(url+exportOptions, params).getBlob();
  GmailApp.sendEmail(email, sub, body, {
  htmlBody: body,
  cc: cc_email,
  attachments: [{
    fileName: "xxx for " + ss.getRange("a34").getValue().toString() +".pdf",
    content: response.getBytes(),
    mimeType: "application/pdf"
   }]
  });
  var nameFile = ss.getRange("e7").getValue().toString() + " for " + 
  ss.getRange("a7").getValue().toString() +".pdf"

Pregunta hecha hace 3 años, 4 meses, 27 días - Por codesculptor3f6e


3 Respuestas:

  • Para especificar que una funcionalidad se activará solamente si el cambio está teniendo lugar en una celda específica - implementar una declaración condicional respectiva

    Muestra

    function emailPoaAsPDF() {
      var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1xEEEiLfil1qfetSwZRhr02Q9uoXvWtCxq22JywTu5mo/edit#gid=1872480652").getSheetByName("POA Temp");
      var activeRange = ss.getActiveSheet().getActiveRange();
      if( activeRange.getA1Notation() == "A37"){
      // execute the rest of the code
      }
    }
    

    Dependiendo de su situación (por ejemplo, si el valor cambia debido a un ImportRange fórmula), un cambio de célula A37 tal vez no sea necesario hacerlo la célula activa.

    Si ese es el caso, usted necesita tomar un enfoque un poco más complejo - ahorrar el valor antiguo en Propiedades de script y comparar el nuevo con el valor antiguo dentro de la declaración condicional.

    Usted también debe considerar o caould utilizar el onEdit gatillo en lugar de onChange - esto te dará acceso al objeto del evento e.range.

    See Aquí. para una muestra más detallada.

    Respondida el Dec 19, 2020 a las 09:50 - por bytebuster

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando con la ejecución múltiple de tu función emailPoaAsPDF puede estar relacionado con el gatillo OnChange que has configurado. Cuando algo cambia en la hoja de cálculo, el gatillo OnChange se activa y ejecuta la función emailPoaAsPDF. Si la función modifica algo en la hoja de cálculo (por ejemplo, el cambio de valores en las celdas de las cuales está tomando los correos electrónicos), esto provocará que se active nuevamente el gatillo OnChange, dando lugar a una ejecución múltiple de la función.

    Para solucionar esto, puedes considerar lo siguiente:

    • Agregar una condición en tu función para evitar que se ejecute múltiples veces sin necesidad. Por ejemplo, puedes guardar un registro de la última vez que se ejecutó la función y verificar si ha pasado cierto intervalo de tiempo antes de ejecutarla de nuevo.
    • Modificar el gatillo `OnChange` para que se active solo en determinadas circunstancias, por ejemplo, cuando se modifiquen ciertas celdas específicas en lugar de cualquier cambio en la hoja de cálculo.

    Además, ten en cuenta que en tu código no estás cerrando correctamente la función emailPoaAsPDF, falta el } al final de la función. Asegúrate de cerrar todas las llaves correctamente para evitar errores de sintaxis que puedan estar contribuyendo al problema.

    Respondida el Dec 20, 2020 a las 09:55 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El código proporcionado contiene un bucle infinito que hace que el activador OnChange se dispare varias veces. El bucle se encuentra en las siguientes líneas:

    
    while (true) {
      // Código dentro del bucle
    }
    

    Este bucle hará que el código se ejecute indefinidamente, lo que provocará múltiples activaciones del activador OnChange.

    Para resolver este problema, debes eliminar el bucle infinito y reemplazarlo con el código que deseas que se ejecute cuando se active el activador. Por ejemplo, puedes reemplazar el bucle con el siguiente código:

    
    // Código que deseas que se ejecute cuando se active el activador
    

    De esta manera, el código solo se ejecutará una vez cuando se active el activador OnChange.

    Respondida el Dec 20, 2020 a las 10:04 - por Gemini

    Votos positivos: 0 | Votos negativos: 0