0

Ich kenne Google Sheet-Formeln ziemlich gut, aber nicht Skripting.Google Docs-Skript: Zelle in zwei andere Blätter onEdit, aber keine Duplikate verschieben

Ich lieh jemand enses Code von Stack-Überlauf, bastelte und fehlgeschlagen fehlgeschlagen.

Grundsätzlich, was ich versuche zu tun ist, wenn ich Text in eine Zelle in Spalte A in 1 Blatt eingeben, ich möchte, dass es den Text auf die nächste verfügbar, oder (+1 aus der letzten Zeile) in zwei andere Blätter, beide Spalte As. Ich brauche es auch, um nach Duplikaten zu suchen und den Text überhaupt nicht zu diesem Blatt hinzuzufügen, wenn der Text genau mit einer anderen Zelle übereinstimmt.

Hier ist der Code, mit dem ich getüftelt habe.

function onEdit(event) { 

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var s = event.source.getActiveSheet(); 
var r = event.source.getActiveRange(); 

if(s.getName() == "AddMember" && r.getColumn() == 27 && r.getValue() == "y") { 

var row = r.getRow(); 
var numColumns = s.getLastColumn(); 
var targetSheet = ss.getSheetByName("InputVPData"); 
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 

s.getRange(row, 1, 1, numColumns).copyTo(target); 

var targetSheet2 = ss.getSheetByName("InputSoulData"); 
var target = targetSheet2.getRange(targetSheet2.getLastRow() + 1, 1); 

s.getRange(row, 1, 1, numColumns).copyTo(target); 
s.deleteRow(row); 
} 
} 

Dieses Skript bewegt sich manchmal meine Zelle zu beiden Blättern, manchmal fügt sie es nur ein Blatt, manchmal ist es die Zelle zweimal auf das gleiche Blatt fügt hinzu und manchmal nur löscht es meine ursprüngliche Zelle und nicht tun alles damit.

Außerdem möchte ich nicht wirklich "y" in die AA-Spalte eingeben, um es zu verschieben, das größte Problem dabei ist, dass es auch die AA-Spalte auf die anderen Blätter ebenfalls verschiebt, die irgendwann wird ein großes Problem sein.

Dieses Skript prüft auch nicht auf Duplikate. Es gibt eine Google Sheet Data Validation-Funktion, die das kann, aber aus irgendeinem Grund ist es bisher, wenn es mit Scripting kombiniert wird, bestenfalls fleckig und funktioniert in 95% der Fälle nicht wirklich.

Hier ist eine Kopie meines Spreadsheet, es ist für jeden eingestellt mit Link kann bearbeiten. Ich denke nicht, dass es für dieses Skript benötigt wird, aber fühlen Sie sich frei zu sehen, mit was ich arbeite, und da es eine Kopie ist, stört es mich nicht, es zu brechen.

Aktualisiert Link- (1. März 2017)

https://docs.google.com/spreadsheets/d/1u09DNmuotLTHMaF29sbPMrd_k-oRbRB7JGp4pWNgvfI/edit?usp=drivesdk

Ich bin ein hundegroomer durch den Handel so das Scripting ist nicht meine Tasse Tee, und Google-Blatt Formeln sind nur ein Hobby zusammen mit Spiel Na sicher. :)

Edit: (1. März 2017)

Unten ist mein neues Skript. Ich habe mehrere neue Blätter hinzugefügt und das Skript funktioniert perfekt. Ich habe auch den obigen Tabellenlink aktualisiert, um eine neue Kopie mit vollen Bearbeitungsrechten wieder aufzunehmen.

Ich habe jedoch eine neue Frage. Wie gehe ich vor, dies rückgängig zu machen? Nehmen wir zum Beispiel an, ich sollte ein neues Blatt mit dem Namen "RemoveMember" hinzufügen?

function onEdit(event) { 

var ss = SpreadsheetApp.getActiveSpreadsheet(); 

/*var s = event.source.getActiveSheet(); 
var r = event.source.getActiveRange();*/ 
// Nothing wrong with using event.source, It is easier to debug with the below code. 
var s = ss.getActiveSheet() 
var r = ss.getActiveRange() 

// The reason your previous code was checking for column AA was due to the following code r.getColumn() == 27 and r.getValue() == 'y' 
if(s.getName() == "AddMember" && r.getColumn() == 1) { 
var targetSheet = ss.getSheetByName("InputVPData"); 
var tlastRow = targetSheet.getLastRow() 
// targetMembers gets the previous members you have in the inputVpData 
var targetMembers = targetSheet.getRange(8,1,tlastRow - 7,1).getValues() 
//RemoveDuplicates removes if any duplicates are found. 
var newMembers = removeDuplicates(r.getValues(),targetMembers) 
//check and see if you have any new entry before entering the data 
//important because getRange cannot have 0 as argument. 
if(newMembers.length != 0){ 
    targetSheet.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 

    var targetSheet2 = ss.getSheetByName("InputSoulData"); 
    tlastRow = targetSheet2.getLastRow() 

    targetSheet2.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 

    var targetSheet3 = ss.getSheetByName("InputDonatedData"); 
    tlastRow = targetSheet3.getLastRow() 

    targetSheet3.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 

    var targetSheet4 = ss.getSheetByName("InputWonData"); 
    tlastRow = targetSheet4.getLastRow() 

    targetSheet4.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 

    var targetSheet5 = ss.getSheetByName("InputCapturedData"); 
    tlastRow = targetSheet5.getLastRow() 

    targetSheet5.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 

    var targetSheet6 = ss.getSheetByName("InputDefendedData"); 
    tlastRow = targetSheet6.getLastRow() 

    targetSheet6.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 

    var targetSheet7 = ss.getSheetByName("InputLostData"); 
    tlastRow = targetSheet7.getLastRow() 

    targetSheet7.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 
} 

r.clear() 

} 

} 


function removeDuplicates(newMembers, targetMembers){ 
var uniqueMembers = [] 

var counter =0 
for(var i=0; i< newMembers.length; i++) 
{ 

var isunique = true; 
for(var j=0 ; j < targetMembers.length; j++) { 
    if(newMembers[i][0].trim() == targetMembers[j][0].trim()) 
    { 

    isunique = false; 
    } 
} 
    if(isunique){ 
    uniqueMembers[counter] = [] 
    uniqueMembers[counter][0] = newMembers[i][0] 
    counter++ 
    } 


} 
return uniqueMembers 
} 

Antwort

0

Dies sollte den Trick:

function onEdit(event) { 

  var ss = SpreadsheetApp.getActiveSpreadsheet(); 

  /*var s = event.source.getActiveSheet(); 
  var r = event.source.getActiveRange();*/ 
    // Nothing wrong with using event.source, It is easier to debug with the below code. 
    var s = ss.getActiveSheet() 
    var r = ss.getActiveRange() 

    // The reason your previous code was checking for column AA was due to the following code r.getColumn() == 27 and r.getValue() == 'y' 
  if(s.getName() == "AddMember" && r.getColumn() == 1) { 
    var targetSheet = ss.getSheetByName("InputVPData"); 
    var tlastRow = targetSheet.getLastRow() 
    // targetMembers gets the previous members you have in the inputVpData 
    var targetMembers = targetSheet.getRange(8,1,tlastRow - 7,1).getValues() 
    //RemoveDuplicates removes if any duplicates are found. 
    var newMembers = removeDuplicates(r.getValues(),targetMembers) 
    //check and see if you have any new entry before entering the data 
    //important because getRange cannot have 0 as argument. 
    if(newMembers.length != 0){ 
     targetSheet.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 

     var targetSheet2 = ss.getSheetByName("InputSoulData"); 
     tlastRow = targetSheet2.getLastRow() 

     targetSheet2.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 
    } 

    r.clear() 

  } 

} 


function removeDuplicates(newMembers, targetMembers){ 
    var uniqueMembers = [] 

    var counter =0 
    for(var i=0; i< newMembers.length; i++) 
    { 

    var isunique = true; 
    for(var j=0 ; j < targetMembers.length; j++) { 
     if(newMembers[i][0].trim() == targetMembers[j][0].trim()) 
     { 

     isunique = false; 
     } 
    } 
     if(isunique){ 
     uniqueMembers[counter] = [] 
     uniqueMembers[counter][0] = newMembers[i][0] 
     counter++ 
     } 


    } 
    return uniqueMembers 
} 

Sie auf dem richtigen Weg waren, haben soeben eine Funktion Dubletten genannt entfernen, um Duplikate zu überprüfen, bevor der Wert in diesen beiden Blätter eingeben. Beachten Sie jedoch, dass ich nur nach Duplikaten mit den Daten von InputVPData suche. Sie können das gleiche für InputSoulData Blatt tun, wenn Sie möchten.

Bearbeiten: So suchen Sie im zweiten Blatt nach Duplikaten.Der Trick liegt in diesem Code:

 var targetSheet = ss.getSheetByName("InputVPData"); 
     var tlastRow = targetSheet.getLastRow() 
     // targetMembers gets the previous members you have in the inputVpData 
     var targetMembers = targetSheet.getRange(8,1,tlastRow - 7,1).getValues() 
        //RemoveDuplicates removes if any duplicates are found. 
     var newMembers = removeDuplicates(r.getValues(),targetMembers) 

was dieser Code tut, ist das Blatt wird als „InputVPData“ und dann die LastRow herauszufinden, welche Daten hat. Dann bekommt die alle Werte in der ersten Spalte von Zeile 8 bis LastRow - 7 unter Verwendung dieser:

var targetMembers = targetSheet.getRange(8,1,tlastRow - 7,1).getValues() 
getRange(StartRow,StartColumn,NoofRows,noOfColumns)=> Get the range 
getValues() => Get the value of said range 

In ähnlicher Weise erhalten wir den Wert der eingegebenen Daten mit r.getValues ​​() und übergeben es an dieser Funktion

removeDuplicates(r.getValues(),targetMembers) 

, die Duplikate aus den eingegebenen Daten (r.getValues) und gibt sie an den variablen newMembers entfernt, wie so

var newMembers = removeDuplicates(r.getValues(),targetMembers) 

diese Neuesmitglied ist dann zu Ihrem targetSheet hinzugefügt, um die setValu mit es funktionieren wie so:

targetSheet.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers); 

Alles, was Sie tun müssen, ist den obigen Code duplizieren einen neuen Satz von newMembers2 zu erhalten, nachdem die RemoveDuplicates Funktion auf r.getValues ​​und targetSheet2 Mitglieder verwenden. Sobald Sie diese Liste erneut verwenden, verwenden Sie setValues, um Werte in dem neuen Arbeitsblatt aus der Variablen newMembers2 festzulegen.

+0

Bah, es wird mich nicht lassen ticken Sie Ihre Antwort. Ich weiß nichts über Skripting. Ich lieh mir jemandes Code und bekam nach und nach ein bisschen daraus .. wie würde ich auch nach Duplikaten im InputSoulData Sheet suchen ... Lol .. tut mir leid, es ist mir nicht so klar .. wenn ich mehr Zeit hätte Heute Abend würde ich so lange anstarren, bis es einen Sinn ergab ... Lol –

+0

Ich werde die Antwort bearbeiten, um Sie in die richtige Richtung zu weisen, aber ich werde es Ihnen noch immer sagen. Besser zu stolpern als nie gefallen zu sein. –

+0

hat die Antwort bearbeitet, damit Sie herausfinden können, wie Sie Ihren Code ändern können. PS: Wenn du deine googleSheet Link-Freigabe aktivierst, gebe ich dir Eingaben, während du deinen Code veränderst :) –

Verwandte Themen