0

Ich habe dieses Skript, das mehrere Dinge mit Daten tut, sobald es in einem Google-Formular eingegeben wird, aber ich muss verklagen, dass, wenn zwei Teilnehmer genau den gleichen Namen haben, dass es den vorherigen Eintrag vollständig löscht.Wie verwenden Sie ein Skript, um eine Zeile in einer Tabelle zu löschen, die mit einem Formular verknüpft ist?

function formChanger() { 
    var doc = DocumentApp.openById('THIS WAS MY ID'); 
    var body = doc.getBody(); 
    var date = body.getListItems(); 
    var dates = []; 
    for(var i = 0; i<date.length;i++) 
    { 
    dates.push(date[i].getText()); 
    } 
    var form = FormApp.openById('THIS WAS MY ID'); 
    var items = form.getItems(); 
    var ss = SpreadsheetApp.openById("THIS WAS MY ID"); 
    Logger.log(ss.getName()); 
    var sheet = ss.getSheets()[0]; 
    var values = sheet.getSheetValues(2, 4, sheet.getLastRow() , 1); 
    Logger.log(values); 
    var names = sheet.getSheetValues(2, 2, sheet.getLastRow(), 1); 
    var item = items[2].asMultipleChoiceItem(); 
    var choices = item.getChoices() 
    for(var i=names.length; i>-1; i--){ 
    for(var j=names.length; j>-1; j--){ 
     if(names[i]==names[j] && i != j) 
     sheet.deleteRow(i); 
    } 
    } 
    var h = -1; 
    var j = -1; 
    var k = -1; 
    var l = -1; 
    for(var o = 0; o<values.length; o++){   
    if(choices[0].getValue().equals(values[o].toString())) 
     h++; 
    if(choices[1].getValue().equals(values[o].toString())) 
     j++; 
    if(choices[2].getValue().equals(values[o].toString())) 
     k++; 
    if(choices[3].getValue().equals(values[o].toString())) 
     l++; 
    } 
    if(h>3) 
    dates.splice(0,1); 
    if(j>3) 
    dates.splice(1, 1); 
    if(k>3) 
    dates.splice(2, 1); 
    if(l>3) 
    dates.splice(3, 1); 
    emptyDocument(); 
    Logger.log(h); 
    Logger.log(j); 
    Logger.log(k); 
    Logger.log(l); 
    item.setChoices([ 
    item.createChoice(dates[0]), 
    item.createChoice(dates[1]), 
    item.createChoice(dates[2]), 
    item.createChoice(dates[3]) 
]); 
    for(var i = 0; i<dates.length; i++) 
    body.appendListItem(dates[i]); 
    Logger.log(doc.getName()+" Contains:"); 
    Logger.log(dates); 
} 

Ja der Code ist ein Chaos, und ich bin sicher, dass es eine bessere Art und Weise getan werden könnte, aber der wichtige Teil ist, dass ich in der Lage sein könnte, die Zeile von Informationen zu löschen, die wiederholt wird. Der Compiler erlaubt mir dies nicht, weil das Tabellenblatt mit dem Formular verknüpft ist. Gibt es einen Weg dahin?

Antwort

0

Die folgenden Versuche zur Löschung werden in Platten Empfangen von Formulardaten gesperrt:

  • Löschen von Spalten mit Formulardaten
  • Löschen der Zeile mit Form Fragen - das heißt, Zeile 1

Andere Zeilen können beliebig gelöscht werden. Dieses Verhalten ist für Skripts genau so wie für Benutzeraktionen.

Ihr Skript versucht, Zeile 1 zu löschen, da es fehlerhaft ist. Ich zitiere den relevanten Teil:

var names = sheet.getSheetValues(2, 2, sheet.getLastRow(), 1); 
    for(var i=names.length; i>-1; i++){ 
    for(var j=names.length; j>-1; j++){ 
     if(names[i]==names[j] && i != j) 
     sheet.deleteRow(i); 

In welcher Zeile sind Namen [i]? Es befindet sich in Zeile i + 2, weil i = 0 Zeile 2 entspricht. Sie versuchen jedoch, die Zeile mit der Nummer i zu löschen, zwei Zeilen über der gewünschten Zeile.

Außerdem ist i>-1; i++ absurd; Sie wollen i-- dort.


Hier ist ein einfaches Skript, das Zeile mit Duplikaten löscht; Es wurde mit meinen Formularantworten getestet. Es durchläuft den Inhalt von "Form Responses 1" Blatt von unten nach oben; Wenn zwei Zeilen in Spalte C den gleichen Wert haben, wird der ältere gelöscht. Ich kümmere sie nicht Löscht von Zeile zu versuchen, 1.

(Der Grund, dies mit Reihen zu tun zu vermeiden, in Bottom-up zu tun, ist, die nach oben bewegt, weil andere gelöscht wurden.)

function deleteDupes() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('Form Responses 1'); 
    var values = sheet.getDataRange().getValues(); 
    for (var i = values.length - 1; i > 1; i--) { 
    if (values[i][2] == values[i-1][2]) { 
     sheet.deleteRow(i); 
    } 
    } 
} 
+0

Als ich Gehen Sie zum Löschen der Zeile, die Funktion kompiliert gut, aber wenn es tatsächlich ausgeführt wird, trifft es diesen Fehler: 'Kann Zeile mit Formularfragen nicht löschen. Ziehen Sie stattdessen in Betracht, die Zeile auszublenden. (Zeile 23, Datei "Code") 'so kann ich die deleteRow-Funktion nicht wirklich verwenden. – Maxunm

+0

"Zeile mit Formularfragen" ist die oberste Zeile des Blattes. Das ist die einzige Zeile, die nicht gelöscht werden kann. Siehe mein Update zur Antwort. –