【问题标题】:Google Sheets DateTime static vs dynamic dates issuesGoogle Sheets DateTime 静态与动态日期问题
【发布时间】:2018-02-06 17:46:43
【问题描述】:

总结

我一直在使用时区的 Google 表格工作,但我发现了一个我无法弄清楚的令人困惑的问题。基本上,如果我在静态日期或动态生成的日期上使用自定义脚本公式,我会得到不同的结果,但它应该是相同的!

我有什么

这是一个快速预览,显示了我在说什么。 C2 是动态创建的日期,而 C5 是静态日期。我创建了一个自定义函数,它将采用 TimeDateString(例如 C2 和 C5)并将其转换为另一个时区。

您可以清楚地看到D2 和D5 是不同的答案;但是,它们应该是相同的。 这就是这个问题的原因。这是一个错误吗?还是我错过了什么?

电子表格链接

https://docs.google.com/spreadsheets/d/1HEFud8oqM-Yx0BR5SjyEG8yjGK-O0t8c6YcEfYtnLSA/edit?usp=sharing

代码

自定义脚本函数

function DateTime(dateTimeString, timeZone, format) {

  if (format == null)   { format = "MMM dd 'at' hh:mma z" }
  if (timeZone == null) { timeZone = "GMT" }

  var date_time = new Date(dateTimeString);

  if(!isNaN(date_time.valueOf())) {
    return Utilities.formatDate(date_time, timeZone, format);
  } else {
    throw Utilities.formatString('Invalid Date String: "%s"', dateTimeString);
  }

}

C2公式

=CONCATENATE(Month($A2), "/", if(Day($A2) < 10, CONCAT("0", Day($A2))), "/", Year($A2), " ", Hour($B2), ":", if(Minute($B2) < 10, CONCAT("0", MINUTE($B2)), Minute($B2))) 

D2公式

=DateTime(C2)

D5公式

=DateTime(C5)

【问题讨论】:

  • @pnuts 能否请您将该评论 [关于我的脚本位于错误的时区] 作为一个充分的答案,因为它解决了我的问题(我没有做出其他建议的更改)。我想奖励你。我没有尝试过您的A2 + B2 建议,但以后可能会奏效(我之前尝试过,但没有奏效)
  • 我已更改电子表格以使用 GMT 时区,但没有意识到脚本具有相同类型的设置。您的链接表明这是问题的常见来源
  • @pnuts 你对A2 + B2 的建议效果很好,看起来好多了
  • @pnuts 我按照建议创建了一个新答案

标签: datetime google-sheets datetime-format utc custom-function


【解决方案1】:

不同的时区

用户pnuts 提出的评论与我的奇怪行为的原因绝对相关。我已将电子表格时区修改为GMT+0:00;但是,我的脚本时区仍为 GMT+9:00 在使这两个值相同后,我的工作表和脚本正常工作。

实际上您需要查看 2 个时区,它们需要匹配!!

  1. 电子表格的时区 (File &gt; Spreadsheet settings &gt; Timezone)
  2. 脚本的时区 (File &gt; Project properties &gt; Timezone)

注意:这两个时区必须匹配!!

否则你会得到如题所示的奇怪结果。

您可以采取的进一步行动

Google 承认这是问题的常见来源,我在其中创建了一个 issue Google App Script Issue Tracker 如果您首先遇到此问题,您可以对这个未决问题进行投票 -手。

https://issuetracker.google.com/issues/73046652


支持文档和引文

Google 应用脚本文档

时区信息的 Google App Scripts Session 文档说明如下...

与脚本时区不同的电子表格时区是脚本错误的常见来源。

Pnuts 的评论

作为Pnuts has stated in the comment to my question...

脚本的时区是东京。似乎您的公式可能是 =text(A2+B2,"mm/dd/yyyy hh:mm")

注 1:他说他 didn't want to make his comment an answer 而是想让我写一个。

注2:他在A2 + B2修改中也是正确的。

【讨论】:

    【解决方案2】:

    每当您输入日期(静态日期)时,表格都会自动将其转换为数字(或 Excel)。所以,ISTEXT() C2 为真,而 C5 为假。

    虽然在肉眼看来,C5 似乎与 C2 是相同的文本,但 C5 可能以不同的格式发送到脚本。要查看实际格式,请检查以下脚本的日志

    function checkdatevalues() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('Sheet1'));
      var range = sheet.getRange('C2:C5');
      Logger.log(range.getValues());
    }
    

    可能的解决方案:

    • 为静态日期添加前缀';这将阻止表格将其转换为日期值。 '11/6/2018 13:00

    或者

    • 将动态日期乘以 1;所以,=1*CONCATENATE(....) 然后在菜单中将其格式化为所需的格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多