【问题标题】:Reading and writing time values from/to a spreadsheet using GAS使用 GAS 从/向电子表格读取和写入时间值
【发布时间】:2012-04-28 11:45:26
【问题描述】:

我真的以为我开始理解它是如何工作的,直到我尝试为这个问题提炼一个测试用例并且再次完全困惑。

使用谷歌电子表格,您可以编写如下自定义函数:

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()));
}

有 25m 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 年代晚一个小时?我认为我之前看到的行为与上面的 25m 21s 偏移有点对称,我会看到:

10:34:39

我的测试用例是here

【问题讨论】:

    标签: javascript google-sheets google-apps-script


    【解决方案1】:

    =dateToSeconds() 与 test() 函数的行为似乎确实有些奇怪。看起来有一个错误导致两者之间的时间差异。请在issue tracker 中提出一个错误。

    然而,我能够通过在单元格上使用数字格式来实现这一点。看看我的modified copy of your spreadsheet。在单元格 A2 中,我输入了“29/04/2012 11:00:00”,然后设置格式 > 数字 > 15: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;
    }
    

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      如何获取正确值见这篇博文,有一个校正因子,因为电子表格时间和 Java Script 时间不一样,它们有不同的起点:

      GAS: How to read the correct time values form Google Spreadsheet

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 2017-09-19
        • 2022-11-22
        • 2017-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多