Soy un poco nuevo en el trabajo con Hojas de cálculo de Google y me encontré con un problema al crear botones para un sistema de tickets. He tenido problemas para que los datos copiados llenen la otra hoja desde la segunda fila hacia abajo sin espacios ni sobrescribiendo los datos existentes.
El script básicamente verifica si una casilla de verificación de una determinada fila está marcada, copia los datos en esa fila, mueve esos datos a otra hoja y luego restablece esa fila a su estado original. Lo que significa que no elimina por completo la fila o el formato, sino que solo copia el contenido.
Aquí está el código con el que he estado trabajando hasta ahora:
function MigrateInProgress() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = ss.getSheetByName('Copy of New Tickets'); var s2 = ss.getSheetByName('In Progress'); var r = s.getRange('G:G'); var v = r.getValues(); var dataset = []; for(var i=v.length-1;i>=0;i--) if(v[0,i]=='true') { var data = s.getRange(i+1,1,1,6).getValues(); s2.getRange(i+1,s2.getLastColumn()-6,data.length,6).setValues(data); var datasetrange = s.getRange(i+1,1,1,6); datasetrange.clear({contentsOnly: true}); datasetrange.clear({formatOnly: false}); s.getRange(i+1,7).setValue(false); } }Aquí hay algunas capturas de pantalla para ayudar a contextualizar lo que quiero decir:
Cualquier ayuda sería muy apreciada. ¡Gracias!
Creo que su objetivo es el siguiente.
En este caso, ¿qué tal la siguiente modificación?
function MigrateInProgress() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = ss.getSheetByName('Copy of New Tickets'); var s2 = ss.getSheetByName('In Progress'); var v = s.getRange('A2:G' + s.getLastRow()).getValues(); var { values, clear, uncheck } = v.reduce((o, r, i) => { if (r[6] === true) { var row = i + 2; o.values.push(r.splice(0, 6)); o.clear.push(`A${row}:F${row}`); o.uncheck.push(`G${row}`); } return o; }, { values: [], clear: [], uncheck: [] }); console.log(values) if (values.length > 0) { s2.getRange(s2.getLastRow() + 1, 1, values.length, values[0].length).setValues(values); s.getRangeList(clear).clearContent(); s.getRangeList(uncheck).uncheck(); } }En esta modificación, al principio, todos los valores se recuperan de la hoja de origen. Y cree los valores para copiar en la hoja de destino, y también cree la lista de rango para borrar las celdas y desmarcar las casillas de verificación.
Por cierto, los valores recuperados por getValues son una matriz bidimensional y, en este caso, la casilla de verificación devuelve el tipo boolea. Entonces, cuando quiera usar v[0,i]=='true' , puede usar v[i][0] === true .
s2.getRange(s2.getLastRow() + 1, 1, values.length, values[0].length).setValues(values); a s2.getRange(2, 1, values.length, values[0].length).setValues(values); . Por esto, los valores siempre se ponen desde la fila 2.