gas

Google Apps Script 入門

どうも、gloopsの今川です。

最近、スプレッドシートの拡張にはまっていてGoogle Apps Scriptなるものに触れたので、導入までを投稿したいと思います。

※以下、2016年投稿当時の内容となっています。

はじめに

Google Apps Script は、Googleが提供するサーバーサイド・スクリプト環境です。Googleが提供する一大スクリプト環境を是非使いこなしてください。

基本

 Google Apps(グーグル アップス)とは、99.9% の稼働率が保証された Google の提供するコミュニケーションツールとコラボレーションツールがセットになったグループウェアとしても利用可能な組織向けのオンラインアプリケーションパックです。引用

 また、それらGoogleのサービスをJavaScriptによるスクリプトで操作するためのスクリプト環境がGoogle Apps Scriptです。

  現在では、Googleアカウントを持ち、Googleドキュメントやその他のサービスを利用している者なら誰でも利用できるようになりました。

事前準備

 まずは、Chrome拡張機能に Google Apps Script を入れましょう。これで効率的にGoogle Apps Scriptが作成できます。

 Google Apps ScriptよりCHROMEに追加を行ってください。

これで GoogleDrive より Google Apps Script を新規作成できるようになりました。

 新規作成を行うと以上のような無題のプロジェクト ( Standalone Script プロジェクト) が作られます。

  Google Apps Scriptは、

  • Standalone Script (ドライブ上に単独で存在するもの)
  • Container Bound Script (スプレッドシートに紐づくもの)

  が存在します。スプレッドシートからスクリプトエディタを選択すると自動的にContainer Bound Script プロジェクトが作成されます。また、各種承認(カレンダー等)はプロジェクト単位で必要となります。

1つのプロジェクト内に複数のスクリプトファイルを持つことが可能です。
また、1つのスプレッドシート内に複数のContainer Bound Scriptプロジェクトを持つことも同様に可能です。

 複数のプロジェクトがスプレッドシートに存在する場合、スクリプトエディタ起動時にどのプロジェクトを選択するか促されます。

Hello Google Apps Script

 それでは、GASで最初のプログラムを書いてみましょう。
プログラムを書いたことがある人にはおなじみの "Hello World" を表示してみます。

HelloWorld.gs
function myFunction() {
  Logger.log("Hello World!!");
  Browser.msgBox(Logger.getLog());
}

 Standalone Scriptでは Browser.msgBox()は使うことができません。

Container Bound Scriptで上記のスクリプトを実行するとメッセージボックスに Hello World!! が表示されます。また、Standalone Scriptでも Logger.log() のみ実行し、 Ctrl + Enterを押してログを確認するとHello World!! が表示されます。

Standalone Script と Container Bound Script の違い

 Standalone ScriptContainer Bound Script は前章で述べた通り スプレッドシート (その他サービス)に紐づいているか否かの違いがあります。また、以下のような比較があります。

Container Bound Script Standalone Script
作成方法 各コンテナ(Sheets,Forms,Sites)のメニューから作成 Drive上またはhttps://script.google.com へアクセス
Sitesでリンクから呼び出し Sites上に作成すれば可能 不可能
Spreadsheetでの独自関数 Spreadsheet上に作成すれば可能 不可能
onOpenトリガーの自動登録 可能 不可能
Webアプリケーションとして動作 可能 可能
ソースコードのダウンロード 不可能 可能
ScriptEditor以外での開発 不可能 可能

 基本、独自関数などContainer Bound Scriptでないとできない場合以外はStandalone Scriptにするのが良いと思います。

ライブラリ

 ライブラリは、関数を他のスクリプトで実行可能なプロジェクトです。

A library is a project whose functions can be reused in other scripts.
GAS Reference

 自身のプロジェクトをライブラリ化したり、他の人が作ったライブラリを利用したりすることが可能です。

ライブラリ化

 ライブラリ化するのは簡単です。ライブラリ化を意識して関数を作るのには気を使いますが、手順はそれほど多くありません。

ライブラリの公開方法

  1. たくさん関数やメソッドだけを集めた プロジェクト を用意します。ソレ以外の ルーチン構文 は入れないようにします。
  2. スクリプトエディタの画面で、 「ファイル」⇒「版を管理」 にて を保存します。
  3. スクリプトエディタの画面で、 「ファイル」⇒「プロジェクトのプロパティ」 にて、 Project Keyコピー しておきます。
  4. Project Key を使いたいユーザに教えます。
  5. その ライブラリ が詰まった プロジェクト への パーミッション公開 や、対象のユーザに 閲覧権限 を与えておきます。

 以上でライブラリ化完了です。

  • プロジェクト名 はわかりやすいものに。
  • バージョン毎ライブラリ保持公開 される。
  • 公開 したくない 関数_ をつける。
以上の点を注意して作成しましょう。

ライブラリの参照方法

  1. スクリプトエディタ画面にて、 「リソース」⇒「ライブラリ」 を開きます。
  2. 出てきた画面で、 Project Key を検索ボックスに入れて選択ボタンを押します。
  3. バージョン を選択します。これは保存された版の一覧です。
  4. 識別子をつけます。 識別子 とは、 関数 を利用する時の頭につける文字列です。
  5. 関数 を呼び出す時は、 関数名 を直接書くのではなく、 識別子.関数名 というスタイルで書きます。
  6. 識別子既存のクラス名 などとバッティングした場合、 オーバーライド されてしまうので 注意 です。
  7. オートコンプリートライブラリ内関数 がすべて出てきますので、選んでください。

 Google提供のGAS用ライブラリは以下のサイトで公開されています。
 google apps script samples

ライブラリでClass化と補完

 GASのライブラリは補完が有効になるため、 メソッド 名など。 オートコンプリート で出てきてくれます。しかし、 ライブラリ化クラス化 は、少し相性が良くありません。

 理由は ライブラリ化 した際、 補完メソッド として表示されるのは、 グローバルメソッド のみだからです。

complemented.gs
/**
 * このメソッドはライブラリを利用する方で補完できる
 * @param {string} templateName テンプレートの名称
 * @return {Page} 見つけたテンプレートページ
 */ 
function getTemplateByName(templateName) {
   //処理
}
not_complemented.gs
function HogeClass(fuga) {
  this.fuga = fuga;
}
//このHogeClass.getFugaは補完できない
HogeClass.prototype.getFuga = function() {
  return this.fuga;
};

 そこで、 グローバルメソッドダミー を置くことで、 クラス化補完 を共に行います。

class_complemented.gs
function create(hoge) {
  return new HogeClass(hoge);
}

function set(fuga) {
  throw new Error("このメソッドは直接呼び出せません。createメソッドをコールし取得したインスタンスより呼び出してください。");
}

(function(global) {
  var HogeClass;
  HogeClass = (function() {

    HogeClass.name = 'HogeClass';

    function HogeClass(hoge) {
      this.hoge = hoge;
      if (!(this.hoge != null)) throw new Error("the hoge is required");
    }

    HogeClass.prototype.set = function(fuga) {
      this.fuga = fuga;
    };

    return HogeClass;
  })();
  return global.HogeClass = HogeClass;
})(this);

 これにより、ライブラリの利用側では、Hoge.create('hoge').set('fuga')の全てが補完可能になります。

参考サイト: