google-apps-script - Google 电子表格 Makro - 将一个时间值添加到另一个时间值
问题描述
var valueDate = Utilities.formatDate(sheet.getRange("D2").getValue(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "dd/MM/YYYY hh:mm:ss");
var valueResetCD = Utilities.formatDate(sheet.getRange("C2").getValue(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "hh:mm:ss");
这是我目前拥有的 2 行 - 由于电子表格时区可能与 makro 时区不同,我被告知始终从工作表中获取时区。
在这两个值中,我保存了正确的值(尝试将它们打印到字段中)
第一个是19/09/2020 22:34:52
(特定日期),第二个是03:00:00.000
(3 小时)
现在我想要做的就是将这 2 次加在一起,这样我就得到了输出:20/09/2020 01:34:52
我试过了:sheet.getRange("Data!$A$21").setValue(valueDate + valueResetCD)
但我想这并不容易 - 它只是将时间的 2 个字符串值复制到一行中。
如何将这 2 个时间/日期值相互添加,以便得到上面的输出
解决方案
我相信你的情况和目标如下。
- 在您的情况下,作为样本值,
valueDate
19/09/2020 22:34:52
检索自sheet.getRange("D2").getValue()
。valueResetCD
03:00:00.000
检索自sheet.getRange("C2").getValue()
。- 这两个值都是日期对象。
- 您要添加
valueResetCD
到valueDate
.- 当使用样本值时,您希望得到
20/09/2020 01:34:52
作为结果值。
- 当使用样本值时,您希望得到
修改点:
- 在这种情况下,我认为这
valueDate
是正确的日期时间,就像19/09/2020 22:34:52
日期对象一样。 - 但是,我认为
valueResetCD
是1899/12/30 03:00:00
。因为电子表格使用序列号。- 从这种情况下,需要将序列号转换为unix时间。
- 而且,在这种情况下,需要考虑时间差。
- 通过从日期对象转换为 unix 时间来添加这两个值。并且,结果值被转换为日期对象。
当以上几点反映到 Google Apps Script 时,它变成如下。
修改后的脚本:
function myFunction() {
var sheetName = "Sheet1"; // Please set the sheet name.
// 1. Retrieve values from the cells as the date object.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var valueDate = sheet.getRange("D2").getValue(); // As a sample value, it's `19/09/2020 22:34:52`.
var valueResetCD = sheet.getRange("C2").getValue(); // As a sample value, it's `03:00:00.000`.
// 2. Convert the date object to the unix time.
var valueDateUnix = valueDate.getTime();
var differenceBetweenSerialAndUnix = new Date("1970/01/01 00:00:00").getTime() - new Date("1899/12/30 00:00:00").getTime();
var timeDifference = (new Date().getTimezoneOffset()) * 60 * 1000;
var valueResetCDUnix = valueResetCD.getTime() + differenceBetweenSerialAndUnix - timeDifference;
// 3. Add both time and convert it to the date object.
var resultDateObject = new Date(valueDateUnix + valueResetCDUnix);
var resultString = Utilities.formatDate(resultDateObject, SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "dd/MM/YYYY hh:mm:ss");
console.log(resultDateObject)
console.log(resultString) // You can see "20/09/2020 01:34:52" at the log.
// 4. Put the value to the cell.
sheet.getRange("A1").setValue(resultDateObject);
}
笔记:
- 在这个答案中,它假设单元格“C2”和“D2”中的值是日期对象。如果这些值是不是日期对象的字符串,则不能使用上述脚本。所以请注意这一点。
参考:
推荐阅读
- selenium - Selenium WebDriver C#——XPath 不工作
- c# - 为什么线程池可以以相同的优先级启动我的任务,而不是按照我发布它们的顺序?
- ios - WebCore bmalloc::IsoAllocator 在 iOS 11.3 中崩溃
- java - 我想访问使用字符串达到的类的方法
- java - 进度条 NullPointerException
- sql-server - 从两个 CSC 文件中读取数据,使用 Join 使用 SSIS 存储表
- python - 使用@patch 装饰器模拟属性
- javascript - 单击关闭图标后如何删除具有相同类名的当前列表项
- linux - 使用 awk 或 sed 比较两个文件的值,并将文件 2 中的信息附加到文件 1 到新文件 file3
- mysql - centos 5.7 之前的服务器无法升级到 8.0。服务器启动失败