0

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

在此处输入图像描述

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

我的列格式为 "hour" (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)

我意识到我的totalvar 必须是 JavaScriptDate对象在哪里,但它也不起作用。我需要我的结果栏是通过电子邮件发送的。

4

2 回答 2

1

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

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

因此,当您将其转换为您得到的日期时。

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

将以秒为单位的时间间隔转换为更易读的形式

祝你好运

于 2013-09-05T13:44:35.173 回答
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并遵循其中一个规则,使其变为秒/分钟/小时/天或任何您需要的时间。

于 2013-09-06T12:56:36.580 回答