google-apps-script - 通过获取包含可能空行的数据的最后一行来保护特定范围
问题描述
我试图保护一个特定的范围直到最后一行,但是在尝试考虑有空行的可能性之后,我无法得到预期的结果。
在我的示例中:我正在尝试保护 A:D 的范围,并且由于包含数据的最后一行是 C24,因此脚本应该保护A2:D24。我的脚本中忽略了 F 列(以及其他任何内容)。
截图:
我收到以下错误:异常:范围内的行数必须至少为 1
对于第 30 行,对应于var rangeToProtect = ss.getRange(2,1,(lr-1), 4);
我的脚本:
function getLastRow(sheet,rangeString) {
var rng = sheet.getRange(rangeString).getValues();
var lrIndex;
for(var i = rng.length-1;i>=0;i--){
lrIndex = i;
if(!rng[i].every(function(c){ return c == ""; })){
break;
}
}
var lr = lrIndex + 1
Logger.log(lr);
}
function protectData(){
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var curDate = Utilities.formatDate(new Date(), "GMT", "EEE d MMM yyyy HH:mm:ss")
var lr = getLastRow(ss,"A2:D");
var rangeToProtect = ss.getRange(2,1,(lr-1), 4);
var protection = rangeToProtect.protect().setDescription(curDate);
protection.removeEditors(protection.getEditors());
}
// 使用建议编辑的函数:
function protectImportedData(){
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var curDate = Utilities.formatDate(new Date(), "GMT+3", "EEE d MMM yyyy HH:mm:ss")
var Direction = SpreadsheetApp.Direction;
var aLast =ss.getRange("A1:D"+(ss.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();
var rangeToProtect = ss.getRange(2,1,(aLast-1), 4);
var protection = rangeToProtect.protect().setDescription(curDate);
protection.removeEditors(protection.getEditors());
}
解决方案
感谢@TheMaster 指出错误,函数 getLastRow 没有返回任何内容,
如果我们改变这一行,代码就可以工作:
var lr = lrIndex + 1
到:
return lrIndex + 1
我们也不需要 -1 :
var rangeToProtect = ss.getRange(2,1,(lr-1), 4);
推荐阅读
- sql - T-SQL - 将 FK 添加到表中,使其自动执行 drop/null/efault?
- flutter - 如何在单击按钮时使用 flutter_webview 返回上一页?
- python - 使用 numba @jit 加速我使用队列的多处理循环
- mapbox-gl-js - 根据经度和纬度获取查询RenderedFeatures的Mapbox点
- python - 从参数或同一类初始化 Python 类
- here-api - 具有自由格式输入 Geocoder API 的 Geogode 街道交叉口
- php - if/else 在 php 的 foreach 循环中不起作用
- clojure - Clojure:合并 2 个地图向量
- javascript - 将图像缓冲区发送到 node.js tcp 服务器
- python - 如何计算字符串中至少出现一次的单词数?