全景
该单元格A1
具有值01:00
(一小时)。通过使用如下函数:
function prueba() {
var libro = SpreadsheetApp.getActiveSpreadsheet();
var hoja = libro.getSheetByName("Hoja 1");
var datos = hoja.getDataRange().getValues();
var valor = datos[0][0];
Logger.log(valor.getHours());
Logger.log(valor.getMinutes());
}
值被记录
1.0
36.0
预计记录的值将是:
1.0
0.0
如何让我的代码读取预期值?
注释
这是一个“真正的问题”,我在stackoverflow.com上找到了答案。见参考。
这个问题没有翻译,但你可以说它是基于参考的。
全景
电子表格和 Javascript 处理日期的方式不同,因此有必要引入几行额外的代码。提供一个主要功能和两个互补功能,以获取日期的秒数、分钟数或小时数。
代码
对问题中提出的功能的修改:
从Eric Koleda在2013-07-22 14:20:54Z 的回答中获取了以下辅助函数:
用于注册单元格的小时数的示例
A1
。解释
来自Sergei insas于2013-07-18 15:36:28Z的回答
电子表格用作参考日期
12/30/1899
,而 Javascript 使用01/01/1970
,这意味着两个参考之间存在 25,568 天的差异。这是假设在两个系统上使用相同的时区。将电子表格中的日期值转换为 Javascript 日期对象时,GAF 引擎会自动添加差异以保持两个日期之间的一致性。在这种情况下,您不想知道某事的实际日期,而是想要小时的绝对值,例如持续时间,因此您需要删除 25.568 天的偏移量。这是使用
getTime()
Javascript 方法完成的,该方法返回从参考日期开始计算的毫秒数,您唯一知道的是参考电子表格日期的毫秒值,然后从日期对象中减去该值。然后进行一些数学运算来获得几小时而不是毫秒,我们就完成了。注释
问题 402:Eric 的回答中提到了从电子表格范围获取文字字符串,但这在 4 天前被标记为已修复,并注明文档尚未发布。它已通过添加 range.getDisplayValue 和 range.getDisplayValues 解决,但是,如果您不想修改日期类型数据的显示格式,这可能没有用。
关于代码,其中包含的注释已被翻译,但变量名称保持原样。在其中一条因太长而无法显示水平滚动条的行中引入了换行符。
简短的回答
从初学者或“快速而肮脏”的角度来看,也许最简单的解决方案是使用
getValue
/getValues
usegetDisplayValue
/之类的方法getDisplayValues
来处理 String 对象而不是 Date 对象。基本概念
在内部,Google 和 JavaScript 电子表格使用序列号来处理日期和时间,也就是说,它们使用“EPOCH”作为参考点或零,并从中添加时间单位以确定日期时间。
时间单位
时代
转换
当 Google Apps 脚本读取时间值时,它还会考虑电子表格时区和 Apps 脚本项目时区,它们并不总是相同,在某些情况下这可能会增加几分钟和几秒钟,例如
0:00:00
,则 Date 对象将显示Sat Dec 30 1899 00:36:36 GMT-0600 (CST)
例子
修改问题代码
另一个例子
下面的函数从活动单元格中获取数据,如果晚于 7:05,它将向右写入
Sí
,否则No
。使用 getDisplayValue 和 String 对象的 match 方法和正则表达式/\d\d/g
来提取小时和分钟。