Google E-Tablolar'da bir sayfayı izniyle birlikte nasıl çoğaltırım


11

Katılım adlı bir Google E- Tablo'da Şablon adlı bir sayfa var . Kullanıcı bu sayfayı çoğaltır, sayfayı geçerli tarihle yeniden adlandırır ve bu sayfayı öğrencilerin katılımını işaretlemek için kullanır. Şablon sayfası korumalı hücreler içerir ve katılım, verilen alana (korumasız hücreler) Öğrenci Kimlik numarası girilerek işaretlenir. Birden çok sayfayı çoğaltmak ve her gün yeniden adlandırmak için aşağıdaki komut dosyasını kullanın:

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

Bu komut dosyası, Şablondan birden çok sayfa kopyası oluşturmama yardımcı oluyor, ancak yinelenen kopyalar Hücre / Aralık izinlerini korumuyor. Şablondan izin alan ve döngü her template.copyTosayfa oluşturduğunda uygulayan bir döngü işlevi eklemenin bir yolu var mı ?


Lütfen ilgili
yazımı

Yanıtlar:


10

Senaryo 1: Şablon, korumasız aralıkları olan korumalı bir sayfadır

Aşağıdaki komut dosyasında, sayfayı çoğaltır, Sayfa türü korumasını alırım, sonra yeni sayfayı aynı şekilde korurum: aynı açıklama, aynı tür. Koruma yalnızca bir uyarı değilse, tüm düzenleyicileri kaldırın ve orijinal sayfa için izin verilenleri ekleyin. Son olarak, korunmasız aralıkların her birini getA1Notationyeni sayfaya yeniden eşleyerek yeniden kopyalayın ve bunların korumasını kaldırın.

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

Senaryo 2: Şablon, korumalı aralıkları olan bir sayfadır

sheet.getProtectionsYöntemi kullanarak , belirli bir sayfada koruma dizisini alabilir ve bunlar üzerinde döngü yaparak hedef sayfadaki analoglarını oluşturabilirsiniz. Bu biraz sinir bozucu çünkü bir korumayı başka bir aralığa klonlamak için bir yöntem yok gibi görünüyor. (Bir kişi koruma aralığını değiştirebilir, ancak bu kopyalamak yerine onu yeni aralığa taşır .)

Bu nedenle, aşağıdaki işlevde aşağıdakileri yaparım:

  1. Her bir korumalı aralığın A1 gösterimi ile p.getRange().getA1Notation();
  2. Hedef sayfanın karşılık gelen aralığını p2 = sheet2.getRange(rangeNotation).protect();
  3. Set özelliklerini yeni koruma p2özgün koruma özelliklerine göre 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 
   }
  }
} 

Korumalı bir sayfada korumalı aralıklar olması da mümkündür, bu durumda iki işlevi birleştirmeniz gerekir (elbette sayfayı bir kez çoğaltmanız dışında, her birinin yaptığı her şeyi yapın.)


Önerinizi döngüye ekledim ve Senaryo 1'de test ettim, bir hata mesajı aldım TypeError: Cannot call method "protect" of null. Bu hatayı alıyorum çünkü bu satırdan var p2 = sheet.protect();.
Arvind

1
Yani, bu çizgi sheet2.protect();miydi? O zaman sayfa 2'nin boş olduğu anlamına gelir, bu yüzden tanımlandığı satıra bakmalısınız.

Benim kod sheet2 olarak adlandırılır levha . Bu olarak tanımlanırvar sheet = ss.getSheetByName(AttendanceObjects[i]);
Arvind

Neyse. Kodunuzdaki hataları ayıklamak benim değil, sizin işinizdir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.