首页 > 解决方案 > 通过获取包含可能空行的数据的最后一行来保护特定范围

问题描述

我试图保护一个特定的范围直到最后一行,但是在尝试考虑有空行的可能性之后,我无法得到预期的结果。

在我的示例中:我正在尝试保护 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());

  }

标签: google-apps-scriptgoogle-sheets

解决方案


感谢@TheMaster 指出错误,函数 getLastRow 没有返回任何内容,

如果我们改变这一行,代码就可以工作:

var lr = lrIndex + 1

到:

return lrIndex + 1

我们也不需要 -1 :

var rangeToProtect = ss.getRange(2,1,(lr-1), 4);

推荐阅读