初心者でもわかる!GASのスタンドアロンとコンテナバインドの違いと使い分け

うわっ、GASでスプレッドシートを操作したいのに「getActiveSpreadsheet()」がエラーに…!
猫男
猫男
catman
catman
ふふふ、またまたcatmanの出番ってわけだな。
えっ、あなたは……! なんで動かないのか、教えてくださいっ!!
猫男
猫男

GASのスタンドアロンとコンテナバインドの違い

それはね、「スタンドアロン」と「コンテナバインド」という2つのGASの種類を理解していないからだよ。

GASには2つの書き方があるんだ。

  • スタンドアロンスクリプト:どのファイルにもひもづいていない独立したスクリプト
  • コンテナバインド型スクリプト:スプレッドシートやスライドなどに紐づいているスクリプト

 

gas スタンドアロン コンテナバインド

例えばこのコード ↓


function addRow() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(['こんにちは', 'GASから書き込みました']);
}

このコードは、「コンテナバインド型」じゃないと動かない。

 

えっ、なんで!?GASなんだからどこで動かしてもいいんじゃ…?
猫男
猫男
catman
catman
いやいや、getActiveSpreadsheet()は「今開いているスプレッドシート」にアクセスしようとしているぞ。

 

だから、スクリプト自身が「今開いているスプレッドシート」を認識できないといけない。

ゆえ、

  • スプレッドシート上の 「拡張機能 → Apps Script」から開いたスクリプトなら動く
  • script.google.com から作ったスタンドアロン型だと動かない

となるんだ。

 

GASのスタンドアロンとコンテナバインドの違いを表で確認しておこう。

種類 特徴 向いていること
スタンドアロン どのファイルにも紐づかない 複数ファイルを一括処理、定時実行、自動化
コンテナバインド スプレッドシート・ドキュメントとセット ボタンから起動、カスタムメニュー、UI連携

GASのスタンドアロンとコンテナバインドの使い分け方法

問題は、GASのスタンドアロンとコンテナバインドの使い分けだよな。

「どっちを使えばいいの?」となったら、、以下のチャートでチェック!

gas スタンドアロン コンテナバインド

それじゃあ早速実践だ。GASのスタンドアロンとコンテナバインドを使い分けてみよう。

スタンドアロンの例:新規スプレッドシート作成


function createSheet() {
  var sheet = SpreadsheetApp.create('新しいシート');
  sheet.getActiveSheet().appendRow(['Hello', 'World']);
}

→ script.google.com から新しいプロジェクトを作成して実行する

コンテナバインドの例:開いているシートに書き込む


function writeToCurrentSheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(['今のシートに書き込んだよ']);
}

→ スプレッドシートを開いて、「拡張機能 → Apps Script」から貼り付けて実行

 

なるほど…だからうまく動かなかったんですね!ありがとうcatman!
猫男
猫男
catman
catman
ふふっ、それがGASの罠さ。でも仕組みがわかれば怖くない!君もスクリプトマスターになれるよ。

まとめ

  • GASには「スタンドアロン」と「コンテナバインド」の2種類がある
  • getActiveSpreadsheet()などは「コンテナバインド型」でしか動かない
  • 処理内容によって適切に使い分けることが大事!

 

【練習問題】GASのスクリプト種類を理解しよう!

ここでは、実際にスタンドアロンとコンテナバインドの違いを理解するための問題を出します。

問題1:スプレッドシートを新規作成する関数

次の関数はどちらのスクリプト形式で実行するのが正しいでしょうか?


function makeNewSheet() {
  var sheet = SpreadsheetApp.create('新しいファイル');
  sheet.getActiveSheet().appendRow(['Hello!']);
}

選択肢:

  • A:スタンドアロン
  • B:コンテナバインド

問題2:現在開いているスプレッドシートに書き込む関数


function writeRow() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(['こんにちは']);
}

選択肢:

  • A:スタンドアロン
  • B:コンテナバインド

問題3:エラーになるのはどっち?

次のコードを「スタンドアロンスクリプト」で実行したとき、エラーになるのはどれ?


// A
function alpha() {
  var sheet = SpreadsheetApp.create('スタンドアロンOK');
  sheet.getActiveSheet().appendRow(['test']);
}

// B
function beta() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(['test']);
}

選択肢:

  • A:alpha関数がエラー
  • B:beta関数がエラー

 

 

 

【解答・解説編】

問題1の解答:A(スタンドアロン)


function makeNewSheet() {
  var sheet = SpreadsheetApp.create('新しいファイル');
  sheet.getActiveSheet().appendRow(['Hello!']);
}

SpreadsheetApp.create() は新しいスプレッドシートを作成する命令です。既存のファイルに依存しないため、スタンドアロンで使います。

問題2の解答:B(コンテナバインド)


function writeRow() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(['こんにちは']);
}

この関数は「今開いているスプレッドシート」が前提です。スタンドアロンでは「アクティブなスプレッドシート」が存在しないため、エラーになります。

問題3の解答:B(beta関数がエラー)

alpha関数は新規作成なのでどこでもOKですが、getActiveSpreadsheet() を使うbeta関数は「今開いてるスプレッドシート」がないと動かず、スタンドアロンではエラーになります。

なるほど〜!コンテナバインドとスタンドアロン、ちゃんと使い分けないとエラーになるのね!
猫男
猫男
catman
catman
ふふっ、まさにそこがGASのキモだ。次は「カスタムメニュー」も試してみようぜ!