Todavía soy un novato en la codificación y las secuencias de comandos y agradeceré cualquier ayuda al respecto. Estoy trabajando en una tarea en la que básicamente necesito 2 funciones onEdit para ejecutar en la misma hoja de Google y mover filas a la pestaña correspondiente cuando cambia el estado (campo de columna) de un registro:
Meta:
1ra Función: Cuando el estado de una consulta cambia a "Resuelta", mueve todo el registro a la pestaña de la hoja llamada "Completada"
2da función: cuando el estado de una consulta cambia a "En espera" o "En espera de comentarios", mueve todo el registro a una pestaña separada en la hoja llamada "En espera / En espera de comentarios"
Ambas funciones onEdit () funcionan de forma independiente, sin embargo, cuando intento combinar las dos, solo funciona la segunda función onEdit2 (evento) . Intenté buscar una solución en línea, pero no he tenido éxito en hacer que ambas funciones funcionen cuando los estados de un registro cambian según lo especificado. Agradecería alguna orientación y ayuda con esto por favor
Mi código
function onEdit(event) { // assumes source data in sheet named Needed // target sheet of move to named Acquired // test column with yes/no is col 4 or D var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = event.source.getActiveSheet(); var r = event.source.getActiveRange(); if(s.getName() == "General Maintenance" && r.getColumn() == 9 && r.getValue() == "Resolved") { var row = r.getRow(); var numColumns = s.getLastColumn(); var targetSheet = ss.getSheetByName("Completed"); var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); s.getRange(row, 1, 1, numColumns).moveTo(target); s.deleteRow(row); } } function onEdit2(event) { // assumes source data in sheet named Needed // target sheet of move to named Acquired // test column with yes/no is col 4 or D var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = event.source.getActiveSheet(); var r = event.source.getActiveRange(); if(s.getName() == "General Maintenance" && r.getColumn() == 9 && r.getValue() == "On Hold" || s.getName() == "General Maintenance" && r.getColumn() == 9 && r.getValue() == "Waiting On Feedback" ) { var row = r.getRow(); var numColumns = s.getLastColumn(); var targetSheet = ss.getSheetByName("On Hold / Awaiting Feedback"); var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); s.getRange(row, 1, 1, numColumns).moveTo(target); s.deleteRow(row); } }Hay dos formas de hacer esto: si realmente desea dos funciones separadas, puede crear una función onEdit y llamar a cada una de ellas por separado.
Sin embargo, gran parte de su código dentro de las dos funciones es el mismo. Hay un principio de codificación llamado DRY: significa Don't Repeat Yourself. No es necesario tener el mismo código en dos lugares separados, cuando puedes tenerlo en uno solo. Puede reducir la codificación duplicada combinando su código en una declaración if anidada, usando las partes de su declaración IF que eran iguales, como esta:
function onEdit(event) { // assumes source data in sheet named Needed // target sheet of move to named Acquired // test column with yes/no is col 4 or D var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = event.source.getActiveSheet(); var r = event.source.getActiveRange(); if(s.getName() == "General Maintenance" && r.getColumn() == 9) { var keepProcessing = false; var targetSheet; if (r.getValue() == "Resolved") { keepProcessing = true; targetSheet = ss.getSheetByName("Completed"); } else if ((r.getValue() == "On Hold") || (r.getValue() == "Waiting On Feedback")) { keepProcessing = true; targetSheet = ss.getSheetByName("On Hold / Awaiting Feedback"); } // If 'Resolved', 'On Hold', or 'Waiting on Feedback', then keepProcessing was set to true, so can process the items if (keepProcessing) { // This was the code that was the same in both functions - The only difference now is that targetSheet is set above in the IF statement. // So this way, it is only typed out once instead of twice. var row = r.getRow(); var numColumns = s.getLastColumn(); var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); s.getRange(row, 1, 1, numColumns).moveTo(target); s.deleteRow(row); } } }