[GAS] GasLoaderの使い方を教えてください

364 views
Skip to first unread message

takesy8455

unread,
Nov 1, 2012, 9:17:49 AM11/1/12
to google-app...@googlegroups.com
GasLoaderのソースをがばっと貼り付ければ動くとは思うのですが、
そんな使い方でいいのでしょうか?

Ohashi, Keisuke

unread,
Nov 1, 2012, 9:23:24 AM11/1/12
to google-app...@googlegroups.com
To takesy8455 さん

大橋(soundTricker)です。
最近動かしてないので、動くか微妙ですが、基本張り付ければ動くはずです。

takesy8455

unread,
Nov 6, 2012, 1:47:33 AM11/6/12
to google-app...@googlegroups.com
返信有難うございました。

追加で質問で申し訳ないですが、

1)GasLoaderをライブラリ化して使うのは仕様上NGですか?

2)GasLoaderでapp認証の必要なapp scriptを読み込んで使用できますか?

3)Unexpected exception upon serializing continuation エラーとなるのは2)がNGだからでしょうか?

以上、よろしくお願いいたします。
(もし他で質問したほうが良ければ教えてください。)

Ohashi, Keisuke

unread,
Nov 6, 2012, 2:02:07 AM11/6/12
to google-app...@googlegroups.com
To takesy8455さん

大橋です。
2012年11月6日 15:47 takesy8455 <takes...@gmail.com>:
> 1)GasLoaderをライブラリ化して使うのは仕様上NGですか?
大丈夫なはずですよー
ただCache周りとかが共有されるはずなので、
GasLoaderクラスにsetCacheメソッドとか追加したほうがいいかもしれません。

setCache : function(cache) {
this.cache = cache;
}

ただ試してないのでなんともですが....
暇な時に試すか、ライブラリー化しておきます。
※あまり期待しないでください(;・∀・)

>
> 2)GasLoaderでapp認証の必要なapp scriptを読み込んで使用できますか?
>
> 3)Unexpected exception upon serializing continuation エラーとなるのは2)がNGだからでしょうか?
はい、そうです。
できますが、自前で認可が必要なサービス群をプロジェクト内のどこかで呼ぶ必要があります。

自分がやる場合は、以下の様なメソッドを作っておいてあります。
------------
function forAuthorization() {
//誤って呼び出してもわからるように直ぐエラーにしておく
throw new Error("this method is for authorization, should not be
call from another method");


//認証が必要なServiceを適当に呼び出し
GmailApp.createLabel("");
GmailApp.search("hoge");
SpreadsheetApp.getActive();
.....................
}
------------
こうすれば他のメソッドを一度コールすれば認可が聞かれるはずです。

もしわからなければまた聞いてくださいー

Ohashi, Keisuke

unread,
Nov 15, 2012, 3:25:48 AM11/15/12
to google-app...@googlegroups.com
To takesy8455さん

大橋(soundTricker)です。GasLoaderの追加情報です。
GasLoaderのライブラリー化についてですが色々試した所
現状と同じ仕様だと無理っぽいです。申し訳ないです....


理由はScriptのロード先がScriptを実行しているオブジェクト(this)で無くGasLoaderの方にロードされてしまうようです。

例えばhttp://example.com/foo.jsからfooというメソッドをロードしようとした場合

[通常の場合]※GasLoaderのコードをプロジェクトに貼り付けた場合
--------------
Logger.log(foo); //undefined
GasLoader.require("http://example.com/foo.js);
Logger.log(foo); //読み込める
--------------
というふうになりますが、
[Library化した場合]
--------------
Logger.log(foo); //undefined
Library.GasLoader.require("http://example.com/foo.js);
Logger.log(foo); //undefined
Logger.log(Library.foo); //Libraryのオブジェクトにfooがロードされる
--------------

というふうになります...

一応ライブラリー化したバージョンのGasLoaderは以下です。
Project key :MwSeB7fxfkV_S1eiq2-BCwAV62A3znfOO
JsDoc URL : https://script.google.com/macros/library/d/MwSeB7fxfkV_S1eiq2-BCwAV62A3znfOO/15
ソース : https://script.google.com/d/12gx8AawiExZvmYvhNHNz5RBfGpFbIva2zqatdDIhcmXj3y4wMZmz-lEI/edit

微妙にバージョンアップしてて使う場合は以下の様な感じになります。
※ライブラリー用にタイプセーフにしたり、Cacheを設定できるようにしたり、メソッドチェーン出来るようにした。
----------------
GasLoader
.setMyCache(CacheService.getPublicCache()) //キャッシュを設定
.setLogLevel(GasLoader.LOG_LEVEL_DEBUG()) // ログレベルを設定
.requireFromDocs("0BwzWIlBMCiR9YjdlMzcwMmUtNzdiYi00YmQwLWJhZjItOGFjYzFjODNjYzEx")
//Loading GaSmarty , Driveからロード
.require("https://raw.github.com/soundTricker/SpreadsheetDB-For-Google_Apps_Script/master/src/spreadsheetService.js");//Loading
SpreadsheetService urlでロード

Logger.log(GasLoader.GaSmarty.compile("{$test}")({test : "test"}));
Logger.log(GasLoader.SpreadsheetService);
----------------

takesy8455

unread,
Nov 15, 2012, 11:31:15 PM11/15/12
to google-app...@googlegroups.com
追記有難うございます。

あんまりよろしくないやり方かもしれませんが、以下のようにwithでくくって使ってました。
新しいライブラリ使ってみます。

function ScriptExecutor() {
  with(Lib){
    GasLoader.removeCache("0B961KPjnibE4dm44dHYzRmdKZ0U"); /* toPlainText.js */
    GasLoader.requireFromDocs("0B961KPjnibE4dm44dHYzRmdKZ0U", 0);
    GasLoader.removeCache("0B961KPjnibE4aGxFa2F2Vjl6ZzQ"); /* SearchGmail.js */
    GasLoader.requireFromDocs("0B961KPjnibE4aGxFa2F2Vjl6ZzQ", 0);
    Logger.clear();
    Logger.log("\nScriptExecutor");
    searchGmail();
  }
}

Ohashi, Keisuke

unread,
Nov 16, 2012, 12:34:01 AM11/16/12
to google-app...@googlegroups.com
了解です☆
またなにかアレば言って下さい!
Message has been deleted

Ohashi, Keisuke

unread,
Nov 21, 2012, 12:27:54 AM11/21/12
to google-app...@googlegroups.com
To 山崎さん

大橋です。
返信遅れましたすいません。

どのあたりで処理が止まってますか??
requireのところですか??
それともGasLoader.searchGmail()のところですか??



takesy8455

unread,
Nov 21, 2012, 12:48:12 AM11/21/12
to google-app...@googlegroups.com
大橋さん、ごめんなさい自己解決したのでwebではメッセージ削除したのですが、
そうですよね、メールは飛んでますもんね。失礼しました。
凡ミスでDocList.findで'title:'付けてなかったので、
自分自身を見つけて、再帰読み込みしてしまっていたようです。
本当に失礼しました。
現在のところ以下のようにしています。

function Executor() {
  var toPlainTextkey = DocsList.find('title:toPlainText.js')[0].getId();
  var SearchGmailkey = DocsList.find('title:SearchGmail.js')[0].getId();
  Logger.log(Utilities.jsonStringify(this).match(/function ([a-zA-Z]*)/g));
  GasLoader 
    .setMyCache(CacheService.getPrivateCache())
    .setLogLevel(GasLoader.LOG_LEVEL_ERROR())
    .removeCache(toPlainTextkey)
    .removeCache(SearchGmailkey)
    .requireFromDocs(toPlainTextkey)
    .requireFromDocs(SearchGmailkey)
    .searchGmail();
}

Ohashi, Keisuke

unread,
Nov 21, 2012, 12:54:43 AM11/21/12
to google-app...@googlegroups.com
あ!なるほど!逆にすいません...

あと前のバージョンだとバグってたのですが
setMyCacheを呼ばないでGasLoaderを呼び出すか、
setDefaultCacheSecondに0を渡すか、
requireFromDocsかrequireの第二引数に0を渡せばキャッシュしない設定になりますー
(removeCacheが不要になる)









2012年11月21日 14:48 takesy8455 <takes...@gmail.com>:

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



--
/**
* 株式会社 BFT 改善推進室
* 大橋 啓介 <oohashi keisuke>
* k-oh...@bfts.co.jp
*
* 〒100-0005
*  東京都千代田区丸の内1-6-5
*  丸の内北口ビルディング22階
* tel 03-6810-0091
* fax 03-3213-6655
*
* HP http://www.bfts.co.jp/
* G+ http://goo.gl/ovFWu
* github http://goo.gl/5K0BZ
* google code http://goo.gl/wU6XM
**/
Reply all
Reply to author
Forward
0 new messages