Google पत्रक में मैं इसकी अनुमति के साथ एक शीट की नकल कैसे कर सकता हूं


10

Google स्प्रेडशीट में अटेंडेंस नाम की एक शीट होती है जिसे टेम्प्लेट कहा जाता है । उपयोगकर्ता इस शीट को डुप्लिकेट करता है, वर्तमान तिथि के साथ शीट का नाम बदल देता है और छात्रों के लिए उपस्थिति को चिह्नित करने के लिए इस शीट का उपयोग करता है। टेम्प्लेट शीट में संरक्षित सेल होते हैं और दिए गए स्थान (असुरक्षित सेल) में छात्र की आईडी संख्या दर्ज करके उपस्थिति को चिह्नित किया जाता है। मैं कई शीटों को डुप्लिकेट करने के लिए निम्न स्क्रिप्ट का उपयोग करता हूं और उन्हें हर रोज नाम देता हूं:

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();
अरविंद

1
तो, वह लाइन थी sheet2.protect();? तो इसका मतलब है कि sheet2 अशक्त है, इसलिए आपको उस रेखा को देखना चाहिए जहां इसे परिभाषित किया गया है।

मेरे कोड में sheet2 को शीट के रूप में संदर्भित किया जाता है । इसे परिभाषित किया गया हैvar sheet = ss.getSheetByName(AttendanceObjects[i]);
अरविंद

वैसे भी। अपना कोड डीबग करना आपका काम है, मेरा नहीं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.