Google Sheets 脚本中的日期(持续时间)

标签 date scripting google-apps-script google-sheets

我有一个包含三列的 Google 表格: - 日期和时间(时间戳) - 期间 - 描述

我有一个脚本,当我在“描述”中写入内容时,会在“日期”中插入此时的日期和时间以及“持续时间”:

function onEdit(e) {
  if(e.source.getActiveSheet().getName() == "Sheet2" ) {
    var col = e.source.getActiveCell().getColumn();
    if(col == 3 ) {
      // I'm in column three
      var cellTimeStamp = e.range.offset(0,-2); // First column of the same row
      var cellTimeDiff = e.range.offset(0,-1); // Second column of the same row
      var cellTimePrev = e.range.offset(-1,-2); // First column of the previous row

      var timeTimeStamp = new Date();
      var iniTime = cellTimePrev.getValue().getTime();
      var finTime = timeTimeStamp.getTime() ;
      var timeDiff = String(finTime - iniTime) ;


      cellTimeStamp.setValue(timeTimeStamp);  

      cellTimeDiff.setValue(timeDiff); // [***]


    }
  }    
}

当它执行(作为事件)时,“持续时间”列中没有“HH:mm:ss”格式的内容。

但是如果我删除此脚本中的最后一行并在工作表中添加此公式: =A3-A2(第 3 行) =A4-A3(第 4 行) ... 然后就可以正常工作了。

我想知道如何使用脚本达到相同的结果。

提前致谢。

最佳答案

timeDiff 是 finTime - iniTime 的结果,两者都是 native date object values ,这意味着我们有毫秒。

将其转换为 hh:mm:ss 是简单的数学...:一分钟 60 秒,一小时 60 分钟... 一个简单的代码可能是这样的:

function msToTime(s) {
  var ms = s % 1000;
  s = (s - ms) / 1000;
  var secs = s % 60;
  s = (s - secs) / 60;
  var mins = s % 60;
  var hrs = (s - mins) / 60;

  return hrs + ':' + mins + ':' + secs; // milliSecs are not shown but you can use ms if needed
}

如果您更喜欢以更传统的方式格式化字符串(每个值 2 位数字),请不要忘记您可以使用 Utilities.formatString()这样做。

下面的例子:

  return Utilities.formatString("%02d",hrs) + ':' + Utilities.formatString("%02d",mins) + ':' + Utilities.formatString("%02d",secs);

编辑

根据您的评论:

电子表格比你想象的更聪明,你可以尝试下面的代码,你会发现结果实际上是一个时间值。(通过双击它来检查)

function test() {
  var sh = SpreadsheetApp.getActiveSheet();
  var t1 = sh.getRange('a1').getValue().getTime();
  var t2 = sh.getRange('b1').getValue().getTime();
  sh.getRange('c1').setValue(msToTime(t1-t2)).setNumberFormat('hh:mm:ss');

}

function msToTime(s) {
  var ms = s % 1000;
  s = (s - ms) / 1000;
  var secs = s % 60;
  s = (s - secs) / 60;
  var mins = s % 60;
  var hrs = (s - mins) / 60;

  return hrs + ':' + mins + ':' + secs; // milliSecs are not shown but you can use ms if needed
}

注意setNumberFormat('hh:mm:ss') 是可选的,它只是强制电子表格显示hour:min:sec 格式,但自动模式也可以。

enter image description here

关于Google Sheets 脚本中的日期(持续时间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25971072/

相关文章:

google-apps-script - 将 Google Script Addon 发布到 G Suite Marketplace SDK

google-apps-script - Google Apps 脚本中的时区

java - 按属性对自定义对象的 ArrayList 进行排序

php - 'c' 或 'r' 日期格式如何在 PHP 中工作?

c++ - 通过 Swig 在 C++ 和 Lua 之间传递变量

windows - 适用于 Windows 程序员的最佳 "official"脚本语言

java - 将 MySql 日期映射到 java 对象

date - 在cassandra中存储日期时间的数据类型是什么

ide - 哪种 TextEditor 最容易为新的脚本语言定制?

javascript - 在递归函数中正确处理二维值数组