将Typescript与Google Apps脚本一起使用

时间:2018-02-14 16:26:29

标签: typescript google-apps-script commonjs clasp

我想在我的Google Apps脚本(GAS)项目中使用Typescript,但我找不到将代码编译成GAS接受的内容的方法。

GAS不支持导出,而且Typescript似乎不喜欢通过全局范围访问变量(它需要import / require,因此导出)。

我正在寻找以下任何一种解决方案,我相信这些解决方案会让我的工作变得有用:

1)可以删除所有导入和导出语句及其属性名称的Babel插件等(要求我不使用相同的方法名称,我不这样做。

所以:

import MyLibrary from './library';
export function greetJohn() { MyLibrary.greet('John'); }
export default { greetJohn }

变为:

function greetJohn() { greet('John'); }

2)更改打字稿,以便它可以看到全局范围

3)将所有.ts文件合并到一个.js文件中的Babel插件或类似物,并通过将每个文件视为对象/函数来转换导入/导出语句。

4 个答案:

答案 0 :(得分:3)

背景

自您撰写此问题以来,情况已经发生变化,如今,TypeScript已为AppsScript开发提供了更好的支持。 就像Aliabbas Merchant所说的那样,将TS编译为GAS的最佳方法是使用clasp,它是用于开发AppsScript应用程序的CLI工具。 Clasp在后台使用ts2gas库将TS转换为GAS,因此不再需要Webpack或任何其他捆绑程序将代码转换为AppsScript。

Aliabbas Merchant没有提到的是ts2gas不(还!)支持export语法,这在开发时会导致linter错误,并且不会被IDE很好地接受(即使禁用了linter,IDE也不会识别导入的var,也不会将其视为对导出的引用...)

问题

问题源于以下事实:AppsScript不使用模块系统,并且还可以从其他文件访问定义的每个顶级var(与将“ wrapps”文件作为模块的TS相比)。 当前版本的ts2gas的问题在于它会转换以下语句:

export var x = 5;

进入:

exports.x = 5

因此,在clasp将.ts转换为.gs之后,当.gs的另一个文件尝试访问导出的var时,找不到它。实际上,此var不会像预期的那样存储为全局var,而是存储在exports对象(本身就是全局var)中。如果我们能够以某种方式“欺骗”编译器,那么即使将var也导出,它都将var保留在全局环境中(这样我们就可以毫无错误地使用TS),我们会赢。

解决方案

因此,我们正在寻找解决方法。您可以使用TS文档(https://github.com/google/clasp/blob/master/docs/typescript.md)在扣环中找到一些东西,但是我发现了另一个最简单的技巧:

在本地定义var(不导出它),然后在导出带有所有var(当然也可以是函数)的对象时,我们要导出。 TS的行为就像定期导出vars( 一种用于导出var的语法糖),但编译器会将var保留在全局对象和导出对象内部。

示例

const a = 5;

function b() {
   return 'Hello World';
}

export {
   a,
   b
}

通过这种方式,可以真正导出var,并且可以照常在TS中使用它们,但是在编译为GAS文件后,它们也将保留在全局环境中(编译器实际上会将它们添加到export对象中,但是我们不应该在意)。

答案 1 :(得分:2)

过去几周我一直在研究类似的情况(不使用TypeScript,但仍使用ES6 / ES7)。

我发现的一些事情可能会对您尝试实现的目标有所帮助:

  • GAS webpack plugin允许您通过检测何时分配给全局对象然后生成GAS可以运行的顶级函数来使用webpack在GAS中加载模块。这意味着您的导入和导出都将由webpack处理,因此您不必删除它们。
  • 我无法使用import * as x from y语法工作,import { x } from yimport x from y在使用网络包时工作正常。
  • 您可以使用HTML loader
  • 将HTML包含在捆绑包中

如果您不想使用webpack,一种解决方案是将所有代码放在一个app.ts文件中,创建一个包含所有功能的对象,将功能设置为顶级所以他们可以被GAS接收。您还可以导出容器对象并在测试套件中使用它。使用Babel进行编译时,请使用babel-plugin-transform-remove-export插件删除导出语句。

const app = {
  onInstall: () => { ...
  },
  onOpen: () => { ...
  }
}

const { onOpen, onInstall } = app;

export { app };

答案 2 :(得分:1)

现在可以使用Typescript来开发Google Apps脚本项目,但这不能直接在Apps脚本编辑器上完成。

根据Develop Apps Script using TypeScript,更简单的方法是使用clasp

相关

答案 3 :(得分:1)

使用TypeScript with Google App Script的最佳(推荐)方法是使用clasp

  1. 安装扣环:npm install @google/clasp -g
  2. 登录:clasp login
  3. 创建一个项目:clasp create [scriptTitle]
  4. 可选:将appsscripts.json文件中的时区更改为this list中最合适的时区。
  5. 安装类型:npm i -S @types/google-apps-script
  6. 创建tsconfig.json文件:
    { "compilerOptions": { "lib": [ "esnext" ], "experimentalDecorators": true } }
  7. 在.ts文件中编写代码
  8. 使用clasp push
  9. 推送代码
  10. 刷新您的脚本页面并运行您的函数。

注意:您不需要使用importexport。可以跨文件访问变量。