【问题标题】:How to get a date format string from a sheet cell?如何从工作表单元格中获取日期格式字符串?
【发布时间】:2015-11-19 16:23:06
【问题描述】:

在谷歌脚本函数中,我需要从谷歌表格中获取日期值,我做了类似的事情

var csh = SpreadsheetApp.getActiveSheet();
var date = csh.getRange('A1').getValue();
var msg = "date = " + date;

我得到的是类似的东西

msg = "date = 42323"

如何格式化日期变量以显示为日期

谢谢

【问题讨论】:

  • 应用于单元格 A1 的格式字符串是什么? (试试var fmt = csh.getRange('A1').getNumberFormat();
  • 格式似乎是个问题。我假设正常的英国日期格式(dd/mm/yyyy),但它要么未设置,要么未设置 mm/dd/yyyy。有问题的单元格的日期适用于前者,但不适用于后者 - 21/12/2015。当我将单元格设置为正确的格式时,一切都按预期工作。

标签: google-apps-script google-sheets


【解决方案1】:

正如 jvdh 所说,电子表格中的日期应自动转换为 Google Apps 脚本中的 JavaScript 日期。到目前为止,我们听到的还有更多与您的情况有关的情况。

related question from 2013 上,AdamL 很好地解释了日期是如何表示的。他还暗示了一种将电子表格中的数字“序列号”(或“纪元”)日期值转换为 JavaScript 中使用的 Unix 样式值的方法。

这是我对该实用程序的版本。要使用,只需传入从电子表格中读取的值,如下所示:

var csh = SpreadsheetApp.getActiveSheet();
var date = convert2jsDate( csh.getRange('A1').getValue() );
var msg = "date = " + date;

该实用程序可以处理 JavaScript 的 dateString 支持的现有日期、“序列号”或字符串格式。

/**
 * Convert any spreadsheet value to a date.
 * Assumes that numbers are using Epoch (days since 1 Jan 1900, e.g. Excel, Sheets).
 * 
 * @param {object}  value  (optional) Cell value; a date, a number or a date-string 
 *                         will be converted to a JavaScript date. If missing or
 *                         an unknown type, will be treated as "today".
 *
 * @return {date}          JavaScript Date object representation of input value.
 */
function convert2jsDate( value ) {
  var jsDate = new Date();  // default to now
  if (value) {
    // If we were given a date object, use it as-is
    if (typeof value === 'date') {
      jsDate = value;
    }
    else {
      if (typeof value === 'number') {
        // Assume this is spreadsheet "serial number" date
        var daysSince01Jan1900 = value;
        var daysSince01Jan1970 = daysSince01Jan1900 - 25569 // 25569 = days TO Unix Time Reference
        var msSince01Jan1970 = daysSince01Jan1970 * 24 * 60 * 60 * 1000; // Convert to numeric unix time
        var timezoneOffsetInMs = jsDate.getTimezoneOffset() * 60 * 1000;
        jsDate = new Date( msSince01Jan1970 + timezoneOffsetInMs );
      }
      else if (typeof value === 'string') {
        // Hope the string is formatted as a date string
        jsDate = new Date( value );
      }
    }
  }
  return jsDate;
}

【讨论】:

    【解决方案2】:

    apps 脚本自动将电子表格日期转换为 Javascript 日期。当我运行您的代码时,msg 对我来说等于“date = Wed Nov 11 2015 00:00:00 GMT+0100 (CET)”。

    如果由于某些原因这对您不起作用,您可能想尝试使用 new Date();例如date = new Date(date);

    【讨论】:

    • 奇怪。我肯定会得到一个数字。如果我用它来初始化一个日期对象(即 dateobj = new Date(date); ),我会得到 Thu, 1 Jan 1970,此时日期应该是 2015 年 11 月 15 日。我确认电子表格中的单元格是一个日期...... .
    • 你能测试一下,如果你双击这个单元格,你会得到一个日历吗?
    • 在阅读本文之前,我已经发现了问题所在。很遗憾,因为它会有很大帮助。我尝试在工作表上使用 isDate("A1") 并且返回 true,所以我虽然没问题。但是当我重现问题并双击时 - 没有日历...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多