🔧
【GAS】スプレッドシートのメニューをJSON形式で指定して一括で追加する方法
はじめに
この記事は、スプレッドシートの作業効率化のために GAS を利用されていて、メニューバーからスクリプトを実行したいッという方向けの記事になります。
標準機能の紹介ではなく、個人的に作成したスクリプトの共有となりますので、実装方法のひとつとして参考になれば幸いです!
実装方法
スプレッドシート起動時にメニューを追加するためのコード
スプレッドシートを開いた時に実行する onOpen 関数の中に今回作成した createMenuItems 関数を追加する事で、メニューの一括追加を実装しています。
function onOpen() {
createMenuItems({
name: 'マクロ',
menu: [
{ name: '1', func: 'hello' },
{ name: '2', func: 'hello' },
{
name: '3',
menu: [
{ name: '3_1', func: 'hello' },
{ name: '---' },
{
name: '3_2',
menu: [
{ name: '3_2_1', func: 'hello' },
{ name: '---' },
{ name: '3_2_2', func: 'hello' },
],
},
{ name: '3_3', func: 'hello' },
],
},
],
});
}
検証用関数
今回は参考記事と同様に仮に呼び出す hello 関数を設定していますが、必要に応じて関数名を変更してご活用下さい!
function hello() {
Browser.msgBox('こんにちは!');
}
今回作成した関数
JSON 構造
基本的には以下の 3 つの連想配列から成り立っています。
メニューを起点に入れ子になるように配置する事で、関数側で判断してメニューにボタンを配置していく仕組みになっています!
メニュー追加用
{
name: 'メニュー名',
menu:[]
}
ボタン追加用
{
name: 'ボタン名',
func: '呼びだす関数'
}
セパレータ用
{
name: '-' or '--' or '---' いずれでもOK
}
関数本体
function createMenuItems(items = {}, parentMenu = null) {
if (items && items.name) {
if (items.name === '-' || items.name === '--' || items.name === '---') {
if (parentMenu) {
parentMenu.addSeparator();
}
} else {
if (items.menu) {
const ui = SpreadsheetApp.getUi();
const menu = ui.createMenu(items.name);
items.menu.map((item) => {
createMenuItems(item, menu);
});
if (parentMenu) {
parentMenu.addSubMenu(menu);
} else {
menu.addToUi();
}
} else if (items.func) {
if (parentMenu) {
parentMenu.addItem(items.name, items.func);
}
}
}
}
}
さいごに
今回紹介した関数を使用することで少しでもみなさんの作業効率に繋がればと思いますのでぜひ使用してみたご感想などをお聞かせ頂けると嬉しいです!
また、リファクタリングや代替方法が御座いましたらご教示頂けますと幸いです。
最後まで拙い文章でしたがお付き合い頂きありがとうございました。
Discussion