记录单元格值时间

时间:2017-10-28 14:26:51

标签: google-apps-script google-sheets

我试图找出记录单元格具有特定值的时间量。 例如:如果H4 = ABC然后改为XYZ;我需要在更改为XYZ之前记录单元格H4为ABC的时间量。 我无法在Google脚本库中找到计时器功能。 任何帮助,将不胜感激。 这是工作表和当前正在运行的所有脚本的链接。 https://docs.google.com/spreadsheets/d/1eqOXVR9_2fe246PejvwUZd-Z1RoDN8OyS9B7Hk8FZRI/edit?usp=sharing

2 个答案:

答案 0 :(得分:0)

我不知道GAS中的计时器功能,无论如何,让它一直运行并不是最佳选择。一种更好的方法似乎是计算您拥有的时间戳和当前日期之间的单元格更改的时间差。

我稍微调整了this function,以便它还包括小时差异:

function dateDiff(start, end) {
  var diff = { years: 0, months: 0, days: 0 };
  var timeDiff = end - start;

  if (timeDiff > 0) {
    diff.years = end.getFullYear() - start.getFullYear();
    diff.months = end.getMonth() - start.getMonth();
    diff.days = end.getDate() - start.getDate();
    diff.hours = end.getHours() - start.getHours();
    if (diff.months < 0) {
      diff.years--;
      diff.months += 12;
    }

    if (diff.days < 0) {
      diff.months = Math.max(0, diff.months - 1);
      diff.days += 30;
    }
    if (diff.hours < 0) {
      diff.days = Math.max(0, diff.days - 1);
      diff.hours += 24;
    }

  }

  return diff;
};

现在使用此dateDiff函数的onEdit函数:

function onEdit() {
  // This section returns if you're not on the SBC/HP spreadsheet.
  var sheet = "SBC/HP";

  var s = SpreadsheetApp.getActiveSheet();
  var r = s.getActiveCell();
  // if r is in column h { do the rest }
  if( r.getColumn() != 11){
    var row = r.getRow();
    var previousDate = new Date(s.getRange(row, 11).getValue()); //getting the timestamp of the previous change. Looks like the year should be YYYY, not YY as it is now
    var time = new Date();
    var timeDiff = dateDiff(previousDate, time); //calculating time difference in a separate function
    time = Utilities.formatDate(time, "GMT-05:00", "MM/dd/yy, hh:mm:ss");
    s.getRange(row, 12).setValue(timeDiff.years + ' years ' + timeDiff.months + ' months ' + timeDiff.days + ' days ' + timeDiff.hours + ' hours'); //pasting time difference in some format in a separate cell
    s.getRange('K' + row.toString()).setValue(time);
  }
}

您可以查看其工作原理here

答案 1 :(得分:0)

Stackdriver LoggingonEdit()结合使用。然后使用Log Filters和/或Log Exporting来提取INFO日志的时间戳。

function onEdit (e) {
  var message = e.range.getA1Notation() + " changed to " + e.value;

  console.info({message:message});
}

在脚本编辑器中访问项目Log Viewer View > Stackdriver Logging。在此处,您可以过滤掉console.info()条消息,并从Stackdriver Logging消息中包含相同e.range.getA1Notation()的时间戳中获取时差。

Stackdriver Docs