我正在使用Google Spreadsheets,我有一张表格如下:
Start | End | Partial result | Expected | Total
08:00 | 12:00 | 04:00 | 05:00 | -01:00
14:00 | 18:00 | 04:00 | 05:00 | -01:00
----------------------------------------------------
| Month tot| -02:00
如您所见,它允许负面持续时间标记。这在Google Scripts中给我带来了很多麻烦。
我想通过电子邮件向每个人发送月度摘要。
这是一个简单的片段:
var sheet = SpreadsheetApp.getActive().getSheetByName(...);
var monthlyTotal = sheet.getRange(1, 1).getValue(); //The total is at cell A1
现在,当我调试时,它将我的monthlyTotal显示为Date
对象,设置为Tue Dec 26 1899 14:50:28 GMT-0300 (BRT)
(这是非常正确的,我的结果是-81:16:00
,它减去81:16
来自1970-01-01 00:00:00
,没有问题。)
现在,我不知道如何回到持续时间格式(-81:16
)。我尝试将此日期对象转换为负时间戳,但+monthlyTotal
会返回我认为错误的值(-2212132172000
)。
我不知道如何将Date
对象从之前的转换为时间戳,因此我不知道如何继续。
答案 0 :(得分:1)
此问题已在webapps.stackexchange.com上得到解答。
请勿在日期/时间单元格上使用.getValue()
。相反,将=TO_TEXT(A1)
放在某处(或者已经包含类似TO_TEXT(SUM(E2:E))
的A1,并使用.getValue()
来获取字符串。数字和字符串在工作表和脚本之间传递可靠,不像日期和时间。
与1970-01-01开始时代的Unix操作系统不同,Google表格使用December 30, 1899 0:00:00
作为0时间,您可以在电子表格的任何位置输入=TO_DATE(0)
来查看。
原则上,您可以将.valueOf()
应用于.getValue()
返回的持续时间值:这将返回JavaScript时间戳,即从开头的毫秒秒的数量1970.除以1000给出了Unix时间戳。
然而,这是有问题的,因为Unix时间戳和因此JavaScript时间戳是从UTC 的1970-01-01 00:00:00
时刻开始测量的,而Google表格的0标记位于本地时区即可。
如果您尝试使用new Date().getTimezoneOffset();
调整时区,请注意脚本时区可能与工作表时区不同:documentation says这是“脚本错误的常见来源”。方法Spreadsheet.getSpreadsheetTimeZone()
给出了电子表格本身的时区,但它以“美国/纽约”字符串的形式返回,does not directly translate to an offset。
答案 1 :(得分:0)
您的ThisWorkBook
是+monthlyTotal
和1970-01-01 00:00:00
之间的毫秒数。
时间戳是什么意思?根据您的Tue Dec 26 1899 14:50:28 GMT-0300 (BRT)
对象,您可以Date
根据UTC时间获得所需内容。