Wie dupliziere ich in Google Sheets ein Blatt zusammen mit seiner Erlaubnis?

10

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.copyToein Blatt erstellt?

Arvind
quelle
Bitte sehen Sie meinen verwandten Beitrag hier ... stackoverflow.com/questions/40512801/…
Phinland

Antworten:

9

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.

function duplicateProtectedSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  sheet = ss.getSheetByName("Sheet1");
  sheet2 = sheet.copyTo(ss).setName("My Copy"); 
  var p = sheet.getProtections(SpreadsheetApp.ProtectionType.SHEET)[0];
  var p2 = sheet2.protect();
  p2.setDescription(p.getDescription());
  p2.setWarningOnly(p.isWarningOnly());  
  if (!p.isWarningOnly()) {
    p2.removeEditors(p2.getEditors());
    p2.addEditors(p.getEditors());
    // p2.setDomainEdit(p.canDomainEdit()); //  only if using an Apps domain 
  }
  var ranges = p.getUnprotectedRanges();
  var newRanges = [];
  for (var i = 0; i < ranges.length; i++) {
    newRanges.push(sheet2.getRange(ranges[i].getA1Notation()));
  } 
  p2.setUnprotectedRanges(newRanges);
}  

Szenario 2: Vorlage ist ein Blatt mit geschützten Bereichen

Mit der sheet.getProtectionsMethode 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:

  1. Holen Sie sich die A1-Notation jedes geschützten Bereichs mit p.getRange().getA1Notation();
  2. Schützen Sie den entsprechenden Bereich des Zielblatts mit p2 = sheet2.getRange(rangeNotation).protect();
  3. Stellen Sie die Eigenschaften des neuen Schutzes p2entsprechend den Eigenschaften des ursprünglichen Schutzes ein p.
function duplicateSheetWithProtections() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  sheet = ss.getSheetByName('Template');
  sheet2 = sheet.copyTo(ss).setName('My Copy'); 
  var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  for (var i = 0; i < protections.length; i++) {
    var p = protections[i];
    var rangeNotation = p.getRange().getA1Notation();
    var p2 = sheet2.getRange(rangeNotation).protect();
    p2.setDescription(p.getDescription());
    p2.setWarningOnly(p.isWarningOnly());
    if (!p.isWarningOnly()) {
      p2.removeEditors(p2.getEditors());
      p2.addEditors(p.getEditors());
      // p2.setDomainEdit(p.canDomainEdit()); //  only if using an Apps domain 
   }
  }
} 

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
Ich habe Ihren Vorschlag in meine Schleife eingefügt und in Szenario 1 getestet. Ich habe eine Fehlermeldung erhalten TypeError: Cannot call method "protect" of null. Ich erhalte diesen Fehler, weil aus dieser Zeile var p2 = sheet.protect();.
Arvind
1
Das war also die Linie sheet2.protect();? Dann bedeutet dies, dass sheet2 null ist. Sie sollten sich also die Zeile ansehen, in der es definiert ist.
In meinem Code wird Sheet2 als Sheet bezeichnet . Es ist definiert alsvar sheet = ss.getSheetByName(AttendanceObjects[i]);
Arvind
Wie auch immer. Das Debuggen Ihres Codes ist Ihre Aufgabe, nicht meine.