我有一个具有持续时间类型值的单元格,
我已将值设置为 00:10:00,即 10 分钟,
当我将单元格的格式更改为数字时,它将显示 0.01。
如何以编程方式使用应用程序脚本获得与使用应用程序脚本代码相同的十进制等效值?
00:10:00 是 0.01
10:00:00 是 0.42
用于转换此持续时间字符串的计算是什么?
这个答案怎么样?
的价值观0.01
and 0.42
是序列号。但在这种情况下,当看到每个细胞时,0.01
and 0.42
are 0.00694444444444444
and 0.416666666666667
。您也可以确认这一点。
当你想要转换时0.00694444444444444
and 0.416666666666667
to 00:10:00
and 10:00:00
,请分别执行以下流程。
- 将序列号转换为unix时间。
- 将 UNIX 时间转换为日期对象。
- 检索值,例如
00:10:00
and 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: 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
}
参考:
- Unix时间 https://en.wikipedia.org/wiki/Unix_time
- 日期值函数 https://support.office.com/en-us/article/datevalue-function-df8b07d4-7761-4a93-bc33-b7471bbff252
- About var unixTime = (serialNumbers[i] - 25569) * 86400 * 1000 https://stackoverflow.com/a/6154953
如果这不是您想要的结果,我深表歉意。
Edit 1:
当字符串像"00:10:00", "10:00:00"
转换为序列号,下面的脚本怎么样?在此脚本中,流程如下。
- 将字符串转换为日期对象。
- 将日期对象转换为 Unix 时间。
- 将unix时间转换为序列号,例如
0.006944444445252884
and 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: https://stackoverflow.com/a/6154953
console.log(serialNumber); // 0.006944444445252884 and 0.4166666666678793
}
编辑 2:使用使用检索到的单元格中的值getValues()
-
00:10:00
and 10:00:00
放在电子表格的单元格中。
- 使用以下命令检索上述单元格中的值
getValues()
.
- 您想要从检索到的值中检索序列号。
我可以理解你的附加问题。如果我的理解是正确的,那么这个示例脚本怎么样?
对于这种情况,我认为需要考虑时差。因为检索到的值getValues()
已经是带有时差的日期对象。所以在这种情况下,需要去掉这个偏移量。
在此示例脚本中,假设单元格“A1”和“A2”具有00:10:00
and 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: https://stackoverflow.com/a/6154953
Logger.log(serialNumber) // 0.006944444445252884 and 0.4166666666678793
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)