গুগল শিটগুলিতে আমি কীভাবে তার অনুমতি সহ একটি শীটটিকে নকল করব


10

অ্যাটেন্ডেন্স নামে একটি গুগল স্প্রেডশিটে টেম্পলেট নামে একটি শীট রয়েছে । ব্যবহারকারী এই শীটটি সদৃশ করে, বর্তমান তারিখের সাথে শীটটির নতুন নাম দেয় এবং শিক্ষার্থীদের উপস্থিতি চিহ্নিত করতে এই শীটটি ব্যবহার করে। টেমপ্লেট শীটে সুরক্ষিত কক্ষ রয়েছে এবং উপস্থিতিতে প্রদত্ত স্থানটিতে (অরক্ষিত কক্ষগুলি) শিক্ষার্থীর আইডি নম্বর প্রবেশ করিয়ে উপস্থিতি চিহ্নিত করা হয়েছে। আমি একাধিক পত্রক সদৃশ করতে এবং প্রতিদিন নাম পরিবর্তন করতে নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করি:

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

কোনও সুরক্ষিত শীটের অভ্যন্তরে সুরক্ষিত ব্যাপ্তিগুলি রাখাও সম্ভব, এক্ষেত্রে আপনাকে দুটি ফাংশন একত্রিত করতে হবে (অবশ্যই প্রত্যেকটি শিটটি কেবল একবারই নকল করবেন except


আমি আপনার পরামর্শটি আমার লুপটিতে sertedোকালাম এবং সিনারিও 1 তে পরীক্ষা করেছি, আমি একটি ত্রুটি বার্তা পেয়েছি TypeError: Cannot call method "protect" of null। আমি এই ত্রুটিটি পাচ্ছি কারণ এই লাইন থেকে var p2 = sheet.protect();
অরবিন্দ

1
সুতরাং, যে লাইন ছিল sheet2.protect();? তারপরে এর অর্থ শীট 2 নাল, সুতরাং আপনার যেখানে লাইনটি সংজ্ঞায়িত হয়েছে সেদিকে নজর দেওয়া উচিত।

আমার কোড SHEET2 হিসেবে উল্লেখ করা হয়েছে শীট । এটি হিসাবে সংজ্ঞায়িত করা হয়েছেvar sheet = ss.getSheetByName(AttendanceObjects[i]);
অরবিন্দ

যাই হোক। আপনার কোডটি ডিবাগ করা আপনার কাজ, আমার নয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.