【问题标题】:Dates (Duration) in Google Sheets ScriptGoogle 表格脚本中的日期(持续时间)
【发布时间】:2014-11-16 05:47:55
【问题描述】:

我有一个包含三列的 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 行) ... 然后就可以了。

我想知道如何使用脚本来获得相同的结果。

提前致谢。

【问题讨论】:

  • 请注意,持续时间的格式为[hh]:mm:ss。我不认为这曾经被写下来,我必须通过使用range.getNumberFormat()
  • 它是 Google 电子表格中的源代码。现在我使用公式(=A4-A3),而不是这个解决方案中的源代码。
  • 我的公式仍然减去两个日期时间,但最初我使用hh:mm:ss 格式化输出单元格,只要差值不到一天就可以了。一旦差异超过一天,我必须弄清楚如何显示持续时间。我希望谷歌只记录Range::setNumberFormat()...

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


【解决方案1】:

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 格式,但自动模式也可以。

【讨论】:

  • 感谢您的回答。事实上,我不是在寻找一个字符串,而是一个数字或日期。当我在工作表中做减法(作为公式)时,我得到一个数字。而且,我从菜单格式中对其进行格式化。但是如果我从脚本中减去,我不能得到相同的数字(或日期)。这是我的问题。非常感谢!!
  • 请查看编辑,我的回答会返回您所要求的内容。
  • 非常感谢。它很好用!我没有理解你的解决方案,非常抱歉。
猜你喜欢
  • 2017-09-14
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多