2016-04-13 6 views
0

So habe ich zwei Zeitpläne, die in Zeile und Spalte und Platzierung von Zellen identisch sind. Es gibt Zellen, die immer konstant sind, aber es gibt andere, bei denen sich die Felder ändern. Also habe ich ein benutzerdefiniertes Menü-Skript, das eines der zwei identischen Blätter aufruft und die vordefinierten Zellen löscht. Auf der Skriptseite kopiere/kopiere ich im Prinzip das gleiche Skript zweimal und ändere den Namen des Active Sheets. Ich fühle mich jedoch so überflüssig. Gibt es eine Möglichkeit, dass ich nur ein Skript haben kann und je nachdem, welchen Menüpunkt ich auswähle, wird der entsprechende Zeitplan gelöscht?Google Skript kompakter machen (Skript zum Löschen von Inhalten)

Dies ist das benutzerdefinierte Menü Skript

function resetsheetbutton() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Advanced Menu') 
    .addSubMenu(ui.createMenu('Reset Schedule') 
      .addItem('Schedule 1', 'resetschedule1') 
      .addSeparator() 
      .addItem('Schedule 2', 'resetschedule2')) 
     .addToUi(); 
} 

Dies ist das Skript Schedule auszulöschen 1

function resetschedule1(){ 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName('Notification')); 
    var sheet = spreadsheet.getActiveSheet(); 
    var spreadsheet1 = SpreadsheetApp.getActiveSpreadsheet(); 
SpreadsheetApp.setActiveSheet(spreadsheet1.getSheetByName('Schedule 1')); 
    var sheet1 = spreadsheet1.getActiveSheet(); 
    var startRow = 2; 
    var lastRow = 80; 
    var range = sheet.getRange(2,11,lastRow-startRow+1,1); 
    var numRows = range.getNumRows(); 
    var reset = range.getValues(); 


for (var i = 0; i < numRows; i++) { 
var row = reset[i]; 
sheet1.getRange(row).clearContent(); 
} 
    sheet1.getRange('C3').setValue('Insert new Date here'); 
    sheet1.getRange('D3').setValue('Insert this week's task'); 
    sheet1.getRange('D29').setValue('Insert this week's task'); 
    sheet1.getRange('D55').setValue('Insert this week's task'); 
    sheet1.getRange('D81').setValue('Insert this week's task'); 
    sheet1.getRange('D107').setValue('Insert this week's task'); 
    sheet1.getRange('C6').setValue('=C5'); 
    sheet1.getRange('C25').setValue('=C5'); 
    sheet1.getRange('C32').setValue('=C31'); 
    sheet1.getRange('C51').setValue('=C31'); 
    sheet1.getRange('C58').setValue('=C57'); 
    sheet1.getRange('C77').setValue('=C57'); 
    sheet1.getRange('C84').setValue('=C83'); 
    sheet1.getRange('C103').setValue('=C83'); 
    sheet1.getRange('C110').setValue('=C109'); 
    sheet1.getRange('C129').setValue('=C109'); 
} 

Dies ist exakt das gleiche Skript für Zeitplan 2, außer es Punkte 2. planen Ich benenne das Blatt speziell, anstatt es das aktive Blatt löschen zu lassen, so dass die Person, die den Plan löscht, nicht versehentlich den falschen Plan löscht.

function resetschedule2(){ 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName('Notification')); 
    var sheet = spreadsheet.getActiveSheet(); 
    var spreadsheet1 = SpreadsheetApp.getActiveSpreadsheet(); 
SpreadsheetApp.setActiveSheet(spreadsheet1.getSheetByName('Schedule 2')); 
    var sheet1 = spreadsheet1.getActiveSheet(); 
    var startRow = 2; 
    var lastRow = 80; 
    var range = sheet.getRange(2,11,lastRow-startRow+1,1); 
    var numRows = range.getNumRows(); 
    var reset = range.getValues(); 


for (var i = 0; i < numRows; i++) { 
var row = reset[i]; 
sheet1.getRange(row).clearContent(); 
} 
    sheet1.getRange('C3').setValue('Insert new Date here'); 
    sheet1.getRange('D3').setValue('Insert this week's task'); 
    sheet1.getRange('D29').setValue('Insert this week's task'); 
    sheet1.getRange('D55').setValue('Insert this week's task'); 
    sheet1.getRange('D81').setValue('Insert this week's task'); 
    sheet1.getRange('D107').setValue('Insert this week's task'); 
    sheet1.getRange('C6').setValue('=C5'); 
    sheet1.getRange('C25').setValue('=C5'); 
    sheet1.getRange('C32').setValue('=C31'); 
    sheet1.getRange('C51').setValue('=C31'); 
    sheet1.getRange('C58').setValue('=C57'); 
    sheet1.getRange('C77').setValue('=C57'); 
    sheet1.getRange('C84').setValue('=C83'); 
    sheet1.getRange('C103').setValue('=C83'); 
    sheet1.getRange('C110').setValue('=C109'); 
    sheet1.getRange('C129').setValue('=C109'); 
} 

Jede Hilfe würde sehr geschätzt werden.

+0

Dies auch zu den Kommentaren hinzufügen. Könntest du irgendjemanden in der Lage sein, die Geschwindigkeit der Ausführung zu kommentieren? Im Moment habe ich eine Spalte von Zellnamen (z. B. A2, D3: D5, E7, usw.) etwa 80 Zeilen. Ich führe sie durch die Schleife. Es dauert ungefähr 25-40 Sekunden, um zu laufen. Ich stolperte dann über sie durch die Array-Funktion, um es zu beschleunigen, aber das hat nichts mit der Geschwindigkeit getan. Kann ich nichts dafür tun, dass es durch das Blatt läuft und diese Zellen schneller löscht? – User125

Antwort

0

Da die Funktion im Menü nicht einen Parameter umfassen können, werden Sie noch brauchen zunächst zwei Funktionen, aber sie werden sehr kurz sein:

function resetschedule1() { 
    resetschedule("1");//Pass the string value "1" to the function 
}; 

function resetschedule2() { 
    resetschedule("2");//Pass the value "2" 
}; 

Sie ein Objekt erstellen, könnten die Werte für die Einstellung, dass sind in beiden Blättern gleich. Mit einem JavaScript-Objekt können Sie einen "Schlüssel" mit einem "Wert" vergleichen. In diesem Fall wäre der "Schlüssel" die Zellenadresse und der Wert wäre der Wert.

var objCellToValueSameForBoth = { 
    "C3":"Insert new Date here", 
    "D3":"Insert this week's task" 
}; 

//Set the values that are the same in both sheets 
for (var key in objCellToValueSameForBoth) { 
    sheet.getRange(key).setValue(objCellToValueSameForBoth[key]); 
}; 

Es gibt mehr als einen Weg, um die Code verwenden unterschiedliche Werte haben können. Sie können einen Wert an die Funktion übergeben:

function resetschedule(argWhichSheet) { 

    var objArgToSheetName = {"1":"Schedule 1","2":"Schedule 2"}; 
    var whichSheetToClear = objArgToSheetName[argWhichSheet]; 

    SpreadsheetApp.setActiveSheet(spreadsheet1.getSheetByName(whichSheetToClear)); 
}; 
+0

Das hat wunderbar funktioniert und ich habe etwas Neues gelernt! Vielen Dank! – User125

+0

BTW, würden Sie in der Lage sein, die Geschwindigkeit der Ausführung zu kommentieren. Im Moment habe ich eine Spalte mit Zellnamen. 80 Zeilen. Ich führe sie durch die Schleife. Es dauert ungefähr 25-40 Sekunden, um zu laufen. Ich stolperte dann über sie durch die Array-Funktion, um es zu beschleunigen, aber das hat nichts mit der Geschwindigkeit getan. Kann ich nichts dafür tun, dass es durch das Blatt läuft und diese Zellen schneller löscht? – User125

+0

pleasefo nicht eine unabhängige Frage 2. machen. mach eine neue Frage. –

Verwandte Themen