阅读和使用GAS /写入时间值到电子表格(Reading and writing time valu

2019-09-16 20:01发布

我真的以为我开始理解它是如何工作的,直到我试图提炼一个测试用例这个问题,再次是完全糊涂了。

随着谷歌电子表格,你可以写这样的自定义函数:

function dateToSeconds(date) {
  var hours = date.getHours();
  var minutes = date.getMinutes();
  var seconds = date.getSeconds();
  return (hours*3600) + (minutes*60) + seconds;
}

并通过这样做如把它称为一个细胞

=dateToSeconds(A1)

并且它你所期望的。 但是,如果你把它就像这样:

function test() {
    var sheet = SpreadsheetApp.getActiveSheet();

    sheet.getRange("A2").setValue(dateToSeconds(sheet.getRange("A1").getValue()));
}

有2500万个21S的差异。 有没有搞错?

另外,如果你想使之被格式化为一个时间从脚本返回日期对象,你可以做如

function newTime(hours, minutes, seconds) {
    // 1899-12-30 is the epoch for time values, it seems
    // http://stackoverflow.com/questions/4051239/how-to-merge-date-and-time-as-a-datetime-in-google-apps-spreadsheet-script
   return new Date(1899, 11, 30, hours, minutes, seconds, 0);
 }

并通过这样称呼它:

=newTime(A1, A2, A3)

并能正常工作。 如果你这样做:

function test() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var values = sheet.getRange("A1:C3").getValues();
    sheet.getRange("D3").setValue(newTime(values[0], values[1], values[2]));
}

然后(按给出的11:00:00的输入)它被格式化为像一个日期:

01/01/1970 01:00:00

它看起来像它被更传统的1970年时代之后解释为一个小时? 我想我以前见过的行为是有点对称的25米-21上述偏移和我会看到:

10时34分39秒

我的测试用例是这里

Answer 1:

这里似乎是一件奇怪的事情与你= dateToSeconds的()与您的测试()函数的行为。 它看起来像有这是造成两者之间的时间差异的错误。 请提出对于一个错误的问题跟踪 。

我不过能够通过使用对细胞数字格式得到这个工作。 看看我的修改您的电子表格的副本 。 在单元格A2我进入“29/04/2012 11:00:00”,然后设置格式>号码>十五点59分00秒的时间。 您也可以做到这一点编程方式通过使用Range.setNumberFormat ( “HH:MM:SS”); 这导致在单元格A2表示11:00:00。

然后,我修改了测试功能,有这样的代码:

function test() {
  var sheet = SpreadsheetApp.getActiveSheet();

  sheet.getRange("E2").setValue(dateToSeconds(sheet.getRange("A2").getValue()));
  Logger.log(sheet.getRange("A2").getValue());
  Logger.log(sheet.getRange("A2").getNumberFormat());

  var values = sheet.getRange("A4:C4").getValues();
  Logger.log(values[0][0] + " " + values[0][1] + " " + values[0][2]);
  sheet.getRange("E4").setValue(newTime2(values[0][0], values[0][1], values[0][2])).setNumberFormat("HH:mm:ss");
}

和代替NEWTIME功能,我创建了一个newTime2使用此代码:

function newTime2(hours, minutes, seconds) {
  var date = new Date();
  date.setHours(hours);
  date.setMinutes(minutes);
  date.setSeconds(seconds);
  Logger.log(date);
  return date;
}

我希望帮助。



Answer 2:

参见如何得到正确的值这个帖子,有一个修正系数,因为电子表格的时间和Java Script的时间都没有,他们有不同的出发点是相同的:

GAS:如何读取正确的时间值,形成谷歌电子表格



文章来源: Reading and writing time values from/to a spreadsheet using GAS