2017-05-25 5 views
0

私は現在、更新をGoogleスプレッドに配布するために、ユーザーが最後に何かを更新する必要がないように取り組んでいます。これは、私が満たす必要のある仕様と一致しています。 これまでは、シートスクリプトにバインドされたスクリプトごとにアプリケーションスクリプトライブラリと定型コードを使用していました。ライブラリ定義のGoogleスプレッドシート

メニュー・テキストおよび機能もまた中央で更新可能であるカスタム・メニューをシート内に有することが望まれている。これを達成する方法についての私の考えは、メニュー項目とそれに関連する関数をライブラリに従うように定義することでした。

function getMenu() { 
    var menus = [] 
    var obrMenu = {name: 'obrMenu', menuItems: []}; 
    obrMenu['menuItems'].push({name: "Alert", func: "alert('Success')"}); 
    menus.push(obrMenu); 
    return menus; 
} 

次に、コンテナスクリプト内で、次のコマンドを使用して、これを使用してメニューを作成するために使用できるものに変換します。

function onOpen() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var menus = lib.getMenu(); 
    for (var i = 0; i < menus.length; i++) { 
    var cur = menus[i]; 
    var items = cur['menuItems']; 
    var menuItems = []; 
    for (var j = 0; j < items.length; j++) { 
     var curFunc = new Function(
     "return function " + items[j]['name'] + "(){" + items[j]['func'] + "}" 
    )(); 
     menuItems.push({name: items[j]['name'], funcName: curFunc.name}); 
    } 
    ss.addMenu(cur['name'], menuItems); 
    } 
} 

走った。この方法では、サブメニューは、私がmenuItemsと呼ばれているもののためAppsスクリプトの引数名であることで、エラー

Invalid argument: subMenus (line 15, file "Code") 

を生成します。私がこの問題を集めている間は、おそらく生成された関数のスコープにまで及んでいません。どうやってそれを得るのか分かりません。

ご意見をいただければ幸いです。どうもありがとう。

答えて

1

ガスのドキュメントで定義されている代わりに「functionNameを」の「FUNCNAME」を使用して

 menuItems.push({name: items[j]['name'], functionName: curFunc.name}); 

この行を修正し、それを台無しにするものです。どうやら、サブメニューオブジェクトのプロパティ名は変更できません。

+0

ああ、間違いを見つけてくれてありがとう。これにより1つの問題が解決されますが、ライブラリが渡すスクリプトでもスコープの可能性が高い関数を使用することはできません。私は関数定義を渡してそこで評価するためにスクリプト内の私の定型コードをリファクタリングしなければならないと思います。ご協力いただきありがとうございます。 – dbr

関連する問題