How do I use momentsjs in Google Apps Script?

前端 未结 5 2296
时光说笑
时光说笑 2020-12-15 18:09

I\'m trying to utilize the momentjs library in Google Apps Script but I\'m not clear on how to do so. I\'m not sure how to add the library, so obviously running something l

相关标签:
5条回答
  • 2020-12-15 18:44

    There is a better and best way to use moment

    Do not use UrlFetchApp, to avoid quota exceeded, caching, and server issues

    Download moment.min.js and momemt-timzone.min.js in last versions

    and integrate the full files in apps script like the below screen

    There is no problems in long run with this approach, just update the files any time when you need.

    After adding the two files, just publish a new version and include it in any other script

    use it like the below examples

    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
    
    0 讨论(0)
  • 2020-12-15 18:57

    You can add moment and moment.tz to app scripts by creating a new Script file and adding the following code:

    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);
    
      }
    }
    

    This uses the cache service to reduce round trip calls and you can modify it to include a subset of data if you want.

    Thanks to apadana for getting me started!

    0 讨论(0)
  • 2020-12-15 19:00

    I created an updated version of moment for Appscript (v2.19.3 with locales). This is the library - Mlj57Yi463PVmHumHxq4bkaUlUqvRc4KT To start using it add the library then make moment a global variable as below.

    var moment = Moment.moment
    
    0 讨论(0)
  • 2020-12-15 19:05

    Using external Javascript library is not so easy... Depending on the context in which you want to use it (a webapp of a document embedded script) the approach will be different.

    I didn't try it in client JavaScript and I'm not sure caja will allow it but I found this post that shows a possible way to include it using a Google Script Library that a user has build and if I read the post it seems to work...

    The "user" is a Google developper so he knows for sure what he is talking about ;) please update here if it worked for you.

    0 讨论(0)
  • 2020-12-15 19:06

    Most people try to use the library with the key ending in 48. That library is pretty dated (it is version 2.9 which is pretty old).

    Using eval and UrlFetchApp.fetch moment.js or any other external library can be used easily in google app scripts.

    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)
    }
    

    You may either host the moment.js on your own server, or use a CDN like cloudflare CDN to reference the library.

    For cloudflare, here is the page which shows moment.js versions and their urls:

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


    As of writing this post 2.18.1 is the latest version.

    For the example posted by OP it will look like this:

    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);
    }
    
    0 讨论(0)
提交回复
热议问题