使用GAS获取持续时间的等号

时间:2019-04-18 06:51:46

标签: google-apps-script time google-sheets iso8601

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

如何以编程方式使用应用程序脚本获得等同于使用应用程序脚本代码的十进制数?

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

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

1 个答案:

答案 0 :(得分:1)

这个答案怎么样?

0.010.42的值是序列号。但是在这种情况下,当看到每个单元格时,0.010.42分别是0.006944444444444440.416666666666667。您也可以确认这一点。

当您要将0.006944444444444440.416666666666667分别转换为00:10:0010:00:00时,请执行以下流程。

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

示例脚本:

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
}

参考文献:

如果这不是您想要的结果,我表示歉意。

编辑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. 获取序列号。

示例脚本:

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
}