GASをkotlinで開発する方法
ちょっと強引な方法ですが動いたのでメモ
動いたと言ってもhelloworldが出ただけなので、その先に落とし穴があるかもしれない...
intellijでkotlinjsのプロジェクトを作成し、コーディングする
build.gradle
kotlin.jsと作成するモジュールのjsが両方出力されるように設定します
下記は若干アレンジしてますが、やってることは公式ドキュメントと同様です
build.gradle
buildscript {
ext.kotlin_version = '1.2.60'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
group 'com.naosim'
version '1.0-SNAPSHOT'
// 出力先設定
// バージョンごとに出力されるようにしてみた
// 通常は "${buildDir}/web" で良い
def webOutputDir = "${buildDir}/web/${version}"
// gasから呼ぶ時の名前、およびjsのファイル名 "${moduleName}.js"
def moduleName = "gaskotlin"
apply plugin: 'kotlin2js'
repositories {
mavenCentral()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
testCompile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version"
}
task assembleWeb(type: Sync) {
configurations.compile.each { File file ->
from(zipTree(file.absolutePath), {
includeEmptyDirs = false
include { fileTreeElement ->
def path = fileTreeElement.path
path.endsWith(".js") && (path.startsWith("META-INF/resources/") ||
!path.startsWith("META-INF/"))
}
})
}
from compileKotlin2Js.destinationDir
into webOutputDir
dependsOn classes
}
compileKotlin2Js {
kotlinOptions.outputFile = "${webOutputDir}/${moduleName}.js"
kotlinOptions.sourceMap = false
}
Main.kt
次にメインのクラス
最終的にrunメソッドを呼び出してログ出力します
ログ出力用メソッドのLogger.log()はkotlin.jsに定義されていないのでexternalで定義してあげます
com.naosim.gaskotlin.Main.kt
package com.naosim.gaskotlin external class Logger { companion object { fun log(text:String) } } fun run() { val message = "Hello JavaScript!" Logger.log(message) }
ビルド
kotlin.jsも出力されるようにします
./gradlew clean assembleWeb compileKotlin2js ./gradlew compileKotlin2js
1発で生成する方法がわからなかった...誰か教えて...
以上で出力ディレクトリにkotlin.jsとgaskotlin.js(今回作ったモジュール)が生成されたはず
GASでコードを読み込む
先ほど生成したjsをGASで読み込みます
読み込むと言ってもコピペするだけだけど...
おまじない
GASの最初にこのおまじないを書きます
var ArrayBuffer = Int8Array = Int16Array = Uint16Array = Int32Array = Float32Array = Float64Array = function(){};
これがこの記事で最も大切なことです
kotlin.jsの中でこれらのクラスが使われてますがGASには存在しないクラスなので強引に捻り潰します
今後悪影響が出るとしたらココでしょうね...
kotlin.jsとgaskotlin.jsをコピペ
次に生成したコードをコピペします
kotlin.jsは3万行超えの巨大ファイルですがそんなこと気にせずコピペします
runメソッドの呼び出し
最後にgaskotlin.js内のrunメソッドを呼び出します
モジュール名 + パッケージ名 + メソッド名の順にドットで繋げて呼びます
function myFunction() { gaskotlin.com.naosim.gaskotlin.run(); }
コード全体
// おまじない var ArrayBuffer = Int8Array = Int16Array = Uint16Array = Int32Array = Float32Array = Float64Array = function(){}; // kotlin.jsのコード 3万行超え // gaskotlin.jsのコード 20行くらい // 呼び出し function myFunction() { gaskotlin.com.naosim.gaskotlin.run(); }
実行
最後にmyFunctionを実行してログ出力を確認
Hello JavaScript!
でたーーー!
まとめ
- GASをkotlinで開発できる (気がする)
- ただしGASで使われてないクラスを捻る必要がある