こうしておくと間違いないかな、という備忘
メニューを作成する手段は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作れない、のかな?
それぞれ今後調べる機会があれば。