Di Google Spreadsheet yang disebut Kehadiran ada lembar yang disebut Template . Pengguna menduplikasi lembar ini, mengganti nama lembar dengan tanggal saat ini dan menggunakan lembar ini untuk menandai kehadiran bagi siswa. Lembar Templat berisi sel-sel yang dilindungi dan kehadiran ditandai dengan memasukkan nomor ID Siswa di ruang yang diberikan (sel yang tidak terlindungi). Saya menggunakan skrip berikut untuk menduplikasi beberapa lembar dan mengganti nama setiap hari:
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;
}
Skrip ini membantu saya membuat beberapa lembar salinan dari Templat tetapi salinan duplikat tidak mempertahankan izin Cell / Range. Apakah ada cara untuk menambahkan fungsi loop yang mengekstraksi izin dari Template dan menerapkannya setiap kali loop template.copyTo
membuat sheet?
Jawaban:
Skenario 1: templat adalah lembar yang dilindungi dengan rentang yang tidak dilindungi
Dalam skrip di bawah ini, saya menduplikasi sheet, mendapatkan perlindungannya dari tipe Sheet, kemudian melindungi sheet baru dengan cara yang sama: deskripsi yang sama, tipe yang sama. Jika perlindungan bukan hanya peringatan, maka hapus semua editor, dan tambahkan yang diizinkan untuk lembar asli. Akhirnya, lewati rentang yang tidak terlindungi, remapping masing-masing (via
getA1Notation
) ke sheet baru, dan buka proteksi itu.Skenario 2: templat adalah lembaran dengan rentang yang dilindungi
Dengan menggunakan
sheet.getProtections
metode, Anda bisa mendapatkan array perlindungan pada lembar yang diberikan, dan mengulanginya, membuat analognya pada lembar target. Ini agak menjengkelkan karena tampaknya tidak ada metode untuk hanya mengkloning perlindungan ke rentang lain. (Seseorang dapat mengubah rentang perlindungan, tetapi itu akan memindahkannya ke rentang baru, alih-alih menyalin.)Jadi, dalam fungsi di bawah ini saya melakukan hal berikut:
p.getRange().getA1Notation();
p2 = sheet2.getRange(rangeNotation).protect();
p2
sesuai dengan properti perlindungan aslip
.Dimungkinkan juga untuk memiliki rentang terlindungi dalam lembar terlindungi, dalam hal ini Anda perlu menggabungkan kedua fungsi (lakukan semua yang dilakukan masing-masing, kecuali tentu saja Anda akan menduplikasi lembar hanya sekali.)
sumber
TypeError: Cannot call method "protect" of null
. Saya mendapatkan kesalahan ini karena dari baris inivar p2 = sheet.protect();
.sheet2.protect();
? Maka itu berarti sheet2 adalah nol, jadi Anda harus melihat baris di mana itu didefinisikan.var sheet = ss.getSheetByName(AttendanceObjects[i]);