LoginSignup
4
0

More than 1 year has passed since last update.

[GAS] ライブラリ内のグローバル変数が参照できない

Last updated at Posted at 2022-11-20

はじめに

表題の件、変数名がわかっているなら、【ライブラリの識別子】.【変数名】 で済む話、と思っていたら落とし穴に嵌まるかもしれません。

今回は他者開発のライブラリを使用したプロジェクト解析が必要な案件で遭遇した内容についての備忘録です。クライアント様から見ても他者開発品のライブラリのため、当然、編集はできないという前提です。

なお、GASにおいて、他者が作成したライブラリ本体を解析したい場合は、拙記事ですが、以下を参考にしていただければ幸いです。

検証

ライブラリ内でグローバル設定されている変数を参照するため、以下のようなライブラリを作成。既存プロジェクトへ LIB として登録している前提です。

liblary.gs
const test01 = 'test01';
let   test02 = 'test02';
var   test03 = 'test03';

function hoge(){
   return 'fuga';
}

グローバル変数を参照しログ出力してみます。また、関数の戻り値も取得してみます。

sample.gs
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.
※原文の一部の文字を太字にしています

余談ですが、関数名の末尾に _ を付加することで、ライブラリ外から直接利用ができなくなります。

sample02.gs
// ライブラリ
function hoge_(){
   return 'fugafuga';
}

// 参照プロジェクト
Logger.log(LIB.hoge_());
// TypeError: LIB.hoge_ is not a function

最後に

当該の案件につきましては、グローバル変数が const で定義されていたため参照ができない状態でした。ライブラリを編集できない以上、結果的に参照は諦めました。

ライブラリ作成者とコンタクトが取れるようなら、var による変数定義への修正リクエストを送るのも一手段と思います。もしくは、いわゆるゲッターセッターを追加して頂く、ということも考えられます。しかし、意図して外部から参照できないようにしているなら、その対応は難しいでしょう。

当該案件の詳細には触れていませんが、本稿執筆に際し、クライアント様には事前に承諾を頂きました。

誰かのお役に立てたなら幸いです。

[参考・引用]

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0