使用GAS获得相当于持续时间的数字

问题描述 投票:1回答:1

我有一个具有类型持续时间值的单元格,我已将值设置为00:10:00,这是10分钟,当我将单元格的格式更改为数字时,它将显示0.01。

我将如何以编程方式使用应用脚本代码的十进制等效的应用程序脚本?

00:10:00是0.01 10:00:00是0.42

用于转换此持续时间字符串的计算是什么?

google-apps-script time google-sheets iso8601
1个回答
1
投票

这个答案怎么样?

0.010.42的值是序列号。但在这种情况下,当看到每个细胞时,0.010.420.006944444444444440.416666666666667。你也可以确认一下。

如果您想分别将0.006944444444444440.416666666666667转换为00:10:0010:00:00,请执行以下操作。

  1. 将序列号转换为unix时间。
  2. 将unix时间转换为日期对象。
  3. 检索00:10:0010:00:00之类的值。

Sample script:

var serialNumbers = [0.00694444444444444, 0.416666666666667];

for (var i = 0; i < serialNumbers.length; i++) {
  var unixTime = (serialNumbers[i] - 25569) * 86400 * 1000; // Reference: https://stackoverflow.com/a/6154953
  var dateObject = new Date(unixTime);
  var value = dateObject.toISOString().split("T")[1].split(".")[0];
  console.log(value); // 00:10:00 and 10:00:00
}

References:

如果这不是你想要的结果,我道歉。

编辑1:

当像"00:10:00", "10:00:00"这样的字符串被转换为序列号时,下面的脚本怎么样?在此脚本中,流程如下。

  1. 将字符串转换为日期对象。
  2. 将日期对象转换为unix时间。
  3. 将unix时间转换为序列号,如0.0069444444452528840.4166666666678793

var durations = ["00:10:00", "10:00:00"];
for (var i = 0; i < durations.length; i++) {
  var ISO8601 = "1899-12-30T" + durations[i] + "Z";
  var dateObject = new Date(ISO8601);
  var serialNumber = (dateObject.getTime() / 1000 / 86400) + 25569; // Reference: https://stackoverflow.com/a/6154953
  console.log(serialNumber); // 0.006944444445252884 and 0.4166666666678793
}

编辑2:使用getValues()检索到的单元格中的值

  • 00:10:0010:00:00被放入电子表格的单元格中。
  • 使用getValues()检索来自上面的细胞的值。
  • 从检索到的值中,您需要检索序列号。

我能理解你的其他问题。如果我的理解是正确的,那么这个示例脚本怎么样?

至于这种情况,我认为需要考虑时差。因为getValues()检索的值已经是具有时差的日期对象。因此,在这种情况下,需要删除此偏移量。

在此示例脚本中,它假设单元格“A1”和“A2”具有00:10:0010:00:00作为持续时间。此示例脚本的流程如下所示。

  1. 使用getValues()从单元格中检索值。
  2. 检索时差。
  3. 从检索到的值中删除时差。
  4. 检索序列号。

Sample script:

var sheet = SpreadsheetApp.getActiveSheet();
var values = sheet.getRange("A1:A2").getValues();
var offset = (new Date()).getTimezoneOffset(); // Retrieve the time difference.
for (var i = 0; i < values.length; i++) {
  var dateObject = new Date(values[i][0].getTime() - (1000 * 60 * offset));
  var serialNumber = (dateObject.getTime() / 1000 / 86400) + 25569; // Reference: https://stackoverflow.com/a/6154953
  Logger.log(serialNumber) // 0.006944444445252884 and 0.4166666666678793
}
© www.soinside.com 2019 - 2024. All rights reserved.