2017-05-25 101 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); 
    } 
} 

此方法運行時,產生錯誤

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

與子菜單是什麼,我呼籲menuItems Google Apps腳本參數名稱。雖然我收集這個問題可能是由於生成的函數的範圍,我似乎無法看到如何繞過它。

任何建議將不勝感激。非常感謝。

回答

1

修復此行

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

使用「了funcName」,而不是作爲GAS文檔中定義「functionName」是什麼打亂它。顯然,子菜單對象屬性名稱不能更改。

+0

啊,謝謝你發現那個錯誤。雖然這解決了一個問題,但庫傳遞的腳本仍然不能使用可能是範圍事物的函數。我想我必須在腳本中重構我的樣板代碼,以便將函數定義傳遞給它們,然後在那裏進行評估。謝謝你的幫助。 – dbr