如何创建优先级列表并更改它们而不留任何空白

时间:2018-02-22 15:40:17

标签: javascript google-apps-script google-sheets

我正在尝试为google电子表格编写一个简单的脚本。

代码应该如下工作:它应该是一个优先级列表,可以简单地编辑。例如,我有一个包含7个任务的列表,并希望更改一个任务的优先级。我的代码只是查找更大的值或eqauls然后我在单元格中放置的值并将它们递增1.所以最后一个任务优先级为8而我只有7个任务,因此在某处有一个间隙。

以下是我已经完成的事情:

function onEdit(e) {
  var range = e.range;
  var numRowsWithData = SpreadsheetApp.getActiveSheet().getDataRange().getNumRows();
  var columnOfCellEdited = range.getColumn();
  var cellEdited = range.getA1Notation();

  if (columnOfCellEdited === 2) {

    var valueOfEditedCell = range.getValue();

    for (var i = 2; i <=numRowsWithData; i++) {

      var rangeSheet = SpreadsheetApp.getActiveSheet().getDataRange();
      var currentCell = rangeSheet.getCell(i, 2);
      var currentValue = currentCell.getValue(); 

      if(currentValue >= valueOfEditedCell) {
        if(cellEdited == currentCell.getA1Notation()){
            continue;
        }
        currentCell.setValue(currentValue+1);
      };

    }
  };
};

这个脚本有效,但我有一些缺失的数字,因为每次我都加1到当前值。 如何编辑它以使所有数字按正确顺序排列,没有任何遗漏?

我知道这不是很复杂,但我现在也不知道:/

提前致谢!

1 个答案:

答案 0 :(得分:0)

在澄清问题之后,完全重写了答案。

此函数读取所有现有优先级,包括新条目。任何大于新值的现有值都会增加1.数组用于存储每个值出现的行。然后循环该数组,跳过任何未定义的条目(缺少数字),并重新编号从1开始存在的那些。

这不会改变行的顺序。它只是重新编号第二列。

在可能的情况下,我保留原始代码,并在新位中重复使用您的方法。

function onEdit(e) {
  var range = e.range;
  var numRowsWithData = SpreadsheetApp.getActiveSheet().getDataRange().getNumRows();
  var columnOfCellEdited = range.getColumn();
  var cellEdited = range.getA1Notation();

  if (columnOfCellEdited === 2) {
    var valueOfEditedCell = range.getValue();

    // get snapshot of current priorities
    var priorityRows = [];
    for (var row = 2; row <=numRowsWithData; row++) {
      var rangeSheet = SpreadsheetApp.getActiveSheet().getDataRange();
      var currentCell = rangeSheet.getCell(row, 2);
      var currentValue = currentCell.getValue();
      if(currentValue >= valueOfEditedCell && cellEdited !== currentCell.getA1Notation()) {
        currentValue++;
      };
      priorityRows[currentValue] = row;
    }

    // renumber priorities
    var newPriority = 1;
    for (var i = 0; i < priorityRows.length; i++) {
      var row = priorityRows[i];
      if (row) {
        var rangeSheet = SpreadsheetApp.getActiveSheet().getDataRange();
        var currentCell = rangeSheet.getCell(row, 2);
        currentCell.setValue(newPriority++); 
      }
    }
  }

}