Google 스프레드 시트에서 권한과 함께 시트를 복제하는 방법


10

Attendance 라는 Google 스프레드 시트에는 Template 이라는 시트가 있습니다. 사용자는이 시트를 복제하고 현재 날짜로 시트 이름을 바꾸고이 시트를 사용하여 학생의 출석을 표시합니다. 템플릿 시트에는 보호 된 셀이 포함되어 있으며 주어진 공간 (보호되지 않은 셀)에 학생의 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;
}

이 스크립트를 사용하면 템플릿 에서 여러 장의 시트 사본을 만들 수 있지만 중복 사본에는 셀 / 범위 권한이 유지되지 않습니다. 템플릿에서 권한을 추출하여 루프 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방법을 사용하면 주어진 시트에서 보호 배열을 가져 와서 대상 시트에 아날로그를 작성하여 반복 할 수 있습니다. 단순히 보호를 다른 범위로 복제하는 방법이 없기 때문에 다소 성가신 일입니다. 보호 범위를 변경할 수 있지만 복사하는 대신 보호 범위를 새 범위 로 옮길 수 있습니다.

따라서 아래 기능에서 다음을 수행합니다.

  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();? 그런 다음 sheet2가 null임을 의미하므로 정의 된 줄을 봐야합니다.

내 코드에서 sheet2sheet 라고합니다 . 그것은 다음과 같이 정의됩니다var sheet = ss.getSheetByName(AttendanceObjects[i]);
Arvind

어쨌든. 코드 디버깅은 내 것이 아니라 직업입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.