2013-09-04 6 views
5

Ich versuche, ein monatliches Blatt beim Öffnen der Tabelle zu aktivieren, je nach dem aktuellen Monat.Ein Blatt konnte nicht mit dem Namen aktiviert werden

Das Problem liegt am Ende des Skripts, wenn das Blatt nicht ausgewählt werden kann. Es scheint, dass getSheetByName() einen null Wert erhält, der von setActiveSheet() nicht akzeptiert wird.

function selectmonth(){ 
    var now= new Date(); 
    var month= now.getMonth()+1; 
    var ss=SpreadsheetApp.getActiveSpreadsheet(); 
    var sheetname=""; 

    switch (month){ 
    case 1: 
     sheetname="urtarrila01"; //english=january01 
     break; 
    case 2: 
     sheetname="otsaila02"; //english=february02 and so on... 
     break; 
    case 3: 
     sheetname="martxoa03"; 
     break; 
    case 4: 
     sheetname="apirila04"; 
     break; 
    case 5: 
     sheetname="maiatza05"; 
     break; 
    case 6: 
     sheetname="ekaina06"; 
     break; 
    case 9: 
     sheetname="iraila09"; 
     break; 
    case 10: 
     etiketaizena="urria10"; 
     break; 
    case 11: 
     sheetname="azaroa11"; 
     break; 
    case 12: 
     sheetname="abendua12"; 
     break;  
    default: 
     sheetname="LABURPENA-resumen"; 
    } 

//HERE mysheet gets null value, although the sheet exist, named "sheetname) 
    var mysheet=ss.getSheetByName(sheetname); 
    //AN HERE THE SCRIPT FAILS, ERROR MESSAGE=invalid argument on next line 
    ss.setActiveSheet(mysheet); 
} 

Nun ist dies der endgültige Code, das funktioniert:

enter code here 

    function hileHonetan(){ 
    var now= new Date(); 
    var month= now.getMonth(); 
    var mysheetname=""; 
    var ss=SpreadsheetApp.getActiveSpreadsheet(); 
    var sheetNames= ['urtarrila01', 'otsaila02', 'martxoa03', 'apirila04', 'maiatza05', 'ekaina06', 'ekaina06', 'ekaina06', 'iraila09', 'urria10', 'azaroa11' , 'abendua12'] 
    mysheetname= sheetNames[month]; 
    var mysheet=ss.getSheetByName(mysheetname); 
    mysheet.activate(); 

} 

Antwort

9

Ihr Skript einfach viel mehr könnte ... es so versuchen: (alle Linien markiert ;// can be removed tatsächlich entfernt werden können und nur für Demo-Zwecke gibt)

function selectmonth(){ 
    var now= new Date(); 
    var month = now.getMonth(); 
    Logger.log(month);// can be removed 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheetNames = [];// can be removed 
    var sheets = ss.getSheets();// can be removed 
    for(var n in sheets){;// can be removed 
    sheetNames.push(sheets[n].getName());// can be removed 
    };// can be removed 
    var mysheet = ss.getSheets()[month] 
    ss.setActiveSheet(mysheet); 
    Browser.msgBox("this sheet is "+sheetNames[month]);// can be removed 
} 

Und die "kurze" Version:

function selectmonth(){ 
    var now= new Date(); 
    var month = now.getMonth(); 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var mysheet = ss.getSheets()[month] 
    ss.setActiveSheet(mysheet); 
} 

EDIT: Wenn Sie wirklich die Blätter durch ihre Namen zu bekommen (falls Sie nicht über Blatt sein, um sicher) Sie es wie unten implementieren könnte (was immer noch recht einfacher als Code):

function selectmonth(){ 
    var now= new Date(); 
    var month = now.getMonth(); 
    Logger.log(month); 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheetNames = ['Sheet1','Sheet2','Sheet3','Sheet4','Sheet5','Sheet6','Sheet7','Sheet8','Sheet9','Sheet10','Sheet11','Sheet12',];; 
    Logger.log(sheetNames) 
    var mysheet = ss.getSheetByName(sheetNames[month]); 
    ss.setActiveSheet(mysheet); 
    Browser.msgBox("this sheet is "+sheetNames[month]);// can be removed 
} 

EDIT 2: da, um Sie scheinen Probleme lassen Sie mich eine dritte Version vorschlagen, bekommen die Vorteile nimmt die Zahlen in Ihrem sheetNames enthalten und das richtige Blatt finden, auch wenn sie nicht sortiert sind ... es geht so:

function selectmonth(){ 
    var now= new Date(); 
    var month = now.getMonth(); 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var mysheet; 
    var sheets = ss.getSheets(); 
    for(var n in sheets){ 
    var index = Number(sheets[n].getName().replace(/[^0-9]/ig,'')); 
    Logger.log(index);// index is the number included in your sheetName, with that we can get the sheet in the following loop. 
    if(index == month+1){mysheet = ss.getSheets()[n] ; break} 
    } 
    ss.setActiveSheet(mysheet); 
    Browser.msgBox("this sheet is "+mysheet.getName()); 
} 
+0

Also im Grunde schlagen Sie vor, die Sheed-ID (eine vordefinierte Ganzzahl) anstelle des Blattnamens zu verwenden. Der Grund, warum ich das nicht versucht habe, ist, dass die Datei von einer anderen Person erstellt wurde und die Blätter neu geordnet wurden. Darüber hinaus ist die Datei eine Vorlage, die 500 Mal repliziert wird. Ich weiß nicht, ob es tatsächlich möglich ist, eine Änderung in den Blatt-IDs zu erzwingen; Wenn es so wäre, würde ich das tun, mit Ihrem Code. Ich werde den zweiten Weg versuchen: die Namen in einer Liste zu ordnen. DANKE SEHR VIEL –

+0

Nun, ich habe versucht und das gleiche Problem ist immer noch da: "var mysheet = ss.getSheetByName (Blattnamen [Monat])" gibt einen Null-Wert zurück, so dass späteres Blatt nicht mehr funktionieren kann. Ich habe die vorherigen Werte protokolliert und bin OK. Ich werde versuchen, eine Liste mit Ganzzahlen zu erstellen, die Blatt-IDs "neu zu ordnen". –

+0

Wenn Sie die Namen absolut sicher wissen wollen, können Sie die erste Version ausprobieren und tatsächlich die Blattnamen sehen ... dann können Sie es in der letzten Version ohne Zweifel über die Rechtschreibung oder unsichtbare Leerzeichen verwenden, die da sein könnten ... benutze den Logger: Logger.log (sheetNames) –

Verwandte Themen