【问题标题】:How do I use momentsjs in Google Apps Script?如何在 Google Apps 脚本中使用 moment js?
【发布时间】:2014-03-14 16:06:31
【问题描述】:

我正在尝试在 Google Apps 脚本中使用 momentjs 库,但我不清楚如何使用。我不确定如何添加库,所以显然运行类似以下的结果会导致“引用错误:'moment' is not defined”:

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
var difference = a.diff(b);

【问题讨论】:

  • 我添加了这个库密钥:MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48 然后定义了 var moment = Moment.load() 一切都很好!
  • 您应该提到您是从this answer 了解该库的。
  • @Mogsdad 注意。我是从接受的答案中了解到的。通过在我的笔记中再次链接到该评论,我可能会更清楚。
  • 现在可以在库下的资源菜单中找到。添加库:通过密钥 MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48。单击添加。我使用了第 9 版,它工作正常。
  • 截至 2021 年 6 月,我无法添加此密钥。我不得不改用 UrlFetchApp 解决方案。

标签: google-apps-script momentjs


【解决方案1】:

大多数人尝试使用密钥以 48 结尾的库。那个库已经过时了(它是相当旧的 2.9 版)。

使用evalUrlFetchApp.fetch moment.js 或任何其他外部库可以在谷歌应用脚​​本中轻松使用。

function testMoment() {
  eval(UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js').getContentText());
  var date = moment().format("MMM Do YY");
  Logger.log(date)
}

您可以在自己的服务器上托管 moment.js,或者使用像 cloudflare CDN 这样的 CDN 来引用该库。

对于 cloudflare,这里是显示 moment.js 版本及其网址的页面:

https://cdnjs.com/libraries/moment.js/


截至撰写本文时,2.18.1 是最新版本。

对于 OP 发布的示例,它将如下所示:

function testMomentDifference() {
  eval(UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js').getContentText());
  var a = moment([2007, 0, 29]);
  var b = moment([2007, 0, 28]);
  var difference = a.diff(b);
  Logger.log(difference);
}

【讨论】:

  • 这是我不知道的事情!虽然每次运行脚本时都会从 CDN 加载,但这允许在 GAS 上使用许多其他 3rd 方库。感谢您的提醒!
【解决方案2】:

我为 Appscript(带有语言环境的 v2.19.3)创建了 Moment 的更新版本。这是库 - Mlj57Yi463PVmHumHxq4bkaUlUqvRc4KT 要开始使用它,请添加库,然后将 moment 设为全局变量,如下所示。

var moment = Moment.moment

【讨论】:

  • Moment.js 的新版本发布时,您创建的库会更新吗?
  • 这个库好像不存在了
【解决方案3】:

Google Apps 脚本 IDE 的脚本 ID 已更改。现在是“15hgNOjKHUG4UtyZl9clqBbl23sDvWMS8pfDJOyIapZk5RBqwL3i-rlCo”

【讨论】:

    【解决方案4】:

    您可以通过创建新的Script file 并添加以下代码来将 moment 和 moment.tz 添加到应用脚本:

    var cacheExpire = 3600;
    var momentCache = "momentCache";
    var momentUrl = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"
    
    var momentTzCache = "momentTzCache";
    var momentTzUrl = "https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.16/moment-timezone-with-data-2012-2022.min.js"
    
    useCachedOrLive(momentCache,momentUrl);
    useCachedOrLive(momentTzCache,momentTzUrl);
    
    function useCachedOrLive(cacheToCheck, url){
    
      var cache = CacheService.getUserCache();
      var cachedData = cache.get(cacheToCheck);
      console.log(cacheToCheck);
      if(cachedData !== null){
        console.log("using cached " + cacheToCheck)
        eval(cachedData);
      }
      else
      {
        console.log("getting live " + cacheToCheck);
        var response = UrlFetchApp.fetch(url).getContentText();
        cache.put(cacheToCheck, response, cacheExpire);
        eval(response);
    
      }
    }
    

    这使用缓存服务来减少往返调用,您可以根据需要对其进行修改以包含数据子集。

    感谢apadana 让我开始!

    【讨论】:

      【解决方案5】:

      有更好更好的方式来使用moment

      不要使用 UrlFetchApp,以避免超出配额、缓存和服务器问题

      下载最新版本的 moment.min.js 和 momemt-timzone.min.js

      并将完整文件集成到应用程序脚本中,如下图所示

      从长远来看,这种方法没有问题,只需在需要时随时更新文件。

      添加这两个文件后,只需发布​​一个新版本并将其包含在任何其他脚本中

      例如:

      1. 我将创建一个名为“MomentAPI”的脚本并包括这两个 提到的文件,并发布新版本。
      2. 在其他名为“myScript”的脚本中,我将包含该库 “MomentAPI”,其脚本 ID 为已知

      然后会像下面的例子那样使用它

      const moment = MomentAPI.moment; // init the library
        
      const start = moment().startOf('day').toDate(); // Dec 06 00:00:00
      const end = moment().endOf('day').toDate(); // Dec 06 23:59:59
      const d = moment(1767139200000).tz('America/New_York').format('ha'); // 7am EST
      

      【讨论】:

      • 真正有趣的方法。从长远来看,这种方法有什么需要注意或担心的吗?
      • 它对我来说完美而快速。还可以避免 UrlFetchApp 配额和缓存问题。我们在所有项目中都使用 Moment lib
      • 我不确定我是否遵循您示例中的第一行 > const moment = MomentAPI.moment; MomentAPI 在哪里定义?您是否将其包装在新课程中?这对我来说是错误的。
      • 没关系 - 我可以通过引用 moment() 来使用它。 MomentAPI 引用让我大吃一惊。您可能想更新您的答案。
      • @RafaelSlobodian MomentAPI 将只是一个名为“MomentAPI”的脚本,它将包含文件,并将此脚本导入其他脚本并像示例一样调用它。你也可以像直接调用 moment() 一样在同一个脚本中直接使用它,它也是一样的。我更新了答案以使示例更加清晰。谢谢。
      【解决方案6】:

      使用外部 Javascript 库并不是那么容易...根据您要使用它的上下文(文档嵌入脚本的 web 应用程序),方法会有所不同。

      我没有在客户端 JavaScript 中尝试它,我不确定 caja 是否会允许它,但我发现 this post that shows a possible way to include it using a Google Script Library 用户已经构建,如果我阅读帖子,它似乎可以工作......

      “用户”是 Google 开发人员,因此他肯定知道自己在说什么;)如果对您有用,请在此处更新。

      【讨论】:

      • 虽然使用那个 GAS 库是可行的,但它来自一个非常过时的 Momentjs 版本。获取最新版本的最佳方法是使用下面的答案。
      • @Rodrigo 你可能没有注意到这个答案是 4 年前写的......无论如何,为什么要投反对票?它有什么变化?
      • 我确实注意到了,但与此同时,它似乎是一种新方法(参见下面的答案),它允许您将任何库导入 GAS,包括 moment.js 最新版本。当然,这不是投反对票的原因,但是当我试图退出时,我的投票似乎被锁定,直到答案被编辑。您介意将下面答案中的方法添加到接受的答案吗?一旦允许我,我会支持你的答案(对于狂热的反对票,我很抱歉!)
      猜你喜欢
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多