2 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
問(wèn)題:
根據(jù)官方文件:
onOpen(e)
當(dāng)用戶(hù)打開(kāi)他們有權(quán)編輯的電子表格、文檔、演示文稿或表單時(shí),觸發(fā)器會(huì)自動(dòng)運(yùn)行。
這種方法的問(wèn)題是它僅在您打開(kāi)電子表格文件時(shí)onOpen
執(zhí)行。因此,即使您在工作表之間切換或進(jìn)行任何其他操作,腳本也不會(huì)執(zhí)行,除非您再次刷新/打開(kāi)電子表格文件。也就是說(shuō),只會(huì)對(duì)你第一次打開(kāi)的sheet執(zhí)行。onOpen
解決方案 1:
要在不同工作表之間切換時(shí)執(zhí)行代碼,您可以使用onSelectionChange(e):
? function onSelectionChange(e) {
? ? makeMenu();
? ? const as = e.source.getActiveSheet();
? ? ? if (as.getName().indexOf("Agent Report")>-1){?
? ? ? ? master();
? ? ? }
? ? }
我不建議您選擇這種方法,因?yàn)?strong>每次您在腳本中進(jìn)行選擇更改時(shí),都會(huì)執(zhí)行代碼。
方案二(推薦):
正如您還建議的那樣,為了控制何時(shí)要執(zhí)行腳本,我建議您使用一個(gè)常規(guī)函數(shù)來(lái)遍歷所有工作表并檢查工作表名稱(chēng)是否符合條件。添加也onOpen
執(zhí)行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();
}
您可以通過(guò)多種不同的方式執(zhí)行此常規(guī)功能:
腳本編輯器
創(chuàng)建自定義菜單并從電子表格文件中執(zhí)行
在電子表格文件中創(chuàng)建一個(gè)圖標(biāo)按鈕
創(chuàng)建一個(gè)時(shí)間驅(qū)動(dòng)的觸發(fā)器以在特定時(shí)間執(zhí)行
獎(jiǎng)金信息:
在這兩種方法中,您都可以替換
if(as.getName().indexOf("Agent?Report")>-1)
和
if(as.getName().includes("Agent?Report"))
它的作用完全相同,但對(duì)眼睛更友好。

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
最終的解決方案是使用可安裝的觸發(fā)器(不是簡(jiǎn)單的觸發(fā)器,這就是腳本沒(méi)有運(yùn)行 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]);
}
添加回答
舉報(bào)