2013-09-04 12 views
5

Próbuję aktywować arkusz miesięczny po otwarciu arkusza kalkulacyjnego, zgodnie z bieżącym miesiącem.Nie można aktywować arkusza według nazwy

Problem występuje na końcu skryptu, gdy nie można wybrać arkusza. Wydaje się, że getSheetByName() otrzymuje wartość null, która nie jest akceptowana przez setActiveSheet().

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

Więc jest to ostateczny kod, który działa:

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

} 

Odpowiedz

9

Twój skrypt może znacznie prostsze ... Spróbuj to tak: (wszystkie linie oznaczone ;// can be removed mogą być usunięte i są rzeczywiście nie tylko dla celów demo)

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 
} 

i "krótkiej" wersji:

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

EDIT: jeśli naprawdę chcesz, aby uzyskać arkusze przez ich nazwy (w przypadku, gdy nie mogą być pewni o kolejności arkuszy) można wdrożyć go jak poniżej (która jest nadal dość prostsze niż kodzie):

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: ponieważ wydają się trzymać się problemy pozwól mi sugerować trzecią wersję, która korzysta z numerów uwzględnionych w swoim sheetNames i znaleźć odpowiedni arkusz, nawet jeśli nie są one sortowane ... to wygląda tak:

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

Zasadniczo sugerujesz, aby zamiast nazwy arkusza użyć id etykiety (predefiniowanej liczby całkowitej). Powodem, dla którego nie wypróbowałem w ten sposób, jest to, że plik został utworzony przez inną osobę, a arkusze zostały zmienione; co więcej, plik będzie szablonem, który będzie replikowany 500 razy. Nie wiem, czy faktycznie można wymusić zmianę w identyfikatorach arkuszy; gdyby tak było, zrobiłbym to, używając twojego kodu. Spróbuję drugi sposób: zamawiać nazwiska na liście. DZIĘKUJEMY BARDZO DUŻO –

+0

Cóż, próbowałem i ten sam problem nadal istnieje: "var mysheet = ss.getSheetByName (sheetNames [miesiąc])" zwraca wartość pustą, więc setactiveheet nie może działać później. Zarejestrowałem poprzednie wartości i są OK. Spróbuję spróbować stworzyć listę z liczbami całkowitymi, "zmieniając kolejność" identyfikatorów arkuszy. –

+0

Jeśli chcesz mieć całkowitą pewność, że nazwy są takie, możesz wypróbować pierwszą wersję i zobaczyć nazwy arkuszy ... to możesz użyć jej w ostatniej wersji bez żadnych wątpliwości, że może tam być pisownia lub niewidoczne miejsca ... użyj rejestratora: Logger.log (sheetNames) –