函数 NOW() + 设置时区(谷歌表格)

Bro*_* IF 1 timezone google-sheets dst google-apps-script google-sheets-formula

我住在巴西(UTC 偏移量为 - 3:00),在这里我们有一种叫做夏令时的东西,在一年中的某些时候,时钟会提前 1 小时。

发生的事情是我有一个完整的电子表格准备过滤英格兰时区的数据。

我今天遇到了一个大问题,因为 Google 的时代变了,我的数据被错误地过滤了。

我在脚本中的原始公式是:

spreadsheet.getCurrentCell().setFormula('=text(now()+"5:00","yyyy/mm/dd hh:mm")');

现在几个小时后,我意识到失败并需要切换到:

spreadsheet.getCurrentCell().setFormula('=text(now()+"4:00","yyyy/mm/dd hh:mm")');

为了不再发生这种情况,我想知道如何在 NOW () 函数中添加英格兰时区。

我试过:

spreadsheet.getCurrentCell().setFormula('=text(now("UK"),"yyyy/mm/dd hh:mm")');

但是没能回来。我每 1 分钟使用一个触发器来更新电子表格中的时间,我想知道我可以做些什么来解决这个问题。

详细信息:我可以在电子表格设置中更改时间,但我需要将其保存为当地时间。

Tan*_*ike 5

  • 您想在不更改电子表格的本地时区的情况下使用不同的时区。
  • 您想将转换为不同时区的时间作为文本放入电子表格。
  • 您想使用 Google Apps 脚本来实现这一点。

如果我的理解是正确的,这个答案怎么样?

问题和解决方法:

不幸的是,在当前阶段,NOW()内置函数没有更改时区的选项。如果NOW()更改了时区,则需要更改电子表格的时区。但在您的情况下,电子表格的时区无法更改。因此,作为一种解决方法,我建议使用Utilities.formatDate().

示例脚本:

示例脚本如下。

function NOW2(timeZone, format) {
  return Utilities.formatDate(new Date(), timeZone, format);
}

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  spreadsheet.getCurrentCell().setFormula('=NOW2("Europe/London", "yyyy/mm/dd hh:mm")');
}
Run Code Online (Sandbox Code Playgroud)
  • NOW2()用作自定义函数。在示例脚本中,myFunction()运行时=NOW2("Europe/London", "yyyy/mm/dd hh:mm")将放入当前单元格。通过这种方式,通过将时区Europe/London转换为yyyy/mm/dd hh:mm.

笔记:

  • 如果您想刷新=NOW2("Europe/London", "yyyy/mm/dd hh:mm")电子表格打开时的自定义功能,请使用以下脚本作为简单触发器。

    function onOpen(e) {
      e.source.createTextFinder("=NOW2").matchFormulaText(true).replaceAllWith("temp");
      e.source.createTextFinder("temp").matchFormulaText(true).replaceAllWith("=NOW2");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您想使用上面的时间驱动触发器,请使用以下脚本。在这种情况下,触发器的当前总运行时间和自定义函数的当前运行时间分别为 90 分钟/天和 30 秒/执行。Ref请注意这一点。

    function myFunction() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      ss.createTextFinder("=NOW2").matchFormulaText(true).replaceAllWith("temp");
      ss.createTextFinder("temp").matchFormulaText(true).replaceAllWith("=NOW2");
    }
    
    Run Code Online (Sandbox Code Playgroud)

参考:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。