首页 > 解决方案 > 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 个时间/日期值相互添加,以便得到上面的输出

标签: google-apps-scriptgoogle-sheets

解决方案


我相信你的情况和目标如下。

  • 在您的情况下,作为样本值,
    • valueDate19/09/2020 22:34:52检索自sheet.getRange("D2").getValue()
    • valueResetCD03:00:00.000检索自sheet.getRange("C2").getValue()
    • 这两个值都是日期对象。
  • 您要添加valueResetCDvalueDate.
    • 当使用样本值时,您希望得到20/09/2020 01:34:52作为结果值。

修改点:

  • 在这种情况下,我认为这valueDate是正确的日期时间,就像19/09/2020 22:34:52日期对象一样。
  • 但是,我认为valueResetCD1899/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”中的值是日期对象。如果这些值是不是日期对象的字符串,则不能使用上述脚本。所以请注意这一点。

参考:


推荐阅读