Импортирование moment.js в скрипте приложения - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть необходимость использовать moment.js внутри локально разработанного проекта Apps Script, который использует google \ clasp для преобразования из TypeScript.

Я уже пытался добавить библиотеку jsвнутри проекта, как при обычной записи в .gs, но использование clasp, похоже, не позволяет мне использовать этот способ.

Я уже пробовал, так как много читал в других ответах на переполнение стека,использовать eval вот так без успеха:

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

Во всех случаях, после того как я нажал на «Сценарий приложений» и запустил функцию в редакторе сценариев приложений, я получил

ReferenceError: «момент» не определен.(строка 6, файл «Тест»)

Мой файл TS: enter image description here

1 Ответ

0 голосов
/ 22 февраля 2019

Можно использовать внешние библиотеки, такие как 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.

Связанный:

...