Google Scripts 可讓您創建自定義選單。例如:
function makeMenu(){
var ui = SpreadsheetApp.getUi();
ui.createMenu("Scripts")
.addItem("My Script","myScript")
.addToUi();
如果您只有一個要撰寫腳本的檔案,這將非常有用。
但是,假設您有 50 個檔案,您希望它們都具有運行相同功能的相同選單。
您可以通過將它們放入庫中并讓這 50 個檔案參考庫版本 HEAD 來輕松更新函式本身:
function myScript(){
MyLibrary.myScript();
}
現在,如果您想更新 myScript() 函式,您只需在您的庫中更新它,然后更改就會傳播。
但是,我有兩個問題:
- 我可以看到向所有 50 個檔案添加新選單功能的唯一方法是手動進入每個檔案并添加:
function myNewScript(){
MyLibrary.myNewScript();
}
有沒有辦法一次更新它們?
注意:雖然您可以“庫”出“makeMenu”函式,然后各個腳本將擁有新的選單項,但在使用選單函式時它們會出錯,因為選單函式只會在該函式存在時呼叫該函式在檔案本身(而不是庫)中。
- 我可以看到對庫使用版本控制的唯一方法(這樣用戶可以在開發人員使用 HEAD 版本時獲得穩定版本)再次手動檢查所有 50 個檔案并更新庫版本。
有沒有辦法使用版本控制而不必進入每個檔案并手動更新它使用的庫版本?
我確實找到了這個關于動態更新選單的接近但不完全的答案;但是,據我所知,它只能在單個腳本中作業,并且不適用于庫(請參閱上面#1 的注釋): 添加新功能時更新應用程式腳本可執行功能選單
uj5u.com熱心網友回復:
- 從庫本身創建選單
- 使用包含腳本呼叫庫中的函式
libraryIdentifier.libraryFunction
庫檔案.gs:
function mkMenu(libraryIdentifier="MyLibrary"){
SpreadsheetApp.getActive()
.addMenu('ClickMe!',[{name:'alert!',functionName:`${libraryIdentifier}.alertLib`}])
}
function alertLib() {
SpreadsheetApp.getUi().alert('Library function running!');
}
包括script.gs:
function onOpen(){
//You need to pass a specific library identifier, if it is different from `MyLibrary`
MyLibrary.mkMenu();
};
- 或者,使用 google-apps-script-api修改多個檔案的腳本,也可以用于修改現有的庫版本
dependencies:{version:versionNumber,userSymbol:libraryIdentifier}中appsscript.json
uj5u.com熱心網友回復:
實際上,我根據 TheMaster 的回答找到了一種更簡單的方法(謝謝!)。
我沒想過簡單地將庫參考Menu.addItem作為函式名稱的一部分傳遞。
所以在圖書館里你有這樣的東西:
function makeMenu(){
var ui = SpreadsheetApp.getUi();
ui.createMenu("Scripts")
.addItem("My New Script","Library.myNewScript")
.addToUi();
}
function myNewScript(){
SpreadsheetApp.getUi().alert("Hello world!");
}
在參考庫的檔案中,您只需要:
function onOpen(){
Library.makeMenu();
}
這消除了function myNewScript在檔案腳本中列出的需要。
也許 TheMaster 的回答有一些使它更加模塊化,我不理解,但根據我目前的理解,我剛剛描述的是實作我想要的最簡單的方法。
再次感謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344736.html
