防止时间戳在应用程序脚本中更新



我是应用程序脚本的新手,通常是脚本。这就是为什么我在这里注册的原因(我已经阅读了一个月)。

我需要在带有应用程序脚本的Google表中制作时间戳。我的函数检查,如果B列中的任何行具有特定的值(字符串),则它将在同一行中打印在K列中的时间戳。

so:在B3中出现"完成",时间戳在K3中打印。但是,当B4和B8同时获得"完成"值时,可能会有一个情况,例如因为它取决于纸张中的其他一些单元。然后,时间戳同时用K4和K8打印。

我有以下功能,并且工作正常:

function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("plan");
  var state = ss.getRange("B3:B").getValues();
  var time = new Date();
  for (var row in state) {
    var rowNum = parseInt(row) +1;
    if (hasStatus(state[row] == "Done")) {
                 ss.getRange(rowNum + 2, 11).setValue(time);
        }
    else if ((hasStatus(state[row] == "open") || hasStatus(state[row] == "nothing to do") || hasStatus(state[row] == "locked")))
    {
      ss.getRange(rowNum + 2, 11).clearContent();
      //Browser.msgBox(state);
  }
}
}
function hasStatus(state){
  return state;
}

因此,如果将B4设置为打开或锁定,它将删除K4列中的内容。但是它在每次编辑中都会更新K3:K中的时间戳(因为它每次都会在整列中迭代)。如果仅编辑一行,我该如何防止此功能更新K3:K中的时间戳?

例如。B4和B8在K4和K8中使用" DONE" -> TIMESTAMP同时udpe。现在,您将b5设置为"锁定" -> k4和k8中的时间戳。

我不知道,如果这很简单,或者我不明白的东西。这很难,因为该函数必须检查其值的每一行,因为B中可以有多个行,可以同时更新。谁能帮忙?

以下是更新的onEdit功能,仅检查更改的行:

function onEdit(e) {
  var time = new Date();
  // column B
  var statusColNum = 2;
  // column K
  var timestampColNum = 11;
  // get changed range data
  var range = e.range;
  var rangeCol = range.getColumn();
  var rangeRow = range.getRow();
  var rangeWidth = range.getWidth();
  var rangeHeight = range.getHeight();
  // check if needed sheet was edited
  var curSheet = range.getSheet();
  var curSheetName = curSheet.getName();
  if (curSheetName != 'plan') {
    return;
  }
  // check that current changes are in column B
  if (statusColNum < rangeCol || statusColNum > rangeCol + rangeWidth - 1) {
    return;
  }
  // loop changed rows
  for (var i = 0; i < rangeHeight; i++) {
    var statusCell = curSheet.getRange(rangeRow+i, statusColNum);
    var statusCellVal = statusCell.getDisplayValue();
    var timestampCell = curSheet.getRange(rangeRow+i, timestampColNum);
    var timestampCellVal = timestampCell.getDisplayValue();
    if (statusCellVal == "Done") {
      // do not update cell if already have needed value
      if (timestampCellVal != time) {
        timestampCell.setValue(time);
      }
    }
    else if (["open", "nothing to do", "locked"].indexOf(statusCellVal) !== -1) {
      // do not update cell if already have needed value
      if (timestampCellVal !== '') {
        timestampCell.clearContent();
      }
    }
  }
}

最新更新