Google Apps Scriptのソースコードの構成管理について

2,801 views
Skip to first unread message

Tsuyoshi KUSAKA

unread,
Jul 18, 2013, 7:06:09 AM7/18/13
to google-app...@googlegroups.com
日下@KyotoGASです。

Google Apps Scriptのソースコードの構成管理についてご教示ください。

Google Driveまかせにするのが一般的でしょうか?
もしくは別途ソースコードの構成管理を行うツールを使って管理されたりしているものでしょうか?
#しっかり調べることができていませんが
 構成管理ツールとの連携はできなさそうですので
 ソースをコピペするなど運用が少し煩雑な感じになりそうですが・・・

そもそもそこまで厳密な管理をするケースが少ない(そういうものにはGASは不向き?)
ようにも感じますが、どのようにされているか情報をいただければ幸いです。

よろしくお願い致します。

Ohashi, Keisuke

unread,
Jul 18, 2013, 7:21:37 AM7/18/13
to google-app...@googlegroups.com

To 日下さん

こんばんは。大橋(soundTricker サントリー)です。
毎回返信すいません。

僕はgithubでやってます。

古いコードはコピペですが、最近コードは
最近追加されたImport/Export Projects を使って、Githubにpushしたら自動で
CoffeeScript compile→テスト(jasmine)→デプロイって感じにしてます。

GAS上で上記のImport/Exportをやるライブラリも公開しているので見てみてください。
https://github.com/soundTricker/ScriptManager

あと上の自動デプロイをやっているのは以下です。
https://script.google.com/d/1kQSwmrTfNRbTpwWLA9wqnCUecy-C9OK4HHEXssWZP140x8zXiIuxo_Ta/edit?usp=drive_web

またnodejs版のモジュールも今作ってるので(ライブラリとしてはある程度できています。)、そっちも見てみてください。
https://github.com/soundTricker/gas-manager

これが出来上がると、色んな所で構成管理(バージョン管理)とかができるようになるはずです。

ただしこのImport/Export ProjectsはDrive上に直接作成したStandaloneなGASでしかできないので、
Sheets上に作ったGASには使えません。

そういうGASについてはしょうがないので、適当な感じ(一応Spreadsheetにまとめてますが)で管理しています。

--
このメールは Google グループのグループ「Google Apps API Japan」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、google-apps-api-...@googlegroups.com にメールを送信します。
このグループに投稿するには、google-app...@googlegroups.com にメールを送信してください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

Tsuyoshi KODAMA

unread,
Jul 18, 2013, 9:31:32 AM7/18/13
to google-app...@googlegroups.com
日下さん、みなさん、

こんばんは。
児玉といいます。
よろしくお願いします。

わたしもDriveに任せず、手元のgitで管理しています。
それとリモートリポジトリをbitbucketへ置いて、自宅でも外出先からでもいじれるようにしています。
(公開する分だけgithubへ)

ただ運用しているのが全部スプレッドシートのため、さんとりーさんのツールが使えず、最後は手でコピペしています。
そのために複数ファイルを最後に1つにマージするとかして少し手を抜いています。

手元管理にしたついでに、google closure compilerをつかって、コードの静的チェックをしっかりやりたいな・・・、と思っています。
(浦島太郎なので必死に勉強中です)

● 背景

在宅15名ほどのチームでお申込み受付け~入金確認~発送、という活動をするのに、データ類を全部スプレッドシートに載せています。
スプレッドシートファイルが6種類、同じファイルが複数存在するので、全部で15ファイルほどになります。
その全部でそれぞれにスクリプトが動いていて、半分位は、時間トリガで動いています。

と、そんな感じなので、手元で管理しないとどのファイルがいつの班なのか、すぐにわからなくなってしまいミスが防げませんでした。


個人的な意見としては:

> そもそもそこまで厳密な管理をするケースが少ない(そういうものにはGASは不向き?)

日下さんの上記のコメントもまさにそのとおり、と思うのですが、GASはちょこちょこっと業務を自動化できるのが強みなので、
それが育ってしまうことは頻繁にあると思うのです。

また、システム規模が小さくても、たとえば勤務表やら経費清算やら、人数分にファイルがコピーされてしまうものもあるはずなので、
きちんと管理するニーズはやはりあるように思います。

今日のニュースでしたか、Google app engineで、gitによる ' push to deploy ' が可能になったっていうのを見かけました。

いずれGASもそうなってくれると良いのですけどね。



児玉



2013/7/18 Ohashi, Keisuke <keisuke...@gmail.com>:
--
児玉 剛
tsuyosh...@gmail.com

Tsuyoshi KUSAKA

unread,
Jul 19, 2013, 5:50:38 AM7/19/13
to google-app...@googlegroups.com
大橋様、児玉様

日下@KyotoGASです。

それぞれ早々にご返信いただき、ありがとうございます。
#大橋様 いつもご返信いただき、ありがとうございます

現時点では

・Google Spreadsheetを扱うためのもの(スタンドアロンのGASではないもの)が多い
 ※中にはGoogle Spreadsheetを扱う必要はないものでも、
  ログ出力させる場所としてGoogle Spreadsheetを使ったりもしています・・・

・ソースを外部公開しないつもりのものが多い

という状況であるため、
手元に構成管理の環境を準備する方向で対応しようかと思います。

ありがとうございました。

Tsuyoshi KODAMA

unread,
Jul 19, 2013, 6:16:46 AM7/19/13
to google-app...@googlegroups.com
日下さん、大橋さん

今日Google+で大橋さんが、CLIでコードをプロジェクトへアップするツールを公開してくれていました。
なので少し考えたのですが、次のことを試してみようと思っています。

1) スプレッドシートで動かしているコードを、スタンドアロンのプロジェクトへ移動して、上記ツールが使える状態にする
2) このプロジェクトをライブラリ化する
3) スプレッドシートに、onOpenやタイマーハンドラなどの関数を用意し、中身はライブラリの呼び出しだけにする

こうすると、複数ファイルで同じコードを動かしている時のバージョンアップも一ヶ所でできることにもなるし、いいかも、と。。
試してみてうまくいったらまたシェアさせてくださいね。


ちなみに、手元での開発をなさってるかたは他にもいらっしゃるでしょうか? > みなさん

Google closure linter と Google closure compiler を使えるようにしつつあるのですが、
compilerの静的チェック機能が強力で、引数の型や個数が違うと警告してくれます。

で、そのためには、呼び出し先関数の引数・型・戻り値の情報ファイルが必要なのですが・・・
残念ながら Google apps関連の情報ファイルはまだありません。
(jQueryやjasmineなど、既につくって公開してくれてるものもありました)

使っている人が多いなら、みんなでわさわさつくってしまったら楽しいかなあ、などと思ったのですが。。
使ってるよー、という方がいらしたら、ぜひ教えてください。

よろしくお願いします。


児玉




2013/7/19 Tsuyoshi KUSAKA <tsuyosh...@gmail.com>:

Ohashi, Keisuke

unread,
Jul 19, 2013, 6:18:37 AM7/19/13
to google-app...@googlegroups.com

まだ公開はしてないですよー(汗
今週から来週ぐらいにはリリースしますー

Tsuyoshi KODAMA

unread,
Jul 19, 2013, 6:31:34 AM7/19/13
to google-app...@googlegroups.com
> まだ公開はしてないですよー(汗
> 今週から来週ぐらいにはリリースしますー

あれ?
ご、ごめんなさい ^ ^;;;;

ライブラリ化して待ってます!


児玉

Ohashi, Keisuke

unread,
Jul 19, 2013, 6:51:32 AM7/19/13
to google-app...@googlegroups.com

ちなみにタイマー(トリガー)のハンドラー関数は
グローバルな箇所で呼び出せばライブラリ側で呼び出し側に登録しても使えるっぽいですよ

Rajah.initみたいな感じで

ただしトリガー登録するときはScriptApp経由になりますが

まだone time トリガーでしか試してないですがなんとなーくいけるかなーと思ってます。

同じような感じでsheetsのカスタム関数もいけるか試したのですがこちらは無理でした

2013/07/19 19:16 "Tsuyoshi KODAMA" <tsuyosh...@gmail.com>:

Tsuyoshi KODAMA

unread,
Jul 19, 2013, 7:11:08 AM7/19/13
to google-app...@googlegroups.com
大橋さん、

あ、そうなんですか。
ライブラリ側のGlobal空間にfunction定義を置いておけば、利用側のGlobal空間になくてよい、という意味ですよね?
知らなかった。。

自前メニューに登録するのもライブラリ側でいけるんだろうか。
もしOKなら、利用側グローバル空間にはプロジェクト固有の関数名を並べなくてよいのでとても嬉しい。。

試してみます、ありがとうございます!


児玉




2013/7/19 Ohashi, Keisuke <k-oh...@bfts.co.jp>:

Ohashi, Keisuke

unread,
Jul 19, 2013, 7:18:39 AM7/19/13
to google-app...@googlegroups.com

いや
そうじゃなくて

//ライブラリ使う側のグローバルなところ
Lib.init(this);

みたいにしておいて、
ライブラリ側で

//Libライブラリ
function init(object){
  object.newFunction = function(){
    //なんか処理
  };
}

ってやるとライブラリ使う側のトリガーとしてnewFunctionが起動できるってことです。
ただし、画面からは登録できなくて、ScriptAppから登録する必要があります。

これを上手く使うと、
パラメータ付きでトリガー起動したり、
色々できそうだなーとか考えてます。
※携帯からなんで簡素な例ですいません

後で例を作っておきますー

Tsuyoshi KODAMA

unread,
Jul 19, 2013, 12:01:14 PM7/19/13
to google-app...@googlegroups.com
理解しました!
ということは、トリガー登録の仕様説明に:

function trigger_handler() {};

で書かないとダメ、とありますが、実際には

ver trigger_handler = function() {};

でもいい、ってことですね。
ただ、スクリプトからでないと登録ができない、と。

いずれにせよライブラリ側のコードでクローズできますね。
スプレッドシート側には、名前を指定されているdoGet, onOpen, onEdit,
doPost,,,,だけを書けばいいことになるので、変更はしなくてよい、と。
管理上とても楽です。

貴重な情報をありがとうございました。


児玉



2013/7/19 Ohashi, Keisuke <k-oh...@bfts.co.jp>:

soundTricker

unread,
Jul 20, 2013, 2:26:50 AM7/20/13
to google-app...@googlegroups.com
ここで話してた、gasのdownload/upload command line toolをリリースしました~



npm install -g gas-manager

とかでnpm経由でグローバルインストールしてもらって、
設定ファイルを作ってもらって(詳細は上のリンクのreadme読んでください)、

gas download --path path/to/source/directory

とかでダウンロード

gas upload

でアップロード出来ます。

次はgrunt-plugin作りまーす、でその後はsublime text2のplugin
eclipseのpluginは悩み中

Tsuyoshi KUSAKA

unread,
Jul 24, 2013, 6:12:08 AM7/24/13
to google-app...@googlegroups.com
児玉様、大橋様

日下@KyotoGASです。

返信が遅くなり、申し訳ございません。
追加情報ありがとうございます。


少し戻りますが、児玉様の書かれていた

> なので少し考えたのですが、次のことを試してみようと思っています。 
> 1) スプレッドシートで動かしているコードを、スタンドアロンのプロジェクトへ移動して、上記ツールが使える状態にする 
> 2) このプロジェクトをライブラリ化する 
> 3) スプレッドシートに、onOpenやタイマーハンドラなどの関数を用意し、中身はライブラリの呼び出しだけにする 
> こうすると、複数ファイルで同じコードを動かしている時のバージョンアップも一ヶ所でできることにもなるし、いいかも、と。。 
> 試してみてうまくいったらまたシェアさせてくださいね。 

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

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


次に大橋様が公開された

> ここで話してた、gasのdownload/upload command line toolをリリースしました~

について質問なのですが、これは

 ソースファイルをどう管理をしているかは関係なく
 所定の場所にあるGASのソースファイルを自動でGoogleDriveアップロードしてくれるもの

という理解で正しいでしょうか?

また

 アップロードしたGASのソースファイルに対して
  ・バージョンを付与する
  ・ウェブアプリケーションとしてデプロイする
 という機能は現状備えてない

という理解で正しいでしょうか?

※たまたま私が扱っているGASは、
 ウェブアプリケーションとして公開するケースが多いので
 そのデプロイまで対応できたらありがたいと思っただけなのですが


ご返信よろしくお願い致します。


Ohashi, Keisuke

unread,
Jul 24, 2013, 6:29:10 AM7/24/13
to google-app...@googlegroups.com

To 日下さん

大橋です。

>  ソースファイルをどう管理をしているかは関係なく
>  所定の場所にあるGASのソースファイルを自動でGoogleDriveアップロードしてくれるもの
>
> という理解で正しいでしょうか?
はい。
合っています。
任意の場所にあるGAS用のソースファイルを、
Drive上に存在するgasプロジェクトへアップロードします

>
> また
>
>  アップロードしたGASのソースファイルに対して
>   ・バージョンを付与する
>   ・ウェブアプリケーションとしてデプロイする
>  という機能は現状備えてない
>
> という理解で正しいでしょうか?

はい。
これもあっています

現状このツールはGASのImport/Export APIを利用しており、
そのAPIがまだそのようなことが出来無いため、現状、直接的には不可能です。

対応されたらすぐにやろうと思ってます

ただ、webアプリケーションとして起動するコードをなるべくLibraryプロジェクトに分けて、
webアプリケーション側から
Libraryプロジェクトをdev modeで読み込めば、
Libraryプロジェクトを更新すれば自動で
webアプリケーションが更新されるという形は可能です。

それに加えて児玉さんとかと話していたような、
トリガーの外部化などのテクニックを使えばかなりライブラリ側にコードを寄せられるはずです。

>
> ※たまたま私が扱っているGASは、
>  ウェブアプリケーションとして公開するケースが多いので
>  そのデプロイまで対応できたらありがたいと思っただけなのですが
>

2013/07/24 19:12 "Tsuyoshi KUSAKA" <tsuyosh...@gmail.com>:

Tsuyoshi KUSAKA

unread,
Jul 25, 2013, 8:05:55 AM7/25/13
to google-app...@googlegroups.com
大橋様

日下@KyotoGASです。

早速ご返信いただき、ありがとうございます。

> ただ、webアプリケーションとして起動するコードをなるべくLibraryプロジェクトに分けて、
> webアプリケーション側から
> Libraryプロジェクトをdev modeで読み込めば、
> Libraryプロジェクトを更新すれば自動で
> webアプリケーションが更新されるという形は可能です。
> それに加えて児玉さんとかと話していたような、
> トリガーの外部化などのテクニックを使えばかなりライブラリ側にコードを寄せられるはずです。

なるほどです。
Webアプリケーションとしてのバージョンがそのままで挙動が変わるのは
少し気持ち悪い感じもしますが、
上記のような形であれば実現は可能ということですね。

まあ、どこまで厳密さを求めるかは内容次第ですので、最適な落としどころを考えてみます。

ありがとうございます。

Reply all
Reply to author
Forward
0 new messages