根据特定(今天)日期保护行

问题描述 投票:0回答:1

我想对我的 Google 表格进行编码以检查(“扫描”)活动表格以查找“今天”的日期 - 然后,根据日期,保护该行中的所有列(女巫中的行找到今天的日期) ,这样只有所有者才能更改它(保护其他人)。

在论坛的帮助下,我找到了一些“解决方案”,但无法使其发挥作用。我认为 for 循环有问题(只是预测)。

脚本应该检查今天的日期,读取有多少列是活动的,并锁定今天+所有以前日期的行。我仍然缺少锁定所有具有所有权的行的保护,当然可以工作:)

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MY SHEET');

function lockRanges() {
  var dateRange = ss.getRange(2, 1, ss.getLastRow()-2, 1);
  var curDate = Utilities.formatDate(new Date(), "GMT+1", "dd/M/YYYY");
  var val = dateRange.getDisplayValues();
  var row;
  var col;
  var end = ss.getLastRow();
  
  //Find last active column
  for (var y = 0; y <= ss.getLastColumn(); y++) {
    col = y + 1;
  }

  //Loop through all rows
  for(var x = 0; x <= end; x++){
    if(val[x][0]> curDate){
      row = x;
      break;
    }
  }

  var protection = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE)
  if(protection.length > 0){
    var range = ss.getRange(2, 1, row, col);
    protection[0].setRange(range);
  }
  else{
    ss.getRange(2, 1, row, col).protect();
  }
}
variables google-apps-script google-sheets
1个回答
0
投票

此脚本包含在Apps Script to Build a Data Protection and only allow Spreadsheet Owner to edit

中提出的建议
  • 在脚本的最后一行添加所有者的电子邮件地址。

OP脚本评论

  • var dateRange = ss.getRange(2, 1, ss.getLastRow()-2, 1);

    由于您的范围从第 2 行开始,因此数据行数应为
    ss.getLastRow()-1
    .
    插入
    Logger.log("The date range is "+dateRange.getA1Notation())
    以显示定义的范围 .

  • var val = dateRange.getDisplayValues();

    所有“显示”值都是字符串。在这种情况下,您还需要使用此行将当前日期转换为字符串:
    var curDate = Utilities.formatDate(new Date(), "GMT+1", "dd/M/YYYY").toString()

  • //Find last active column
    - 不需要循环,只需使用
    ss.getLastColumn()

  • for (var y = 0; y <= ss.getLastColumn(); y++) {

    getLastColumn()
    返回索引号,但“y”初始化为零。所以语句运行的次数是
    one more than the number of columns
    .
    如上所述,这个循环是不必要的,但是如果使用了它,那么它应该是:
    for (var y = 0; y < ss.getLastColumn(); y++) {

  • //遍历所有行:

     for(var x = 0; x <= end; x++){

    由于范围中的第一行是#2,数据的行数不是
    end = ss.getLastRow();
    .
    更好的条件是
     val.length
    :数据数组中的元素数。

  • “脚本应该检查今天的日期”但是

    val[x][0]> curDate
    测试大于今天的日期。
    val[x][0] === curDate
    是正确的条件。

  • // 获取行:

    row = x;

    因为数据范围不包括标题行,并且因为循环是从零开始的,所以行号 =
    row = x+2

  • 保护
    这种保护完全是错误的。参考文档:Class ProtectionApps Script to Build a Data Protection and only allow Spreadsheet Owner to edit

    中描述的方法

function blockRanges() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MY SHEET');
  var lr = ss.getLastRow()
  var lc = ss.getLastColumn()

  // assume row 1 = header
  var dateRange = ss.getRange(2, 1, lr-1, 1);
  var val = dateRange.getDisplayValues()
  // Logger.log("DEBUG: date range = "+dateRange.getA1Notation())

  // get todays Date
  var curDate = Utilities.formatDate(new Date(), "GMT+1", "dd/M/YYYY").toString()
  // Logger.log("curDate: "+curDate)

  //Loop through date rows looking for a match
  for (var x = 0; x < val.length; x++){
    if(val[x][0] === curDate){
      // get the row; 
      // add one for the header and one for zero-based loop
      row = x+2;
          
      // set protection
      var protectionRange = ss.getRange(row,1,1,lc)
      // Logger.log("DEBUG: the protection range = "+protectionRange.getA1Notation())
      var protection = protectionRange.protect().setDescription(curDate);
      // Ensure the current user is an editor before removing others. Otherwise, if the user's edit
      // permission comes from a group, the script throws an exception upon removing the group.
      // Set the spreadsheet owner as the only editor
      var editors = protection.getEditors();
      for (var i = 0; i < editors.length; i++) {
        protection.removeEditor(editors[i]);
      }
      protection.addEditor("[email protected]");
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.