0

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

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

我已经尝试过,因为我在其他 Stack Overflow 答案中阅读了很多内容,eval但没有成功地像这样使用:

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

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

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

我的 TS 文件: 在此处输入图像描述

4

1 回答 1

1

可以在“标准”Apps Script 项目中通过eval&使用像 Moment.js 这样的外部库,因为变量并没有定义,所以库将自身安装到全局上下文中UrlFetchAppexportsmodule

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

代码.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'd 库的初始化假定它具有比 Google Apps Script 提供的更新的运行时/包管理系统。

代码.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-->

代码.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 中是 eval'd 导入似乎非常脆弱,并且在编写实际的 TypeScript 时肯定不容易解决。

有关的:

于 2019-02-22T15:50:35.437 回答