1

我想防止更改谷歌电子表格中的 K 列。无论有什么价值,我都不希望它改变。我不喜欢保护功能,因为它使我认为丑陋的显示。

我的代码。不幸的是,它完全没有任何作用。目的是获取单元格中的任何当前值,保存它,然后在退出单元格时将其写回,而不是保存可能对单元格所做的任何更改。该单元格开始时要么是空白的,要么已经被修改为包含日期和时间。无论当前内容是否为空白,离开单元格后它都应保持相同的值。

function onEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  var r = s.getActiveCell();
  var columnNum=r.getColumn() 


  // if column is K then prevent any changes
  if (columnNum == 11) {
    var dateCell = s.getRange(r.getRow(), 11);
    var v=dateCell.getValue();
    dateCell.setValue(v);
  }
};
4

1 回答 1

1

这可能会帮助你。在谷歌有一个适当的脚本 API 来保护范围之前,我想出了一个解决你的问题的方法。这个正在使用验证功能,并且可以正常工作。

function setRangeProtection(rangeToProtect) {

  var firstRow = rangeToProtect.getRow();
  var noOfRows = rangeToProtect.getHeight();
  var firstColumn = rangeToProtect.getColumn();
  var noOfColumns = rangeToProtect.getWidth();

  var rangeToProtectValues = rangeToProtect.getValues();
  var rangeToProtectFormulas = rangeToProtect.getFormulas();

  var cellRow = firstRow;

  for (var i=0 ; i<noOfRows ; ++i) {

    var cellColumn = firstColumn;

    for (var j=0 ; j<noOfColumns ; ++j) {         

      var cell = sheet.getRange(cellRow, cellColumn);

      if (rangeToProtectFormulas[i][j] == "") {
        var rangeToProtectContent = rangeToProtectValues[i][j]; 
      } else {
        var rangeToProtectContent = rangeToProtectFormulas[i][j];
      }

      var rules = SpreadsheetApp.newDataValidation()
                  .requireTextEqualTo(rangeToProtectContent)
                  .setAllowInvalid(false)
                  .setHelpText('Don\'t mess with the DJ!')
                  .build();
      cell.setDataValidation(rules);

      ++cellColumn;

    }

    ++cellRow;

  }

}

唯一的小问题是,对于包含公式的单元格,会出现一个小的红色三角形,并且当您将鼠标悬停在它上面时会显示一条消息。摆脱不了那个。如果您找到解决方案,请告诉我。删除帮助文本无济于事,因为它会返回到默认模式。

于 2013-09-18T12:47:52.833 回答