質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

1276閲覧

GAS カスタムメニューの選択した項目名の取得

JUN

総合スコア32

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2022/01/19 01:04

GoogleスプレッドシートのGASでuiクラスのカスタムメニューを作成しました。

取引先名、担当者などを1クリックで入力できるようにするためですが、
新規取引先も増えるため、数は不定となっています。
詳しくない者も操作をするため、既に使っているカスタムメニューに追加する形をとりたいと思います。

マスターから数不定の項目名を表示させることまではできましたが、
クリックした項目名を取得するには、どのgetを使えばよいか、検索しても分からず質問させて頂きました。

イメージ説明

クリックした会社名を取得できれば、マスタを検索できると考えています。
ヒントをよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問の内容が、下記のように「複数のメニューに対して同一の関数(clickMenu)を呼び出すようになっており、呼び出し先のclickMenu関数内でどのメニューがクリックされたか判別したい」という意味ならば
残念ながらそのような動作を標準的なGASのカスタムメニューでおこなうことはできません。
https://stackoverflow.com/questions/50946493/how-to-know-which-menu-item-was-clicked

javascript

1function onOpen() { 2 3 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 5 // メニュー項目を定義 6 var supplierA = [ 7 {name : "ユーザー1" , functionName : "clickMenu"}, 8 {name : "ユーザー2" , functionName : "clickMenu"}, 9 {name : "ユーザー3" , functionName : "clickMenu"} 10 ]; 11 12 // メニューに追加 13 spreadsheet.addMenu("サプライヤ あ", supplierA); 14} 15 16function clickMenu() { 17 // クリック時の処理 18 // この中ではどのメニューがクリックされたか判別することはできない。(仕様) 19}

下記のようにevalを使って無理やり動的に関数を作成することはできなくもないですが、呼び出し先の関数の処理の汎用性に欠けるため、質問のようなユースケースには対応できないと思われます。
https://issuetracker.google.com/issues/36753036?pli=1

//get the student data var sData = SpreadsheetApp.getActive().getSheets()[0].getDataRange().getValues(); for(i in sData) { eval("function createQuiz_" + sData[i][0] + "() { createQuiz('" + sData[i][0] + "'); }"); } function onOpen() { var items = []; for(i in sData) { items.push({ name: 'Create Quiz for ' + sData[i][0], functionName: 'createQuiz_' + sData[i][0] }); } spreadsheet.addMenu("MyMenu", items); } function createQuiz(arg) { // }

投稿2022/01/19 02:20

編集2022/01/19 02:33
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JUN

2022/01/19 02:46 編集

詳しい回答ありがとうございました。 まさにqnoirさまの回答通り、複数から同一の関数を呼び出していました。 クリックした文字列(回答の中の文字を使えば「ユーザー1」)を何らかの方法で取得し、検索をすればコードも短く、修正も1回で済むと考えておりました。 別の方法にて考えてみます。 ありがとうございました。
guest

0

自己解決

onOpen
昇順で並び替え
項目名を配列で取得
for文であ行配列の分n回繰り返し
functionname+i
i++
for文でか行配列の分n回繰り返し(以下わ行まで)
functionname+i
i++

functionname+i ×200個
マスタから取得

という、修正する時にはめんどくさそうなコードとなりましたが、思っていたことは完成しました。
できない仕様だというアドバイスですぐに方針を切り替えることができました。
ありがとうございました。

投稿2022/01/20 22:43

JUN

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問