Spreadsheetアプリの外部ライブラリ化について ( was Re: Google Apps Scriptのソースコードの構成管理について)

980 views
Skip to first unread message

Tsuyoshi KODAMA

unread,
Aug 9, 2013, 9:55:56 AM8/9/13
to google-app...@googlegroups.com
日下さん、みなさん、

児玉です、こんばんは。
暑い日が続きますね・・。

> 試された結果のシェアをぜひお願い致します。

少し間があいてしまいましたが、途中報告です。

> 私の手元でスプレッドシートを開発用と本番用とに分けるなどにしていて、
> 修正時の本番反映が煩雑になっているので
> コードをライブラリとして集約できるのはありがたいですね。

報告の前に・・・上記、いいですね。

開発用のファイルからはデベロッパーモードをONにして取り込んで、
本番用ではOFFにしておくとよいなあ、と思いました。

開発版でデバッグして、大丈夫だとわかったらライブラリ(アプリ)側にバージョンを付与して
本番用のほうでバージョンをアップする、という手順でいけば結構きっちり運用できそうです。
(本番用でなにかあってもすぐ元に戻せますしね!)
さっそく使わせてもらっています。

【報告】 スプレッドシートアプリのライブラリ化

● 背景

GASのコードを手元で開発する時に closure compilerを使いたい、というのは前にもここで書いたような気がしますが、その
closure-compiler に食わせる GAS APIの定義ファイルをつくりました。

GASのAPI情報を、Googleの公式リファレンスページを読み込んで取得して、Closure
compilerが理解できる形式に吐き出す、というツールを使っています。

そのツールを、(もちろん ^ ^)GASでつくりました。
これがスプレッドシート上に記録を残しつつ動作するので、先の手法を試してみました。

ツールとextern fileは以下にあります。
https://github.com/tyskdm/gas.ext.js

READMEに、コードを組み込んだスプレッドシートへのリンクも貼ってあります。
読み込みのみの権限で公開してありますので、ローカルに保存してもらえば実行もできると思います。

* こんなに大げさなツールになると思わずに手をつけたので、コードが汚いのはどうぞご容赦ください・・・。

● 方法

スプレッドシート側には、以下のコードだけがあります。

------------------
/**
* @fileoverview Spreadsheet side GAS program.
*/

var MyApp = this[ 'getExternFile' ];

if (MyApp.init) {
MyApp.init(this); // thisは、スプレッドシート側スクリプトのGlobal object
}

function onOpen() {
return (MyApp.onOpen ? MyApp.onOpen() : undefined);
}

function onEdit() {
return (MyApp.onEdit ? MyApp.onEdit() : undefined);
}

function doGet(e) {
return (MyApp.doGet ? MyApp.doGet(e) : undefined);
}

function doPost(e) {
return (MyApp.doPost ? MyApp.doPost(e) : undefined);
}

function func0001() {}
function func0002() {}
function func0003() {}
function func0004() {}
function func0005() {}
function func0006() {}
function func0007() {}
function func0008() {}
function func0009() {}
function func0010() {}
------------------

そして、ライブラリ(アプリ)側には

-------------------
var GLOBAL_OBJECT;

function init(global) {
GLOBAL_OBJECT = global;

GLOBAL_OBJECT.func0001 = getClassList;
GLOBAL_OBJECT.func0002 = getClassInfo;
GLOBAL_OBJECT.func0003 = exportExternfile;
}

function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet(),
menuEntries = [
{name: 'get Class List', functionName: 'func0001'},
{name: 'get Class Info', functionName: 'func0002'},
{name: 'export extern.js', functionName: 'func0003'}
];

ss.addMenu('GAS-API', menuEntries);
}
-------------------

と記述して、スプレッドシート側へ、必要な関数を公開しています。

ポイントは、スプレッドシート側のコードを、アプリの内容によって変更せず、いつも同じものでよいようにしたことです。
(ライブラリ名だけは書き換えないとダメですが・・)

● 結果

うまくいきました。
問題なく動作しています。

● 課題

ひとつだけ面倒なのは、メニューから起動する getClassList() などのライブラリ側スクリプトを、デバッグモードで実行する方法がないことです。

スプレッドシート側にはエントリーポイントがないので起動できず、ライブラリ側単独で起動してしまうと、デバッグ実行はできますが、ActiveSpreadsheet
が特定できないのでデバッグになりません。

しかたないので、このときだけは、スプレッドシートのスクリプトに

// ----- for debug ------
function getClassInfo() {
MyApp.getClassInfo();
}
// ----------------------

こんなコードを足して、スプレッドシート側から起動するようにしました。
MyApp、の行でブレークして、ステップインすると、ライブラリ側のコードも見ることができるのでデバッグは可能になります(アプリコードをひとつのファイルにまとめておかないと面倒なことになりますが・・)。

今度は、複数のスプレッドシートが連携して機能するプログラムに適用しているところです。

またなにかわかったら、シェアさせてもらいますね。


それでは。


児玉



元のメールの関連部分:
> 少し戻りますが、児玉様の書かれていた
>
>> なので少し考えたのですが、次のことを試してみようと思っています。
>>
>> 1) スプレッドシートで動かしているコードを、スタンドアロンのプロジェクトへ移動して、上記ツールが使える状態にする
>> 2) このプロジェクトをライブラリ化する
>> 3) スプレッドシートに、onOpenやタイマーハンドラなどの関数を用意し、中身はライブラリの呼び出しだけにする
>>
>> こうすると、複数ファイルで同じコードを動かしている時のバージョンアップも一ヶ所でできることにもなるし、いいかも、と。。
>> 試してみてうまくいったらまたシェアさせてくださいね。
>
> について考えてみたのですが、
> 私の手元でスプレッドシートを開発用と本番用とに分けるなどにしていて、
> 修正時の本番反映が煩雑になっているので
> コードをライブラリとして集約できるのはありがたいですね。
>
> 試された結果のシェアをぜひお願い致します。


--
児玉 剛
tsuyosh...@gmail.com

Tsuyoshi KUSAKA

unread,
Aug 16, 2013, 5:52:48 AM8/16/13
to google-app...@googlegroups.com
児玉様

日下@KyotoGASです。

#返信が遅くなり、申し訳ありません。

シェアありがとうございます。

GASでのclosure-compilerの利用は考えていなかったのですが、ケースによっては考慮するのがよさそうですね。
参考にさせていただきます。

また進展されましたらシェアをお願いします。

Reply all
Reply to author
Forward
0 new messages