【Google Apps Script】自分用メニューをスプレッドシートに追加する

この記事ではGoogle Apps Script(GAS)で独自のメニューを追加する方法を解説します。

初心者の方にも分かるように丁寧に解説していきますので、必要に応じて読み飛ばして頂ければと思います。

onOpen関数などを使いこなすことで、自作の関数をツール化することができます。スプレッドシートを利用する他のユーザーとも共有できるのですごく便利ですよ。

GASで自分用メニューを追加するための「道具」

この章では、独自メニューを追加するために利用する関数の使い方を細かく説明していきます。サンプルだけ見たい!という方は次の章に進んでOKです。

トリガーを使いこなす

GASではあらかじめその役割が決められてる関数がいくつかあります。この関数のことをここでは「予約関数」と呼ぶことにします。

予約関数一覧
  • onOpen(e) <= 今回は使うのはこれ!
  • onEdit(e)
  • onInstall(e)
  • doGet(e)
  • doPost(e)

他の予約関数の使い方も気になる!という方は以下にリンクを貼っておきましたので見てみると良いかと思います(英語です)。

参考 トリガーについてGoogleディベロッパー

この予約関数を利用すれば、「スプレッドシートを開いた時に実行する」という挙動が実現できます。この挙動は、トリガーを使うと言い換えてもいいでしょう。

trigger.gs

function onOpen(e) {
  /**
   * ここに書いた処理がスプレッドシートを開いた時に自動実行される
   * Google DocumentやGoogle Slideなどでも使用可能
   */
}

補足ですが、以下のトリガーの性質に注意して下さい。

  • スプレッドシートなど、Googleアプリに関連付けられたスクリプトファイル内でないと使えない
  • 権限が無い関数は実行できない

上の様な状況になって詰まることもあるかと思います。ちなみに引数のeは、onEdit(e)などでは活躍しますがonOpen(e)で利用されることはあまりありません。

メニューを追加する関数

トリガーを使えば、スプレッドシートを開いた時に実行する処理を指定することができるということが分かりました。

ここからはトリガーと共によく使われる処理の中身、メニューを追加する関数を解説していきます。下記はonOpen関数にメニューを追加する関数を入れたコード例です。

trigger.gs
function onOpen(e) {
  SpreadsheetApp.getUi()     // 紐づいたシートからUiを取ってくる
      .createMenu('My menu') // Uiにメニューバーを追加
      .addItem('First item', 'menuItem') // 関数menuItem1をFirst itemとしてメニューバーに追加
      .addToUi();               // 変更したメニューを保存する
}

短いのでそこまで説明が要らないかもしれませんが、初心者の方も理解できる様に丁寧にいきますね。

大まかな流れは以下の様になります。

  1. SpreadsheetApp.getUi()で、スクリプトに紐つくアプリからUiオブジェクトを取得
  2. .createMenuでUiオブジェクトにメニューバーを追加
  3. .addItemでメニューバーに関数を追加
  4. .addToUi();でUiオブジェクトを更新

SpreadsheetAppから全ての処理が連続して進んでいます。これがいわゆるメソッドチェーンというやつで、セミコロンが出てくるaddToUiまで続きます。この流れを図にしてみました。イメージで捉えた方がしっくりくるかもしれません。

ここにはメニュー用の関数が書かれていませんが、当然これも必要になります。以上を踏まえた上で、次章ではサンプルコードを見ていきましょう。

GoogleAppsScriptでメニューを追加するサンプルコード

以下が、冒頭のGIF画像でも示したサンプルコードです。アクティブセルに今日の日付を打ち込みます。シンプルですね。

add-menu.gs
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createMenu('My menu')
      .addItem('First item', 'menuItem')
      .addToUi();
}

function menuItem() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet       = spreadsheet.getActiveSheet();
  var cell        = sheet.getActiveCell();
  
  cell.setValue(new Date());
}

まとめ

今回はトリガーを用いてスプレッドシートに独自メニューを追加する方法を紹介しました。これができるようになると、シートを共有する人に便利なツールを提供できるので、すごいねと言われること間違いなしです笑

何か分からない部分や、「こういう機能を実現したい!」という要望があれば個別に回答する or 記事にしますのでお気軽にお問い合わせからメッセージ下さい!

コメントを残す

メールアドレスが公開されることはありません。