脚本总结:
我的问题:我收到此错误:
TypeError: Cannot read property 'getRange' of undefined at [the
getRange
properties of both while loops conditions]
脚本:
function someFunction() {
var ss = SpreadsheetApp.getActive();
var sheetName = 'some sheet name';
var rangeName = 'some range name';
var targetSheet = ss.getSheetByName(sheetName);
var targetRange = ss.getRangeByName(rangeName);
// set permissions
var permittedUserEmails = ['user1@gmail.com','user2@gmail.com','user3@gmail.com','user4@gmail.com','user5@gmail.com'];
var sheetProtections = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET);
var rangeProtections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
var i = 0;
while (sheetProtections[i].getRange().getSheet() != targetSheet {
i++;
}
if (sheetProtections[i].canEdit() == false) {
if (rangeProtections[i].getEditors().length < permittedUserEmails.length) {
sheetProtections[i].remove();
sheetProtections[i].addEditors(permittedUserEmails);
}
}
var j = 0;
while (rangeProtections[j].getRange() != targetRange {
j++;
}
if (rangeProtections[j].canEdit() == false) {
if (rangeProtections[j].getEditors().length < permittedUserEmails.length) {
rangeProtections[j].remove();
rangeProtections[j].addEditors(permittedUserEmails);
}
}
}
注:
Browser.msgBox(sheetProtections[i].getRange())
和 Browser.msgBox(rangeProtections[j].getRange())
就在相应的 while
之前循环 I 不要得到一个错误。 有人可以解释一下发生了什么以及如何解决这个问题吗?
更新:
错误是由
i
引起的和 j
超出sheetProtections
和 rangeProtections
长度,相应地不满足循环条件。指示目标表和范围的不同方法解决了该问题。
最佳答案
发生错误是因为没有找到该名称的工作表或范围保护。getProtections
如果没有找到保护,方法返回一个空数组。如果没有保护,它不会返回 undefined 或 null。如果没有找到保护,它返回一个空数组的真值。这意味着空数组的长度为零。您正在开始计算变量 i
在零处,这是一个有效的索引,并且不会在 sheetProtections[i]
处返回错误即使索引零处的值未定义。
有多种方法可以处理这种情况,下面是一种可能性。
function someFunction() {
var ss = SpreadsheetApp.openById('1RwwWliVHscvvRLOZ4jTQNtQJOgoTSBAo43VRDMhKzoo');
var sheetName = 'some';
var rangeName = 'some';
var targetSheet = ss.getSheetByName(sheetName);
var targetRange = ss.getRangeByName(rangeName);
// set permissions
var permittedUserEmails = ['user1@gmail.com','user2@gmail.com','user3@gmail.com','user4@gmail.com','user5@gmail.com'];
var sheetProtections = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET);
var rangeProtections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
Logger.log('sheetProtections: ' + sheetProtections)
var L = sheetProtections.length;
Logger.log("L: " + L)
var i = 0;
while (i < L) {//If i reaches the L number then it stops - If L is zero and i is zero then zero is not less than zero
Logger.log('i ' + i)
if (sheetProtections[i].getRange().getSheet() === targetSheet;) {
break;
}
i++;//decrement
}
if (sheetProtections[i].canEdit() == false) {
if (rangeProtections[i].getEditors().length < permittedUserEmails.length) {
sheetProtections[i].remove();
sheetProtections[i].addEditors(permittedUserEmails);
}
}
L = rangeProtections.length;
var j = 0;
while (j < L) {
if (rangeProtections[j].getRange() === targetRange) {
break;
}
j++;
}
if (rangeProtections[j].canEdit() == false) {
if (rangeProtections[j].getEditors().length < permittedUserEmails.length) {
rangeProtections[j].remove();
rangeProtections[j].addEditors(permittedUserEmails);
}
}
}
关于google-apps-script - 谷歌工作表的保护脚本问题 - 无法读取未定义的属性 'getRange',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62112801/