2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[GAS] ライブラリの仕様をまとめてみる

Posted at

ライブラリってなに?

ライブラリ(英: library)は、汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたものである。ライブラリと呼ぶときは、それ単体ではプログラムとして動作させることはできない、つまり実行ファイルではない場合がある。ライブラリは他のプログラムに何らかの機能を提供するコードの集まりと言える。
出典: Wikipedia

数学の公式がプログラム(一般的には関数)だとすれば、「三角形の面積」「長方形の面積」「円の面積」のそれぞれを導出する公式(=プログラム)を「面積を求める公式」としてまとめたものがライブラリです。
ライブラリの中にあるプログラム(区別するため「機能」とします)は、それら機能を使う複数のプログラムから使うことを前提に作られています。機能の中身が単純であればその機能自体の価値は薄いですが、複雑になるとその価値は高まります。また、同一ライブラリに存在する複数の機能を同時に使う機会が多いほど、そのライブラリ自体の価値が高まります。
そういった理由から、ライブラリの多くは、場面を問わずに使える(汎用性が高い)プログラムを、共通のジャンルをもっているものや需要の重なっているものどうしでまとめたものとなっています。

GASのライブラリ

GASにもライブラリを実装するメリットがたくさんあり、誰でもライブラリを作れるし、そのIDを知っていれば使えるようになっています。
なお、ライブラリの作り方や導入手順はこの記事では取り上げず、あくまでもライブラリの仕様のみを取り上げます。ご了承ください。
本記事でこれ以降「ライブラリ」と記すものはすべて「GASのライブラリ」、「プロジェクト」は「GASプロジェクト」を指します。

GASライブラリの仕様

公開/公開設定

ライブラリ自体には公開設定がありませんが、プロジェクトファイルがGoogle Driveの中にあるので、ライブラリにアクセスできる範囲はプロジェクトファイルの公開設定に依存します。

バージョン管理

GASプロジェクトには「デプロイ」機能があり、デプロイごとにバージョンが振られます。このバージョン管理はライブラリにも適用されるので、バージョンを指定してライブラリを使用することになります。
また、プロジェクトに対する編集権限を持っているユーザーは、同一のユーザーが作成した別のプロジェクト内で、そのライブラリを「開発モード(HEAD)」として使用できます。別のプロジェクトに更新があるたびに、ライブラリの最新の内容が適用されます。

ほかのライブラリの使用

普通のプロジェクト同様、ライブラリとしてデプロイしているプロジェクトでも、ほかのライブラリを使うことができます。この場合、呼び出し元でもそのライブラリを登録するという必要はありません。

環境変数もどき

GASのプロジェクトは、環境変数に似ているPropertiesServiceを使用することができます。
このPropertiesServiceには数種類のスコープがあり、以下のとおりです。

ライブラリで使用できるのはScriptPropertyUserPropertyです。ドキュメントのアドオンとして使わない限り、DocumentPropertyにはアクセスできません。

細かな仕様

ライブラリに含まれない要素

非常に複雑なので、図にしました。
赤の要素はライブラリに含まれず、緑の要素はライブラリに含まれます。

スコープ

ひとつのプロジェクトに複数のスクリプトファイルが存在する場合でも、グローバルスコープはプロジェクト単位になっています。

その他

呼び出す側でのライブラリのふるまいは、以下のようになります。

  • 呼び出す側のプロジェクト内でライブラリを参照する際に使用する名前を設定できます。
    ここではライブラリ名前空間と呼ぶことにします。
  • ライブラリを登録していると、スクリプトの中に自動的にライブラリ名前空間と同じ名前を持ったオブジェクトがグローバルスコープで変数として代入されます。
    トリッキーなのは、このオブジェクト自体には中身がないことです。これによって、ライブラリが使用しているライブラリを間接的に参照する方法がデフォルトでは存在しないようになっています。

    しかし、ライブラリ側に globalThis (グローバルオブジェクト自身)を返す関数を用意することで、間接的にほかのライブラリを参照できるようになります。また、プライベートな関数もグローバルスコープに属していると参照できてしまいます。
ライブラリ.gs
var myVariable = "val";

function libFunction() {
  return myVariable;
}

function myPrivateFunction_() {
  return "this should be private";
}

function getGlobalThis() {
  return globalThis;
}
呼び出し元.gs
// ライブラリ名: MyLibrary を ライブラリ名前空間 MyLib として登録
function myFunction() {
  console.log(MyLib);
  // {}

  console.log(MyLib.libFunction());
  // "val"

  console.log(MyLib.getGlobalThis());
  /*
  {
    a: "val",
    myPrivateFunction_: [Function: myPrivateFunction_],
    getGlobalThis: [Function: getGlobalThis]
  }
  */

  console.log(MyLib.getGlobalThis().myPrivateFunction_());
  // "this should be private"
}

さいごに

訂正や、追記事項などありましたらコメントにて共有していただけると幸いです。

2
5
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
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?