メニューを作りたい

様々なスクリプトを作っていると、メニューから選択させて実行したくなります。そのシートだけの特別なコマンドを実行するメニューの作り方を調べてみました。

旧メニューの追加方法

わりとネット上にたくさん掲載されているよくあるサブメニューを持たない(というか持てない)メニューの作り方です。新旧両方のバージョンのスプレッドシートで利用することが可能です。

function onOpen(e) {
  var ss = SpreadsheetApp.getActive();
  var items = [
    {name: '1番目のメニュー', functionName: 'myFunction1'},
    null, // セパレーター.
    {name: '2番めのメニュー', functionName: 'myFunction2'}
  ];
  ss.addMenu('自分用メニュー', items);
}

addMenuメソッドを使って作成します。Google Developerのそのまんまのコードですが。

addMenuではメニュー名。そして、その中身では1番目2番めとメニューと関数名を割り当てて行きます。区切り線はnullと入れれば、区切り線が入ります。非常にシンプルなのですが、サブメニューの追加ができないので、今後はメジャーな方法ではなくなるでしょう。

複数のメニューを追加

いろいろなサイトを回っても、あまり記載されていませんが、メニューは別に1つと決まってるわけじゃありません。2つでも3つでも作ることが可能です。サブメニューが作れない分、複数個のメニューを用意して、中身を分けて上げれば、今までよりも使いやすくなるのは間違いないです。

function onOpen() {
  var SS = SpreadsheetApp.getActiveSpreadsheet();
  var menu1 = [ {name: "富士山", functionName: "fujiyama"}];
  var menu2 = [{name: "箱根山", functionName: "hakone"}];
  SS.addMenu("メニュー1", menu1);
  SS.addMenu("メニュー2", menu2);
}

こういった形で、2つのメニューが登録出来るはずです。それぞれには1個ずつ、富士山と箱根山というメニューが入っているといった感じです。

新メニューの追加方法

Googleスプレッドシートの新バージョンからは、サブメニューが使えるようになっています。また、メニュー追加用のメソッドは一新されており、よりわかりやすく書けるようになっています。

function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  // Or DocumentApp or FormApp.
  ui.createMenu('自分用メニュー')
      .addItem('銀ちゃん', 'gintoki')
      .addSeparator()
      .addSubMenu(ui.createMenu('2個めのメニュー')
          .addItem('サブちゃん', 'isaburou'))
      .addToUi();
}

これまたGoogle Developerからの丸パクリですが。

Uiを用いたメソッドのようで、旧式のメニュー追加の方法と同居ができます。自分用メニューに2つのメニューと2個めのメニューにはサブメニューが1個入っています。区切り線は.addSeparator()で設定するようになっています。今後はこちらのやり方が主流になっていくでしょうが、Google Apps for Businessでは、最新版にしていない場合使えないです。

また、2個目のメニューを設置したいのだが・・・・という人は、そのまんまもう一個コードを掛けば良いです。下記のようなコードを記述すれば、メニューバーに【普通のメニュー】 【取扱説明書】の2つが出てくるようになります。

function onOpen() {
  var ui = FormApp.getUi();
  ui.createMenu('普通のメニュー▼')
      .addItem('Fromのタイトル設定', 'titlenameman')
・・・・・ 中略 ・・・・・
      .addToUi();
  ui.createMenu('取扱説明書▼')
      .addItem('マニュアル表示', 'helpman')
      .addToUi();   
}