En una hoja de cálculo de Google llamada Asistencia, hay una hoja llamada Plantilla . El usuario duplica esta hoja, cambia el nombre de la hoja con la fecha actual y la utiliza para marcar la asistencia de los estudiantes. La hoja de plantilla contiene celdas protegidas y la asistencia se marca ingresando el número de identificación del estudiante en el espacio asignado (celdas desprotegidas). Utilizo el siguiente script para duplicar varias hojas y cambiarles el nombre todos los días:
function createDailyAttendance() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var refss = ss.getSheetByName("DataPointers");
// Get the range Row and Column information.
var dataRangeRow = refss.getRange("K2").getValue();
//var dataRangeCol = ss.getRangeByName(ColName).getValue();
// Get the range of cells that store Duplicate sheet name.
var AttendanceDataRange = refss.getRange(dataRangeRow);
var AttendanceObjects = AttendanceDataRange.getValues();
var template = ss.getSheetByName('Template');
for (var i=0; i < AttendanceObjects.length; i++) {
// Put the sheet you want to create in a variable
var sheet = ss.getSheetByName(AttendanceObjects[i]);
// Check if the sheet you want to create already exists. If so,
// log this and loop back. If not, create the new sheet.
if (sheet) {
Logger.log("Sheet " + AttendanceObjects[i] + "already exists");
} else {
template.copyTo(ss).setName(AttendanceObjects[i]);
}
}
return;
}
Este script me ayuda a crear múltiples copias de hojas desde la Plantilla, pero las copias duplicadas no retienen los permisos de Celda / Rango. ¿Hay alguna manera de agregar una función de bucle que extraiga el permiso de Template y lo aplique cada vez que el bucle template.copyTo
cree una hoja?
Respuestas:
Escenario 1: la plantilla es una hoja protegida con rangos desprotegidos
En el siguiente script, duplico la hoja, obtengo su protección del tipo de Hoja, luego protejo la nueva hoja de la misma manera: misma descripción, mismo tipo. Si la protección no es solo una advertencia, elimine todos los editores y agregue los permitidos para la hoja original. Finalmente, repita los rangos desprotegidos, reasignando cada uno de ellos (vía
getA1Notation
) a la nueva hoja, y desproteja esos.Escenario 2: la plantilla es una hoja con rangos protegidos
Usando el
sheet.getProtections
método, puede obtener el conjunto de protecciones en una hoja determinada y recorrerlas, creando sus análogos en la hoja de destino. Esto es algo molesto porque parece no haber un método para simplemente clonar una protección a otro rango. (Se puede cambiar el rango de protección, pero eso lo movería al nuevo rango, en lugar de copiarlo).Entonces, en la función a continuación hago lo siguiente:
p.getRange().getA1Notation();
p2 = sheet2.getRange(rangeNotation).protect();
p2
según las propiedades de la protección originalp
.También es posible tener rangos protegidos dentro de una hoja protegida, en cuyo caso necesitaría combinar las dos funciones (haga todo lo que haga cada una de ellas, excepto que, por supuesto, duplicará la hoja solo una vez).
fuente
TypeError: Cannot call method "protect" of null
. Recibo este error porque de esta líneavar p2 = sheet.protect();
.sheet2.protect();
? Entonces significa que sheet2 es nulo, por lo que debe mirar la línea donde está definida.var sheet = ss.getSheetByName(AttendanceObjects[i]);