【问题标题】:Function NOW() + Setting Timezone (Google Sheets)功能 NOW() + 设置时区(谷歌表格)
【发布时间】:2020-02-23 00:31:29
【问题描述】:

我住在巴西(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 分钟使用一次触发器来更新电子表格中的时间,我想知道我可以做些什么来解决这个问题。

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

【问题讨论】:

  • I can't change the time zone in spreadsheet settings,。为什么不呢?
  • 请原谅我的英语,我是巴西人,有时在决定要使用的词时会出错......事实上我想说:I could change the time in the spreadsheet settings, but I need it saved in local time.
  • 那么,在电子表格中更改为英格兰的时区可以解决问题吗?
  • @TheMaster 是的......它会工作,但我无法更改,因为我需要本地时间的所有记录。但合作伙伴 Tanaike 设法为我的需要做出了一个很好的选择。现在它变得更容易使用了。
  • 这很棒。顺便说一句,月份的“mm”需要为“MM”,因为“mm”代表分钟。

标签: google-apps-script google-sheets timezone google-sheets-formula dst


【解决方案1】:
  • 您希望使用不同的时区而不更改电子表格的本地时区。
  • 您希望将转换为不同时区的时间作为文本放入电子表格中。
  • 您希望使用 Google Apps 脚本实现此目的。

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

问题和解决方法:

不幸的是,在当前阶段,内置函数NOW() 没有更改时区的选项。如果NOW()的时区发生变化,则需要更改Spreadsheet的时区。但在您的情况下,无法更改电子表格的时区。因此,作为一种解决方法,我想建议使用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")');
}
  • 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");
    }
    
  • 如果你想使用上面使用时间驱动的触发器,请使用下面的脚本。在这种情况下,触发器的当前总运行时间和自定义函数的当前运行时间分别为 90 分钟/天和 30 秒/执行。 Ref这个请注意。

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

参考资料:

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

【讨论】:

  • 非常感谢您的回答……我想问您一个问题:由于它是我创建的功能,所以它有使用限制,对吗?您是否认为因为我需要每分钟更新一次,这可能会导致我达到使用限制并破坏工作表?
  • @Frederico Mattos 感谢您的回复。当前触发器的总运行时间和自定义函数的运行时间分别为 90 分钟/天和 30 秒/执行。 Ref我认为在你的情况下,这些成为限制。在这种情况下,当使用时间驱动触发器的脚本刷新自定义函数时,该触发器的脚本总运行时间要求小于 90 分钟/天。如果此信息对您的情况没有用处,我必须道歉。
【解决方案2】:

只是一个建议....我使用“数据”表,其中包含查找列表和各种命名范围。我在澳大利亚,那里也有夏令时。

我刚刚添加了一个命名范围“AU_TZ”,当我们的时间更改时,我将其从 11(小时)更改为 10。所以要检查英国时间,我可以使用

now() - AU_TZ

只需要记住在我的电子表格中更改这个值。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多