Можно использовать внешние библиотеки, такие как Moment.js, через eval
& UrlFetchApp
в «стандартных» проектах Apps Script, поскольку переменные exports
и module
не определены, поэтому библиотека устанавливается самав глобальный контекст
Действительно, мы можем проверить результат, проверив 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
yields
function e() {
return Qe.apply(null, arguments);
}
Для транспортируемого TypeScript, поскольку exports
и module
определены глобально, при инициализации библиотек eval
d предполагается, что она имеет более свежую систему управления временем выполнения / пакетамичем это предусмотрено скриптом 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
.Вы можете (в перенесенном скрипте приложений) сослаться на module.exports
вместо moment
:
Logger.log(module.exports().format("YYYY")); // 2019
Возможно, вам потребуется использовать метод, отличный от clasp, поскольку он выглядит как ts2gas
(наv1.6.0) не поддерживает импорт / экспорт транспиляции .Такое наблюдаемое поведение, при котором module.exports
в транспилированном TS является импортом eval'd, выглядит ужасно хрупким, и, конечно, будет нелегко обойти это при написании настоящего TypeScript.
Связанный: