2 回答

TA貢獻1784條經驗 獲得超8個贊
問題:
根據官方文件:
onOpen(e)
當用戶打開他們有權編輯的電子表格、文檔、演示文稿或表單時,觸發器會自動運行。
這種方法的問題是它僅在您打開電子表格文件時onOpen
執行。因此,即使您在工作表之間切換或進行任何其他操作,腳本也不會執行,除非您再次刷新/打開電子表格文件。也就是說,只會對你第一次打開的sheet執行。onOpen
解決方案 1:
要在不同工作表之間切換時執行代碼,您可以使用onSelectionChange(e):
? function onSelectionChange(e) {
? ? makeMenu();
? ? const as = e.source.getActiveSheet();
? ? ? if (as.getName().indexOf("Agent Report")>-1){?
? ? ? ? master();
? ? ? }
? ? }
我不建議您選擇這種方法,因為每次您在腳本中進行選擇更改時,都會執行代碼。
方案二(推薦):
正如您還建議的那樣,為了控制何時要執行腳本,我建議您使用一個常規函數來遍歷所有工作表并檢查工作表名稱是否符合條件。添加也onOpen
執行makeMenu()
:
function allSheets(){
? var ss = SpreadsheetApp.getActiveSpreadsheet();
? var sheets = ss.getSheets();
??
? sheets.forEach(sh=>{? ? ? ? ? ? ? ? ?
? if(sh.getName().indexOf("Agent Report")>-1){
? master();
? }});
}
function onOpen() {
? makeMenu();
}
您可以通過多種不同的方式執行此常規功能:
腳本編輯器
創建自定義菜單并從電子表格文件中執行
在電子表格文件中創建一個圖標按鈕
創建一個時間驅動的觸發器以在特定時間執行
獎金信息:
在這兩種方法中,您都可以替換
if(as.getName().indexOf("Agent?Report")>-1)
和
if(as.getName().includes("Agent?Report"))
它的作用完全相同,但對眼睛更友好。

TA貢獻1810條經驗 獲得超4個贊
最終的解決方案是使用可安裝的觸發器(不是簡單的觸發器,這就是腳本沒有運行 onOpen 的原因)和以下腳本:
function allSheets() {
? makeMenu();
? var ss = SpreadsheetApp.getActiveSpreadsheet();
? var sheets = ss.getSheets();
? sheets.forEach(sh=>{
? ? SpreadsheetApp.setActiveSheet(sh);? ? ?
? ? if (sh.getName().includes("Agent Report")) {
? ? ? master();
? ? }
? })
? SpreadsheetApp.setActiveSheet(sheets[0]);
}
添加回答
舉報