簡體   English   中英

阻止時間戳在應用程序腳本中更新

[英]Prevent timestamp from updating in apps script

我是應用腳本和腳本編寫的新手。 這就是為什么我在這里注冊(我已經閱讀了一個月)。

我需要使用應用程序腳本在Google工作表中創建一個時間戳。 我的函數檢查B列中是否有任何特定值(字符串),如果是,則在同一行的K列中打印時間戳。

因此:在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”->時間戳同時補全。 現在,將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();
      }
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM