在转译的Apps脚本中导入moment.js

时间:2019-02-22 13:15:38

标签: typescript google-apps-script clasp

我有必要在本地开发的Apps脚本项目中使用moment.js,该项目使用google\clasp从TypeScript进行转换。

我已经尝试过像在.gs中正常编写时一样在项目内部添加js库,但是使用clasp似乎不允许我使用这种方式。

正如我在其他Stack Overflow答案中读到的很多文章一样,我已经尝试过像这样使用eval而不成功:

eval(UrlFetchApp.fetch('library.min.js url').getContentText());

在所有情况下,当我推送到Apps脚本并在Apps脚本编辑器中运行该功能后,都会收到

  

ReferenceError:未定义“时刻”。 (第6行,文件“测试”)

我的TS文件: enter image description here

1 个答案:

答案 0 :(得分:1)

由于未定义变量evalUrlFetchApp,因此可以通过“标准” Apps Script项目中的exportsmodule使用外部库,例如Moment.js。因此库installs itself into the global context

实际上,我们可以通过在Apps脚本编辑器中检查this来验证结果:

Code.gs

var momentURL = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.4/moment.min.js";
function main() {
  eval(UrlFetchApp.fetch(momentURL).getContentText());
  Logger.log(this["moment"]);
}

执行main会产生结果

function e() {
    return Qe.apply(null, arguments);
}

对于转译的TypeScript,由于exportsmodule是全局定义的,因此eval库的初始化假定它具有比运行库提供的更新的运行时/程序包管理系统。 Google Apps脚本。

Code.ts

import * as moment from "moment";

const momentURL = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.4/moment.min.js";
function main() {
    eval(UrlFetchApp.fetch(momentURL).getContentText());
    Logger.log(`this['moment']: ${this["moment"]}`);
    Logger.log(`this.module: ${this.module}`);
    for (let key in this.module)
        Logger.log(`this.module[${key}]: ${this.module[key]}`);
}

$ clasp push->

Code.gs

// Compiled using ts2gas 1.6.0 (TypeScript 3.2.2)
var exports = exports || {};
var module = module || { exports: exports };
//import * as moment from "moment";
var momentURL = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.4/moment.min.js";
function main() {
    eval(UrlFetchApp.fetch(momentURL).getContentText());
    Logger.log("this['moment']: " + this["moment"]);
    Logger.log("this.module: " + this.module);
    for (var key in this.module)
        Logger.log("this.module[" + key + "]: " + this.module[key]);
}

哪个记录为

this['moment']: undefined
this.module: [object Object]
this.module[exports]: 
function e() {
    return Qe.apply(null, arguments);
}

解决方案

因此eval是成功的,但是绑定到module.exports而不是moment。您可以(在转译的Apps脚本中)引用module.exports而不是moment

Logger.log(module.exports().format("YYYY")); // 2019

可能您需要使用不同于clasp的方法,因为似乎ts2gas(从v1.6.0开始)不支持import / export transpiling。这种观察到的行为,其中module.exports在转译的TS中是评估的导入,似乎非常脆弱,并且在编写实际的TypeScript时肯定不容易解决。

相关: