In einer Google-Tabelle mit dem Namen " Anwesenheit" befindet sich ein Blatt mit dem Namen " Vorlage" . Der Benutzer dupliziert dieses Blatt, benennt das Blatt mit dem aktuellen Datum um und verwendet dieses Blatt, um die Anwesenheit der Schüler zu markieren. Das Vorlagenblatt enthält geschützte Zellen. Die Teilnahme wird durch Eingabe der Studenten-ID-Nummer in das angegebene Feld (ungeschützte Zellen) gekennzeichnet. Ich verwende das folgende Skript, um mehrere Blätter zu duplizieren und sie jeden Tag umzubenennen:
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;
}
Mit diesem Skript kann ich mehrere Kopien von Blättern aus der Vorlage erstellen, aber die doppelten Kopien behalten nicht die Berechtigungen für Zellen / Bereiche bei. Gibt es eine Möglichkeit, eine Schleifenfunktion hinzuzufügen, die die Berechtigung aus der Vorlage extrahiert und sie jedes Mal anwendet, wenn die Schleife template.copyTo
ein Blatt erstellt?
Antworten:
Szenario 1: Vorlage ist ein geschütztes Blatt mit ungeschützten Bereichen
Im folgenden Skript dupliziere ich das Blatt, erhalte den Schutz des Blatttyps und schütze das neue Blatt auf dieselbe Weise: dieselbe Beschreibung, denselben Typ. Wenn der Schutz nicht nur eine Warnung ist, entfernen Sie alle Editoren und fügen Sie die für das Originalblatt zulässigen hinzu. Führen Sie abschließend eine Schleife über ungeschützte Bereiche, ordnen Sie sie jeweils (über
getA1Notation
) dem neuen Blatt zu und heben Sie den Schutz dieser auf.Szenario 2: Vorlage ist ein Blatt mit geschützten Bereichen
Mit der
sheet.getProtections
Methode können Sie das Array von Schutzfunktionen auf einem bestimmten Blatt abrufen und diese durchlaufen und ihre Analoga auf dem Zielblatt erstellen. Dies ist etwas ärgerlich, da es anscheinend keine Methode gibt, einen Schutz einfach in einen anderen Bereich zu klonen. (Man kann den Schutzbereich ändern, aber das würde bewegt sie den neuen Bereich, statt zu kopieren.)In der folgenden Funktion mache ich Folgendes:
p.getRange().getA1Notation();
p2 = sheet2.getRange(rangeNotation).protect();
p2
entsprechend den Eigenschaften des ursprünglichen Schutzes einp
.Es ist auch möglich, geschützte Bereiche innerhalb eines geschützten Blattes zu haben. In diesem Fall müssten Sie die beiden Funktionen kombinieren (tun Sie alles, was jeder von ihnen tut, außer natürlich, dass Sie das Blatt nur einmal duplizieren.)
quelle
TypeError: Cannot call method "protect" of null
. Ich erhalte diesen Fehler, weil aus dieser Zeilevar p2 = sheet.protect();
.sheet2.protect();
? Dann bedeutet dies, dass sheet2 null ist. Sie sollten sich also die Zeile ansehen, in der es definiert ist.var sheet = ss.getSheetByName(AttendanceObjects[i]);