计算时间范围和解析日期

时间:2013-09-05 12:57:20

标签: google-apps-script google-sheets

我有简单的电子表格,需要根据下图计算时间范围:

enter image description here

我的规则基本上是一个简单的数学运算:(end date - initial date) - "09:00:00"。 我的结果列给了我类似的内容:-0:21:00并且它是正确的。

我的列格式为“小时”(Format > Number > Hours)。我需要得到第三列的总结并通过电子邮件发送结果。有意省略了部分代码。在我的脚本代码段下面:

var data = dataRange.getValues();
  for (i in data) {
    var row = data[i];
    var to = row[0]; // e-mail
    var total = row[1]; // total column
    msg = "Total hours: " + Utilities.formatDate(total, "GMT-0300", "HH:mm:ss");
    subject = "Test";   
    MailApp.sendEmail(to, subject, msg);
  }  

当我在发送电子邮件之前尝试格式化Utilities.formatDate(...)时,时间会出错。我试图删除Utilities电话,直接传递小时,但它给了我以下结果:

Fri Dec 29 1899 23:45:28 GMT-0300 (BRT)

我意识到我的total var必须是JavaScript Date对象的哪个位置,但它也不起作用。我需要通过电子邮件发送我的结果列。

2 个答案:

答案 0 :(得分:1)

我会将电子表格中的演示文稿与您需要在电子邮件中发送的内容分开。

您在列中获得的结果会正确显示,但表示从1900年1月1日格林威治标准时间00:00:00开始的以毫秒为单位的偏移量(以小时为单位)。

所以当你把它转换成你得到的日期时。

相反,两个日期之间的毫秒数并使用将返回“人类可读”数字的函数...例如此处描述的那个:

Convert time interval given in seconds into more human readable form

祝你好运

答案 1 :(得分:0)

通过简单的方法解决了我的问题,Math.round(...)使其完全可以接受:

function getReadableTime(ms) {

    var spreadsheetTimezone = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone();
    var dateString = Utilities.formatDate(ms, spreadsheetTimezone, 'EEE, d MMM yyyy HH:mm:ss');
    var date = new Date(dateString);

    var epoch = new Date('Dec 30, 1899 00:00:00');
    var diff = date.getTime() - epoch.getTime();

    x = diff / 1000;
    seconds = Math.round(x % 60);
    x /= 60;
    minutes = Math.round(x % 60);
    x /= 60;
    hours = Math.round(x % 24);
    x /= 24;
    days = Math.round(x);

    return createMsg(hours, minutes);
}

省略函数createMsg(...),因为它接受参数并为用户创建可读消息。这里的诀窍是在ms中创建一个时间范围,并遵循其中一条规则,使其达到秒/分钟/小时/天或任何您需要的时间。