使用 GAS 获取相当于持续时间的数字
Getting the number equalent of duration using GAS
我有一个单元格,其值类型为持续时间,
我已将值设置为 00:10:00 即 10 分钟,
当我将单元格的格式更改为数字时,它将显示 0.01.
我如何使用应用程序脚本以编程方式获得与使用应用程序脚本代码等效的十进制数?
00:10:00 为 0.01
10:00:00 是 0.42
转换此持续时间字符串的计算是什么?
这个答案怎么样?
0.01
和0.42
的值为序列号。但是在这种情况下,当看到每个单元格时,0.01
和0.42
是0.00694444444444444
和0.416666666666667
。您也可以确认这一点。
当您想将0.00694444444444444
和0.416666666666667
分别转换为00:10:00
和10:00:00
时,请按以下流程进行。
- 将序列号转换为 unix 时间。
- 将 unix 时间转换为日期对象。
- 检索
00:10:00
和 10:00:00
等值。
示例脚本:
var serialNumbers = [0.00694444444444444, 0.416666666666667];
for (var i = 0; i < serialNumbers.length; i++) {
var unixTime = (serialNumbers[i] - 25569) * 86400 * 1000; // Reference:
var dateObject = new Date(unixTime);
var value = dateObject.toISOString().split("T")[1].split(".")[0];
console.log(value); // 00:10:00 and 10:00:00
}
参考文献:
- Unix time
- DATEVALUE function
- About
var unixTime = (serialNumbers[i] - 25569) * 86400 * 1000
如果这不是您想要的结果,我深表歉意。
编辑 1:
当"00:10:00", "10:00:00"
这样的字符串转换为序列号时,下面的脚本呢?在这个脚本中,流程如下
- 将字符串转换为日期对象。
- 将日期对象转换为 unix 时间。
- 将 unix 时间转换为序列号,如
0.006944444445252884
和 0.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:
console.log(serialNumber); // 0.006944444445252884 and 0.4166666666678793
}
编辑 2:使用通过 getValues()
检索的单元格中的值
00:10:00
和 10:00:00
放在电子表格的单元格中。
- 使用
getValues()
检索上述单元格中的值。
- 您要从检索到的值中检索序列号。
我能理解你的附加问题。如果我的理解是正确的,这个示例脚本怎么样?
对于这种情况的观点,我认为需要考虑时差。因为getValues()
检索出来的值已经是有时差的日期对象了。所以在这种情况下,需要去掉这个offset。
在此示例脚本中,假设单元格 "A1" 和 "A2" 的持续时间为 00:10:00
和 10:00:00
。此示例脚本的流程如下。
- 使用
getValues()
从单元格中检索值。
- 检索时差。
- 删除检索值的时间差。
- 检索序列号。
示例脚本:
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:
Logger.log(serialNumber) // 0.006944444445252884 and 0.4166666666678793
}
我有一个单元格,其值类型为持续时间, 我已将值设置为 00:10:00 即 10 分钟, 当我将单元格的格式更改为数字时,它将显示 0.01.
我如何使用应用程序脚本以编程方式获得与使用应用程序脚本代码等效的十进制数?
00:10:00 为 0.01 10:00:00 是 0.42
转换此持续时间字符串的计算是什么?
这个答案怎么样?
0.01
和0.42
的值为序列号。但是在这种情况下,当看到每个单元格时,0.01
和0.42
是0.00694444444444444
和0.416666666666667
。您也可以确认这一点。
当您想将0.00694444444444444
和0.416666666666667
分别转换为00:10:00
和10:00:00
时,请按以下流程进行。
- 将序列号转换为 unix 时间。
- 将 unix 时间转换为日期对象。
- 检索
00:10:00
和10:00:00
等值。
示例脚本:
var serialNumbers = [0.00694444444444444, 0.416666666666667];
for (var i = 0; i < serialNumbers.length; i++) {
var unixTime = (serialNumbers[i] - 25569) * 86400 * 1000; // Reference:
var dateObject = new Date(unixTime);
var value = dateObject.toISOString().split("T")[1].split(".")[0];
console.log(value); // 00:10:00 and 10:00:00
}
参考文献:
- Unix time
- DATEVALUE function
- About
var unixTime = (serialNumbers[i] - 25569) * 86400 * 1000
如果这不是您想要的结果,我深表歉意。
编辑 1:
当"00:10:00", "10:00:00"
这样的字符串转换为序列号时,下面的脚本呢?在这个脚本中,流程如下
- 将字符串转换为日期对象。
- 将日期对象转换为 unix 时间。
- 将 unix 时间转换为序列号,如
0.006944444445252884
和0.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:
console.log(serialNumber); // 0.006944444445252884 and 0.4166666666678793
}
编辑 2:使用通过 getValues()
检索的单元格中的值
00:10:00
和10:00:00
放在电子表格的单元格中。- 使用
getValues()
检索上述单元格中的值。 - 您要从检索到的值中检索序列号。
我能理解你的附加问题。如果我的理解是正确的,这个示例脚本怎么样?
对于这种情况的观点,我认为需要考虑时差。因为getValues()
检索出来的值已经是有时差的日期对象了。所以在这种情况下,需要去掉这个offset。
在此示例脚本中,假设单元格 "A1" 和 "A2" 的持续时间为 00:10:00
和 10:00:00
。此示例脚本的流程如下。
- 使用
getValues()
从单元格中检索值。 - 检索时差。
- 删除检索值的时间差。
- 检索序列号。
示例脚本:
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:
Logger.log(serialNumber) // 0.006944444445252884 and 0.4166666666678793
}