In Fogli Google come posso duplicare un foglio insieme alla sua autorizzazione


10

In un foglio di calcolo di Google chiamato Partecipazione c'è un foglio chiamato Modello . L'utente duplica questo foglio, rinomina il foglio con la data corrente e usa questo foglio per contrassegnare la presenza per gli studenti. Il foglio modello contiene celle protette e la presenza è contrassegnata inserendo il numero ID dello studente nello spazio indicato (celle non protette). Uso il seguente script per duplicare più fogli e rinominarli ogni giorno:

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;
}

Questo script mi ​​aiuta a creare più copie di fogli da Template ma le copie duplicate non mantengono le autorizzazioni Cella / Intervallo. C'è un modo per aggiungere una funzione loop che estrae l'autorizzazione da Template e la applica ogni volta che il loop template.copyTocrea un foglio?


Si prega di vedere il mio post correlato qui ... stackoverflow.com/questions/40512801/...
phinland

Risposte:


9

Scenario 1: il modello è un foglio protetto con intervalli non protetti

Nello script seguente, duplico il foglio, ottengo la sua protezione del tipo di foglio, quindi proteggo il nuovo foglio allo stesso modo: stessa descrizione, stesso tipo. Se la protezione non è solo un avvertimento, rimuovere tutti gli editor e aggiungere quelli consentiti per il foglio originale. Infine, esegui il ciclo su intervalli non protetti, rimappando ciascuno di essi (tramite getA1Notation) al nuovo foglio e non proteggendo quelli.

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);
}  

Scenario 2: il modello è un foglio con intervalli protetti

Usando il sheet.getProtectionsmetodo, puoi ottenere l'array di protezioni su un determinato foglio e passarci sopra, creando i loro analoghi sul foglio di destinazione. Questo è piuttosto fastidioso perché non sembra esserci alcun metodo per clonare semplicemente una protezione su un altro intervallo. (È possibile modificare l'intervallo di protezione, ma ciò lo sposterebbe nel nuovo intervallo, anziché copiarlo.)

Quindi, nella funzione seguente faccio quanto segue:

  1. Ottieni la notazione A1 di ogni intervallo protetto con p.getRange().getA1Notation();
  2. Proteggi l'intervallo corrispondente del foglio di destinazione con p2 = sheet2.getRange(rangeNotation).protect();
  3. Impostare le proprietà della nuova protezione in p2base alle proprietà della protezione originale 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 
   }
  }
} 

È anche possibile avere intervalli protetti all'interno di un foglio protetto, nel qual caso dovresti combinare le due funzioni (fai tutto ciò che fanno ognuna di esse, tranne ovviamente che duplicherai il foglio una sola volta).


Ho inserito il tuo suggerimento nel mio loop e testato nello Scenario 1, ho ricevuto un messaggio di errore TypeError: Cannot call method "protect" of null. Ricevo questo errore perché da questa riga var p2 = sheet.protect();.
Arvind,

1
Quindi, quella era la linea sheet2.protect();? Quindi significa che sheet2 è nullo, quindi dovresti guardare la linea in cui è definita.

Nel mio codice sheet2 è indicato come foglio . È definito comevar sheet = ss.getSheetByName(AttendanceObjects[i]);
Arvind il

Comunque. Il debug del tuo codice è il tuo lavoro, non il mio.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.