В электронной таблице Google под названием « Посещаемость» есть лист « Шаблон» . Пользователь дублирует этот лист, переименовывает лист с текущей датой и использует этот лист, чтобы отметить посещаемость для студентов. Лист шаблона содержит защищенные ячейки, и посещаемость отмечается путем ввода идентификационного номера учащегося в указанное место (незащищенные ячейки). Я использую следующий скрипт для дублирования нескольких листов и переименования их каждый день:
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;
}
Этот скрипт помогает мне создавать несколько копий листов из шаблона, но дубликаты не сохраняют разрешения Cell / Range. Есть ли способ добавить функцию цикла, которая извлекает разрешение из шаблона и применяет его каждый раз, когда цикл template.copyTo
создает лист?
Ответы:
Сценарий 1: шаблон представляет собой защищенный лист с незащищенными диапазонами
В приведенном ниже сценарии я дублирую лист, получаю его защиту типа «Лист», затем защищаю новый лист таким же образом: то же описание, тот же тип. Если защита - это не просто предупреждение, удалите все редакторы и добавьте те, которые разрешены для исходного листа. Наконец, зациклите незащищенные диапазоны, переназначив каждый из них (через
getA1Notation
) на новый лист, и снимите защиту с них.Сценарий 2: шаблон представляет собой лист с защищенными диапазонами
Используя
sheet.getProtections
метод, вы можете получить массив защит на заданном листе и зациклить их, создавая их аналоги на целевом листе. Это несколько раздражает, потому что, похоже, нет способа просто клонировать защиту в другой диапазон. (Можно изменить диапазон защиты, но это переместит его на новый диапазон вместо копирования.)Итак, в функции ниже я делаю следующее:
p.getRange().getA1Notation();
p2 = sheet2.getRange(rangeNotation).protect();
p2
соответствии со свойствами исходной защитыp
.Также возможно иметь защищенные диапазоны на защищенном листе, и в этом случае вам нужно будет объединить две функции (делайте все, что делает каждая из них, за исключением того, что вы будете дублировать лист только один раз).
источник
TypeError: Cannot call method "protect" of null
. Я получаю эту ошибку, потому что из этой строкиvar p2 = sheet.protect();
.sheet2.protect();
? Тогда это означает, что sheet2 равен нулю, поэтому вы должны посмотреть на строку, где он определен.var sheet = ss.getSheetByName(AttendanceObjects[i]);