![](/img/trans.png)
[英]Sending an email when meeting certain condition in Google Sheets App Script
[英]Trigger script when only certain sheets are activated
我有幾張以“代理報告”開頭的工作表,后跟名稱,如下所示:“代理報告 - 約翰”、“代理報告 - 亞當”等。我有一個腳本可以從特定單元格讀取代理名稱並從該人的另一個電子表格中檢索數據。 我想在激活以“代理報告”開頭的工作表時觸發腳本,這樣當我在工作表之間移動時,“代理報告”工作表中每個人的工作表數據都會更新。 到目前為止,我有這個:
function onOpen(e) {
makeMenu();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sname = ss.getActiveSheet().getName();
if(sname.indexOf("Agent Report")>-1){
master();
}
}
代理報告不是第一個工作表,所以當我打開電子表格時腳本正確地創建了一個自定義菜單 (makeMenu),但當我切換到“代理報告”工作表時不會被觸發(主)。 當我從“代理報告”表手動運行腳本時,它運行良好。
我的問題是:當我切換到名稱以“代理報告”開頭的工作表時,我可以創建一個觸發器來運行腳本嗎? 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();
}
}
}
根據官方文檔:
當用戶打開他們有權編輯的電子表格、文檔、演示文稿或表單時,
onOpen(e)
觸發器會自動運行。
這種方法的問題在於onOpen
僅在您打開電子表格文件時執行。 因此,即使您在工作表之間切換或執行任何其他操作,腳本也不會執行,除非您再次刷新/打開電子表格文件。 換句話說, onOpen
只會對您第一次打開的工作表執行。
要在不同工作表之間切換時執行代碼,您可以使用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"))
它的作用完全相同,但對眼睛更友好。
正如Iamblichus所指出的,社區已經請求了一個onSheetChange
觸發器函數,並在IssueTracker中進行了報告。 繼續並單擊網頁左上角的星號 (★) 按鈕,以增加將來實施此功能的機會。
最終的解決方案是使用可安裝的觸發器(不是簡單的觸發器,這就是腳本沒有在 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]);
}
感謝@Marios 提供的所有有用提示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.