はじめに
表題の件、変数名がわかっているなら、【ライブラリの識別子】.【変数名】
で済む話、と思っていたら落とし穴に嵌まるかもしれません。
今回は他者開発のライブラリを使用したプロジェクト解析が必要な案件で遭遇した内容についての備忘録です。クライアント様から見ても他者開発品のライブラリのため、当然、編集はできないという前提です。
なお、GASにおいて、他者が作成したライブラリ本体を解析したい場合は、拙記事ですが、以下を参考にしていただければ幸いです。
検証
ライブラリ内でグローバル設定されている変数を参照するため、以下のようなライブラリを作成。既存プロジェクトへ LIB
として登録している前提です。
const test01 = 'test01';
let test02 = 'test02';
var test03 = 'test03';
function hoge(){
return 'fuga';
}
グローバル変数を参照しログ出力してみます。また、関数の戻り値も取得してみます。
Logger.log(LIB.test01);
// null
Logger.log(LIB.test02);
// null
Logger.log(LIB.test03);
// test03
Logger.log(LIB.hoge());
// fuga
ライブラリのグローバル変数を参照するには var
による定義が必要ということになります。この件につきましては、公式ガイド、Best practices の3番目にしれっと記載されています。
Only enumerable global properties are visible to library users. This includes function declarations, variables created outside a function with var, and properties explicitly set on the global object.
※原文の一部の文字を太字にしています
余談ですが、関数名の末尾に _
を付加することで、ライブラリ外から直接利用ができなくなります。
// ライブラリ
function hoge_(){
return 'fugafuga';
}
// 参照プロジェクト
Logger.log(LIB.hoge_());
// TypeError: LIB.hoge_ is not a function
最後に
当該の案件につきましては、グローバル変数が const
で定義されていたため参照ができない状態でした。ライブラリを編集できない以上、結果的に参照は諦めました。
ライブラリ作成者とコンタクトが取れるようなら、var
による変数定義への修正リクエストを送るのも一手段と思います。もしくは、いわゆるゲッターセッターを追加して頂く、ということも考えられます。しかし、意図して外部から参照できないようにしているなら、その対応は難しいでしょう。
当該案件の詳細には触れていませんが、本稿執筆に際し、クライアント様には事前に承諾を頂きました。
誰かのお役に立てたなら幸いです。