Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 防止在应用程序脚本中更新时间戳_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

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

Javascript 防止在应用程序脚本中更新时间戳,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我不熟悉应用程序脚本和脚本。这就是我在这里注册的原因(我已经阅读了一个月了) 我需要做一个时间戳在谷歌表与应用程序脚本。 我的函数检查B列中的任何行是否有特定值(字符串),如果有,则在同一行的K列中打印时间戳 因此:在B3中显示“完成”,时间戳以K3打印。 但也可能存在这样的情况,即B4和B8同时获得值“完成”,例如,因为它依赖于工作表中的其他单元格。然后,时间戳同时以K4和K8打印 我获得了以下功能,并且工作正常: function onEdit() { var ss = Spreadshe

我不熟悉应用程序脚本和脚本。这就是我在这里注册的原因(我已经阅读了一个月了)

我需要做一个时间戳在谷歌表与应用程序脚本。 我的函数检查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中的“完成”->时间戳同时使用。 现在将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();
      }
    }
  }
}
函数onEdit(e){
变量时间=新日期();
//B栏
var statusColNum=2;
//K列
var-colnum=11;
//获取更改的范围数据
var范围=e范围;
var rangeCol=range.getColumn();
var rangeRow=range.getRow();
var rangeWidth=range.getWidth();
var rangeHeight=range.getHeight();
//检查所需的工作表是否已编辑
var curSheet=range.getSheet();
var curSheetName=curSheet.getName();
如果(curSheetName!=“计划”){
返回;
}
//检查当前更改是否在B列中
如果(statusColNumrangeCol+rangeWidth-1){
返回;
}
//循环更改的行
对于(变量i=0;i
这里更新了只检查更改行的
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();
      }
    }
  }
}
函数onEdit(e){
变量时间=新日期();
//B栏
var statusColNum=2;
//K列
var-colnum=11;
//获取更改的范围数据
var范围=e范围;
var rangeCol=range.getColumn();
var rangeRow=range.getRow();
var rangeWidth=range.getWidth();
var rangeHeight=range.getHeight();
//检查所需的工作表是否已编辑
var curSheet=range.getSheet();
var curSheetName=curSheet.getName();
如果(curSheetName!=“计划”){
返回;
}
//检查当前更改是否在B列中
如果(statusColNumrangeCol+rangeWidth-1){
返回;
}
//循环更改的行
对于(变量i=0;i
谢谢!我做了一个检查,如果K已经有了一个值,这也是有效的。但你的解决方案要聪明得多。事实上,我必须学习更多关于“e”的知识。谢谢!我做了一个检查,如果K已经有了一个值,这也是有效的。但你的解决方案要聪明得多。事实上,我必须更多地了解“e”。