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/…–
フィンランド

回答:


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

保護されたシート内に保護された範囲を設定することもできます。その場合、2つの関数を組み合わせる必要があります(もちろん、シートを1回だけ複製することを除いて、それぞれの機能をすべて実行します)。


私はループに提案を挿入し、シナリオ1でテストしましたTypeError: Cannot call method "protect" of null。エラーメッセージが表示されました。この行からこのエラーが発生していますvar p2 = sheet.protect();
Arvind 2015年

1
それで、それはラインsheet2.protect();でしたか?次に、sheet2がnullであることを意味するため、それが定義されている行を確認する必要があります。

私のコードでは、sheet2sheetと呼ばれています。これは次のように定義されますvar sheet = ss.getSheetByName(AttendanceObjects[i]);
Arvind 2015年

とにかく。コードのデバッグはあなたの仕事であり、私の仕事ではありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.