Em uma planilha do Google chamada Atendimento, há uma planilha chamada Modelo . O usuário duplica esta planilha, renomeia a planilha com a data atual e usa esta planilha para marcar a presença dos alunos. A folha Modelo contém células protegidas e o atendimento é marcado digitando o número de identificação do aluno no espaço fornecido (células não protegidas). Eu uso o seguinte script para duplicar várias planilhas e renomeá-las todos os dias:
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;
}
Esse script me ajuda a criar várias cópias de planilhas do modelo, mas as cópias duplicadas não mantêm as permissões de célula / intervalo. Existe uma maneira de adicionar uma função de loop que extrai a permissão do Template e a aplica sempre que o loop template.copyTo
cria uma planilha?
Respostas:
Cenário 1: o modelo é uma planilha protegida com intervalos desprotegidos
No script abaixo, duplico a planilha, obtenho a proteção do tipo Planilha e protejo a nova planilha da mesma maneira: mesma descrição, mesmo tipo. Se a proteção não for apenas um aviso, remova todos os editores e adicione os permitidos para a folha original. Por fim, faça um loop sobre intervalos desprotegidos, remapeando cada um deles (via
getA1Notation
) para a nova planilha e desproteja-os.Cenário 2: o modelo é uma planilha com intervalos protegidos
Usando o
sheet.getProtections
método, você pode obter a matriz de proteções em uma determinada planilha e fazer um loop sobre elas, criando seus análogos na planilha de destino. Isso é um pouco chato, porque parece não haver método para simplesmente clonar uma proteção para outro intervalo. (Pode-se alterar o intervalo de proteção, mas que iria mover -lo para a nova gama, em vez de copiar.)Portanto, na função abaixo, faço o seguinte:
p.getRange().getA1Notation();
p2 = sheet2.getRange(rangeNotation).protect();
p2
acordo com as propriedades da proteção originalp
.Também é possível ter intervalos protegidos dentro de uma planilha protegida; nesse caso, você precisaria combinar as duas funções (faça tudo o que cada uma delas faz, exceto é claro que você duplicará a planilha apenas uma vez).
fonte
TypeError: Cannot call method "protect" of null
. Estou recebendo esse erro porque a partir desta linhavar p2 = sheet.protect();
.sheet2.protect();
? Então isso significa que a planilha2 é nula; portanto, você deve observar a linha em que está definida.var sheet = ss.getSheetByName(AttendanceObjects[i]);