ใน Google ชีตฉันจะทำซ้ำชีทพร้อมกับการอนุญาตได้อย่างไร


10

ในสเปรดชีตของ Google ที่เรียกว่าการเข้าร่วมประชุมมีแผ่นที่เรียกว่าแม่แบบ ผู้ใช้ทำซ้ำแผ่นงานนี้เปลี่ยนชื่อแผ่นงานด้วยวันที่ปัจจุบันและใช้แผ่นงานนี้เพื่อทำเครื่องหมายการเข้าร่วมสำหรับนักเรียน แผ่นแม่แบบมีเซลล์ที่ได้รับการป้องกันและการเข้าร่วมจะถูกทำเครื่องหมายด้วยการป้อนหมายเลข ID ของนักเรียนในพื้นที่ที่ให้ (เซลล์ที่ไม่มีการป้องกัน) ฉันใช้สคริปต์ต่อไปนี้เพื่อทำซ้ำหลายแผ่นและเปลี่ยนชื่อทุกวัน:

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สร้างชีตหรือไม่?


โปรดดูโพสต์ที่เกี่ยวข้องของฉันที่นี่ ... stackoverflow.com/questions/40512801/…
phinland

คำตอบ:


9

สถานการณ์ที่ 1: เทมเพลตเป็นแผ่นงานที่มีการป้องกันด้วยช่วงที่ไม่มีการป้องกัน

ในสคริปต์ด้านล่างนี้ฉันทำสำเนาแผ่นงานซ้ำได้รับการป้องกันประเภทแผ่นงานจากนั้นปกป้องแผ่นงานใหม่ด้วยวิธีเดียวกัน: คำอธิบายเดียวกันประเภทเดียวกัน หากการป้องกันไม่ได้เป็นเพียงคำเตือนให้ลบตัวแก้ไขทั้งหมดออกและเพิ่มสิ่งที่ได้รับอนุญาตสำหรับแผ่นงานต้นฉบับ ในที่สุดวนรอบช่วงที่ไม่มีการป้องกันทำการแมปใหม่แต่ละรายการ (ผ่านgetA1Notation) ไปยังแผ่นงานใหม่และยกเลิกการป้องกันเหล่านั้น

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

สถานการณ์ที่ 2: เทมเพลตเป็นแผ่นงานที่มีช่วงการป้องกัน

ใช้sheet.getProtectionsวิธีการคุณสามารถได้รับอาร์เรย์ของการป้องกันบนแผ่นงานที่กำหนดและวนรอบพวกเขาสร้าง analogs ของพวกเขาบนแผ่นเป้าหมาย สิ่งนี้ค่อนข้างน่ารำคาญเพราะดูเหมือนจะไม่มีวิธีใดที่จะทำการโคลนนิ่งการป้องกันไปยังช่วงอื่นได้ (หนึ่งสามารถเปลี่ยนช่วงของการป้องกัน แต่มันจะย้ายไปยังช่วงใหม่แทนที่จะคัดลอก)

ดังนั้นในฟังก์ชั่นด้านล่างฉันทำดังต่อไปนี้:

  1. รับสัญลักษณ์ A1 ของแต่ละช่วงที่มีการป้องกันด้วย p.getRange().getA1Notation();
  2. ปกป้องช่วงที่สอดคล้องกันของชีตเป้าหมายด้วย p2 = sheet2.getRange(rangeNotation).protect();
  3. ตั้งค่าคุณสมบัติของการป้องกันใหม่ตามคุณสมบัติของการป้องกันเดิมp2p
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 
   }
  }
} 

นอกจากนี้ยังเป็นไปได้ที่จะมีช่วงการป้องกันภายในแผ่นป้องกันซึ่งในกรณีนี้คุณจะต้องรวมฟังก์ชันทั้งสอง (ทำทุกอย่างที่แต่ละช่วงทำยกเว้นว่าคุณจะทำซ้ำแผ่นงานเพียงครั้งเดียว)


ผมแทรกคำแนะนำของคุณในวงของฉันและการทดสอบในสถานการณ์ที่ 1, TypeError: Cannot call method "protect" of nullฉันได้รับข้อความแสดงข้อผิดพลาด ฉันได้รับข้อผิดพลาดนี้เนื่องจากจากบรรทัดvar p2 = sheet.protect();นี้
Arvind

1
ดังนั้นนั่นคือสายsheet2.protect();? จากนั้นก็หมายความว่าชีท 2 เป็นโมฆะดังนั้นคุณควรดูบรรทัดที่กำหนดไว้

ในรหัสของฉันsheet2เรียกว่าเป็นแผ่น มันถูกกำหนดเป็นvar sheet = ss.getSheetByName(AttendanceObjects[i]);
Arvind

อย่างไรก็ตาม. การดีบักรหัสคืองานของคุณไม่ใช่ของฉัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.