【问题标题】:Why is the date value result off by 1 day with Google Apps Script?为什么使用 Google Apps 脚本的日期值结果会相差 1 天?
【发布时间】:2021-02-14 11:32:57
【问题描述】:

目标: 我正在使用以下代码来简单地测试我是否能够提取正确的日期和天数。

function myFunction() {
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Purchases (Beta)');
  const getDate = new Date(spreadSheet.getRange('B4').getValue());
  const getDays = (new Date(getDate.getFullYear(), getDate.getMonth() + 1, 0)).getDate();
  Logger.log(getDate);
  Logger.log(getDays);
}

代码意图: getDate 应该从单元格 B4 中获取日期,其中包含一个日期格式的值“2020-11-01”。 getDays应该是根据单元格B4的设定值来获取天数。

问题: 当我尝试注销 getDate 的结果时,它显示为:Sat Oct 31 20:00:00 GMT-04:00 2020。我不明白,因为 B4 中的值是 2020-11-01。

问题: 我想了解为什么会发生这种情况,并想知道如何根据 B4 单元格中的内容输入正确的日期。

有人可以帮忙吗?

【问题讨论】:

  • 虽然我不确定我是否能正确理解你目前的情况,但我提出了一个答案。你能确认一下吗?如果我误解了你的情况,我认为我的建议没有用。到时候,我很抱歉。
  • 听起来时区不同导致您看到的日期不同。脚本中的时区很可能与记录日期的位置有偏差。您可以在脚本的manifest.json 文件中更改时区。

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


【解决方案1】:

修改点:

  • 当我看到从2020-11-01 的单元格值中检索到Sat Oct 31 20:00:00 GMT-04:00 2020 的值时,我认为在您的情况下,Google Apps 脚本项目的时区可能与 Google 电子表格的时区不同。为了检查这一点,请使用以下脚本。

      console.log(Session.getScriptTimeZone())
      console.log(SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone())
    
    • 运行此脚本时,可以在日志中看到 Google Apps 脚本项目和 Google 电子表格的时区。
    • 我认为根据Sat Oct 31 20:00:00 GMT-04:00 2020 的值,在您的情况下,Google Apps 脚本项目的时区可能是America/New_York。关于这一点,当使用新 IDE 创建新的 Google Apps 脚本项目时,默认时区变为 America/New_York。我不确定这是错误还是当前规范。
      • 此问题已报告给问题跟踪器。 Ref

我认为根据上述情况,更改时区后,您的问题可能会得到解决。那么下面的修改呢?

修改流程:

首先,请从电子表格中检查您的时区。在当前阶段,当电子表格创建为新电子表格时,您的时区就设置好了。

console.log(SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone())

下一步,请将您的时区复制并粘贴到 Google Apps 脚本项目中。在这种情况下,请使用检索到的时区修改清单文件 (appsscript.json)。 Ref

"timeZone": "###", <--- Please set your timezone here.

以上设置完成后,请再次测试您的脚本。

注意:

当然,我认为您可以使用 Google Apps Script 项目的时区来设置 Google 电子表格的时区。但是,在这种情况下,Google Apps 脚本项目的时区可能与您的时区不同。请注意这一点。

参考资料:

2021 年 4 月 6 日更新:

the issue tracker,我可以确认新 IDE 的这个关于 Google Apps 脚本项目时区的错误。

  • 关于bug,当使用新的IDE创建新的Google Apps Script项目时,GAS项目的时区总是America/New_York。在我所在的地区,它是Asia/Tokyo

今天,当我对此进行测试时,我可以确认此错误已被删除。当我创建新的 Google Apps 脚本项目时,timeZoneappsscript.json 中的值是Asia/Tokyo。这对我来说是正确的值。

【讨论】:

    【解决方案2】:

    问题(更新):

    主要问题很可能与您在脚本编辑器中看到的时区与电子表格文件的时区之间的差异有关。您可以更改/检查两者以确保它们相同。

    代码中的另一个问题与此answer 和这一行有关:

    new Date(getDate.getFullYear(), getDate.getMonth() + 1, 0)
    
    • 您已将0 指定为new Date() 的第三个参数,这超出了范围,这就是为什么您会得到上个月(10 月)的日期。

    在同一行中,将1 添加到单元格的当前月份。这将给您 12 月(假设您在第三个参数中修复了日期索引)。如您所见here

    表示月份的整数值,从 0 开始表示一月到 12 月 11 日。

    解决方案:

    所以总的来说,如果你解决了这两个问题,这行应该是:

    const getDays = (new Date(getDate.getFullYear(), getDate.getMonth(), 1)).getDate();
    

    关于你的其他问题:

    我想了解为什么会发生这种情况,并想知道我该怎么做 根据 B4 单元格中的内容输入正确的日期。

    正如我在评论中解释的那样,如果您想要在单元格中显示的确切格式,您应该使用getDisplayValue() 而不是getValue()

    有关此问题的原因的更多详细信息:

    Difference between getValue() and getDisplayValue() on google app script

    插图:

    当我执行这段代码时:

    function myFunction() {
      const spreadSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Purchases (Beta)');
      const getDate = new Date(spreadSheet.getRange('B4').getValue());
      const getDate2 = spreadSheet.getRange('B4').getDisplayValue();
      const getDays = (new Date(getDate.getFullYear(), getDate.getMonth(), 1)).getDate();
      Logger.log(getDate);
      Logger.log(getDate2);
      Logger.log(getDays);
    }
    

    我得到了这些日志:

    单元格 B4 中的日期为:2020-11-01,所以除了我上面描述的问题之外,一切对我来说都很好。

    【讨论】:

    • Marios@,我对延误表示诚挚的歉意,非常感谢您提供答案。我现在明白为什么日期有点不对了。当我尝试共享代码时,我没有得到与你的“getDate”相同的结果,我仍然得到以下时间戳:Sat Oct 31 20:00:00 GMT-04:00 2020。你知道为什么吗?
    • @John 那么它可能与您的电子表格和脚本编辑器之间的时区有关。查看其他答案以获取更多详细信息,并随时为两者投票。
    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多