2013-09-04 7 views
5

Sto tentando di attivare un foglio mensile all'apertura del foglio di calcolo, in base al mese corrente.Impossibile attivare un foglio per nome

Il problema è alla fine dello script, quando fallisce selezione del foglio. Sembra che getSheetByName() abbia un valore null, che non è accettato da 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); 
} 

Ebbene questo è il codice finale che funziona:

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

} 

risposta

9

Lo script potrebbe molto più semplice ... Prova in questo modo: (tutte le linee segnate ;// can be removed può infatti essere rimosso e sono lì solo a scopo dimostrativo)

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 
} 

E la versione "corta":

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

EDIT: se si vuole veramente ottenere i fogli con i loro nomi (nel caso in cui non si può essere sicuri di ordine patrimoniale) si potrebbe implementare esso come qui di seguito (che è ancora piuttosto semplice di quanto il codice):

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: dal momento che sembra continuare a ricevere i problemi lasciatemi suggerire una terza versione che sfrutta i numeri inclusi nei sheetNames e trovano il foglio di destra, anche se non sono ordinati ... va così:

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

Quindi, in pratica, si suggerisce di utilizzare l'id sheed (un numero intero predefinito), anziché il nome del foglio. La ragione per cui non ho provato in questo modo è che il file è stato creato da un'altra persona ei fogli sono stati riordinati; inoltre, il file sarà un modello da replicare 500 volte. Non so se sia effettivamente possibile applicare una modifica ai fogli ID; se lo fosse, lo farei usando il tuo codice. Proverò il secondo modo: ordinare i nomi in una lista. GRAZIE MOLTO –

+0

Bene, ho provato e lo stesso problema è ancora lì: "var mysheet = ss.getSheetByName (sheetNames [mese])" restituisce un valore nullo, quindi setactivesheet non può funzionare in seguito. Ho registrato i valori precedenti e sono OK. Proverò il tuo trucco di creare una lista con numeri interi, "riordinando" gli ID dei fogli. –

+0

Se vuoi essere assolutamente sicuro dei nomi puoi provare la prima versione e vedere effettivamente i nomi dei fogli ... quindi puoi usarlo nell'ultima versione senza alcun dubbio sull'ortografia o sugli spazi invisibili che potrebbero esserci ... usa il logger: Logger.log (sheetNames) –