1
2

More than 3 years have passed since last update.

GASのカスタムメニュー

Posted at

こうしておくと間違いないかな、という備忘
メニューを作成する手段は2通り。
サブメニューを作りたい場合は1−1の方法、
途中で更新する場合は1−2の方法という微妙な仕様。

1.メニュー、2つの追加方法

メニュークラス
メニュークラスには追加系のメソッドしかない

  let menu = SpreadsheetApp.getUI().createMenu('My Menu');
  menu.addItem('Menu Item','myFunc');
  menu.addSeparator();

  let subMenu = SpreadsheetApp.getUI().createMenu('My Sub Menu');
  menu.addSubMenu(subMenu);

  menu.addToUi();

addItemでメニューアイテムの追加、
addSeparatorでセパレータ、
addSubMenuでメニューオブジェクトをサブメニューとして追加できる。
最後にaddToUiでUIに追加。この一連をOnOpenなどでよんであげる

1-1.UIクラスから作成

上記のサンプルソースのように追加する。作る以外は考慮されてないっぽい。

1-2.スプレットシートクラスから作成

Spreadsheetクラスには、
addMenu
removeMenu
updateMenu
があり、なにかのイベントの際に作成、削除、更新が可能。

function createMyMenu()
{
  let menuItem = [];
  menuItem.push({name:'Menu Item',functionName:'MyFunc'});
  menuItem.push(null);
  menuItem.push({name:'Menu Item-2',functionName:'MyFunc2'});
  SpreadsheetApp.getActiveSpreadsheet().addMenu('My Menu',menuItem);

}

function updateMyMenu()
{
  let menuItem = [];
  menuItem.push({name:'Menu Item',functionName:'MyFunc-New'});
  SpreadsheetApp.getActiveSpreadsheet().updateMenu('My Menu',menuItem);
}
function removeMyMenu()
{
  SpreadsheetApp.getActiveSpreadsheet().removeMenu('My Menu');
}

逆にサブメニューはつくれそうにない。

2.呼び出しの関数について

只の関数は可能
クラスのスタティックメソッドは可能
グローバル変数にいれたクラスオブジェクトのメソッドは可能

というわけで、私の使い方としては以下とした。

function onOpen(e)
{
  let menuItem = [];
  menuItem.push({name:'my doSome',functionName :'MyFunc'});
  SpreadsheetApp.getActiveSpreadsheet().addMenu('My Menu',menuItem);
}

function MyFunc()
{
  let myClassObj = new MyClass();
  myClassObj.doSomething();
}

3.現状の対応

私自身はサブメニューより、状況に応じたメニューにしたかったので1−2の実装をすることにした。
スプレットシート以外のクラスには上記メソッドないんだけど、作らないor作れない、のかな?
それぞれ今後調べる機会があれば。

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