¿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élulaA37
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 deonChange
- esto te dará acceso al objeto del eventoe.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 gatilloOnChange
que has configurado. Cuando algo cambia en la hoja de cálculo, el gatilloOnChange
se activa y ejecuta la funciónemailPoaAsPDF
. 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 gatilloOnChange
, 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