亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

僅激活某些工作表時觸發腳本

僅激活某些工作表時觸發腳本

智慧大石 2023-04-27 17:13:21
我有幾張以“代理報告”開頭,后跟名稱的工作表,如下所示:“代理報告 - 約翰”、“代理報告 - 亞當”等。我有一個腳本可以從特定單元格中讀取代理的名稱并從該人的另一個電子表格中檢索數據。我想在激活以“代理報告”開頭的工作表時觸發腳本,以便在工作表之間移動時,為“代理報告”工作表中的每個人更新工作表數據。到目前為止我有這個:function onOpen(e) {  makeMenu();  var ss = SpreadsheetApp.getActiveSpreadsheet();  var sname = ss.getActiveSheet().getName();  if(sname.indexOf("Agent Report")>-1){    master();  }}代理報告不是第一個工作表,因此當我打開電子表格時腳本正確地創建了一個自定義菜單 (makeMenu),但是當我切換到“代理報告”工作表時沒有被觸發(主)。當我從“代理報告”表手動運行腳本時,它運行良好。我的問題是:當我切換到名稱以“Agent Report”開頭的工作表時,我可以創建一個觸發器來運行腳本嗎?onOpen()似乎不適合這個目的。如果這樣的觸發器不可能,是否可以有一個解決方法 - 一個遍歷每張工作表的循環,檢查名稱,如果它包含“代理報告”,則運行腳本。像這樣的東西:function onOpen(e) {  var ss = SpreadsheetApp.getActiveSpreadsheet();  var numberOfSheets = ss.getSheets().length;       for (var i = 0; i<=numberOfSheets; i ++) {    if(SOMETHING HERE.indexOf("Agent Report")[i] > -1){      master();    }  }}
查看完整描述

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();

}

您可以通過多種不同的方式執行此常規功能:

  1. 腳本編輯器

  2. 創建自定義菜單并從電子表格文件中執行

  3. 在電子表格文件中創建一個圖標按鈕

  4. 創建一個時間驅動的觸發器以在特定時間執行


獎金信息:

在這兩種方法中,您都可以替換

if(as.getName().indexOf("Agent?Report")>-1)

if(as.getName().includes("Agent?Report"))

它的作用完全相同,但對眼睛更友好。

查看完整回答
反對 回復 2023-04-27
?
慕萊塢森

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]);

}

查看完整回答
反對 回復 2023-04-27
  • 2 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號