2012-12-29 27 views
0

這應該是簡單的,但我卡在這個腳本... 它有一個功能(createnewsheet),其手動運行在一個時間觸發,所以我不得不選擇openById()到訪問電子表格,但當我查看錶格並手動運行該功能時,我想將新創建的表格設置爲活動狀態,這就是我造成的麻煩。電子表格腳本觸發運行和手動

當我從腳本編輯器運行函數(createnewsheet)時,一切都很好,但是當我從電子表格菜單中調用它時,出現以下錯誤消息:Specified sheet must be part of the spreadsheet,因爲最後一行代碼。 AFAIK我不是在我的電子表格之外尋找一張表... 任何想法我在這方面做錯了什麼?

下面是一個簡單的代碼,顯示問題,一個shared copy is available here

var ss = SpreadsheetApp.openById('0AnqSFd3iikE3dGVtYk5hWUZVUFNZMzAteE9DOUZwaVE'); 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var sh = ss.getSheetByName('master') 
    var logsheet = ss.getSheetByName('logger') 
    var FUS1=new Date().toString().substr(25,6)+":00"; 

function onOpen() { 
    var menuEntries = [ {name: "Manual test", functionName: "createnewsheet"}, 
         ]; 
    sheet.addMenu("Utilities",menuEntries); 
    SpreadsheetApp.setActiveSheet(logsheet);// this is working fine 
    } 

function createnewsheet(){ 

    var sheetName = "Control on "+ Utilities.formatDate(new Date(), FUS1, "MMM-dd-yy") 
     try{ 
    var newsheet = ss.insertSheet(sheetName,2);// creates the new sheet in 3rd position 
     }catch(error){ 
     FUS1=new Date().toString().substr(25,6)+":00"; 
     var newsheet = ss.insertSheet(sheetName+' - '+Utilities.formatDate(new Date(), FUS1, "HH:mm:ss"),2);// creates the new sheet with a different name if already there 
     } 
    newsheet.getRange(1,1).setValue(sheetName); 
    SpreadsheetApp.setActiveSheet(ss.getSheets()[2]);// should make 3 rd sheet active but works only when run from script editor 
// SpreadsheetApp.setActiveSheet(newsheet);// should have same result but works only when run from script editor 
} 

回答

1

我找到了一個切實可行的解決辦法,以解決我的使用案例:我用不同的功能從菜單(在至極我setActive()我想表),並從這一調用的主要功能。 當從觸發器調用時,沒有用於設置任何活動工作表,因此我從主函數中刪除了該部分。

它是這樣的:

function manualTest(){ // from the ss menu 
    createnewsheet(); 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    SpreadsheetApp.setActiveSheet(sheet.getSheets()[2]);// this works from the menu when ss is open 
} 

function createnewsheet(){ // from the trigger and from function manualTest() 
    var sheetName = "Control on "+ Utilities.formatDate(new Date(), FUS1, "MMM-dd-yy"); 
     try{ 
    var newsheet = ss.insertSheet(sheetName,2); 
     }catch(error){ 
     FUS1=new Date().toString().substr(25,6)+":00"; 
     var newsheet = ss.insertSheet(sheetName+' - '+Utilities.formatDate(new Date(), FUS1, "HH:mm:ss"),2); 
     } 
    newsheet.getRange(1,1).setValue(sheetName); 
} 
0

這裏有一個catch

SpreadsheetApp.setActiveSheet(ss.getSheets()[2]); 

當您從腳本編輯器中運行它,它會自動獲取集裝箱電子表格並使所述表單處於活動狀態,但從「自定義菜單」或觸發器中運行它時不是這種情況。 修改此聲明:

ss.setActiveSheet(ss.getSheets()[2]); 
ss.setActiveSheet(newsheet); 
+0

感謝您的關注,但此解決方案無法滿足我的要求:電子表格打開時,它對UI沒有任何影響。我想要的是當我手動運行該功能時能夠獲得工作表'激活'。 –

+0

是的,這似乎是在更新Google電子表格UI時引入的錯誤。早些時候這用於工作。對不起,在發佈之前不要測試代碼。 –

+0

不用擔心;-)與此同時,我找到了一種方法,使其工作...查看編輯 –

0

我已經找到了最好的解決辦法是補種sheetgetActiveSpreadsheet()目前認識到電子表格中使用所以沒必要openById一次,但

// SpreadsheetApp.setActiveSheet(ss.getSheets()[2]); 
// SpreadsheetApp.setActiveSheet(newsheet); 
sheet = SpreadsheetApp.getActiveSpreadsheet(); // reloads the active sheet (including changes to the Sheets array) 
sheet.setActiveSheet(sheet.getSheets()[2]); // works as expected from editor and custom menu 

我認爲這表明原來sssheet緩存了電子表格,以存儲和它們指針不會刷新,以反映結構變化。我嘗試將.flush()作爲快捷方式,但似乎是從腳本刷新到表單,而不是相反。

+0

這實際上是您的兩個功能解決方案的捷徑 - 關鍵是將'sheet'重新分配給活動工作表 – Jonathon

相關問題