传递正确参数仍报错:Protection.setUnprotectedRanges参数不匹配
问题分析与解决
- 错误核心:
Protection.setUnprotectedRanges()要求传入Range对象数组,你现在传的是A1表示法的字符串数组,完全不符合方法的参数要求。
修正后的代码
var thisSheet = ss.getActiveSheet() var template = thisSheet.getRange("TemplateLineRecurrent") var forms = template.getFormulas() Logger.log(forms) var insertPos = template.getRow() // 插入新行 thisSheet.insertRowsBefore(insertPos, 1) // 复制模板公式 const destRange = thisSheet.getRange(insertPos, template.getColumn(), 1, template.getLastColumn() - template.getColumn() + 1) destRange.setFormulas(forms) const p = thisSheet.getProtections(SpreadsheetApp.ProtectionType.SHEET)[0]; const ranges = p.getUnprotectedRanges(); const newRanges = [...ranges]; // 直接复制原Range对象数组 // 创建新的解除保护范围(保留Range对象) const newUnprotectedRange = thisSheet.getRange(insertPos, destRange.getColumn(), 1, 5) Logger.log(newUnprotectedRange.getA1Notation()) newRanges.push(newUnprotectedRange) Logger.log(newRanges.map(range => range.getA1Notation())) p.setUnprotectedRanges(newRanges);
关键说明
- 不要把
getUnprotectedRanges()返回的Range对象转成字符串,直接复用这些对象即可。 - 新增解除保护范围时,直接将
getRange()返回的Range实例加入数组,绝不能用getA1Notation()转成字符串。 - 日志里的
number[]是Google Apps Script的类型提示bug,实际问题就是参数类型不匹配——字符串数组≠Range对象数组。
内容的提问来源于stack exchange,提问作者Meaulnes
相关产品推荐
相关产品推荐

