1

gefunden wird Ich habe ein Google-Blatt mit über 3000 Zeilen. Einige der Zeilen enthalten Wörter, die nicht relevant sind. Also brauche ich eine Möglichkeit, diese in großen Mengen zu löschen. Zum Beispiel enthalten Zellen etwas wie:Zeile in Google Tabellen löschen, wenn ein bestimmtes "Wort" in Zelle

# | Product 
------------------------------- 
1 | Cool new product 
2 | Old product 
3 | Product that's old 

Ich möchte alle Zeilen löschen, die das Wort "alt" enthalten.

Ich fand ein Skript, das die Hälfte der Arbeit macht, aber es erfordert das "Wort", um die gesamte Zelle, nicht nur einige der Zelle übereinstimmen.

Zeile 17 in dem folgenden Code ist, was angepasst werden muss:


16 | 
17 |  if (row[1] == 'old') 
18 | 

Hier ist der Code:

/** 
* Deletes rows in the active spreadsheet that contain 'word' in column B 
* For more information on using the Spreadsheet API, see 
* https://developers.google.com/apps-script/service_spreadsheet 
*/ 

function readRows() { 
var sheet = SpreadsheetApp.getActiveSheet(); 
var rows = sheet.getDataRange(); 
var numRows = rows.getNumRows(); 
var values = rows.getValues(); 

var rowsDeleted = 0; 
for (var i = 0; i <= numRows - 1; i++) { 
var row = values[i]; 
if (row[1] == 'old') { 
sheet.deleteRow((parseInt(i)+1) - rowsDeleted); 
rowsDeleted++; 
} 
} 
}; 


/** 
* Adds a custom menu to the active spreadsheet, containing a single menu item 
* for invoking the readRows() function specified above. 
* The onOpen() function, when defined, is automatically invoked whenever the 
* spreadsheet is opened. 
* For more information on using the Spreadsheet API, see 
* https://developers.google.com/apps-script/service_spreadsheet 
*/ 
function onOpen() { 
var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
var entries = [{ 
name : "Remove rows where column B is 'old'", 
functionName : "readRows" 
}]; 
sheet.addMenu("Remove Rows", entries); 
}; 




Es fügt ein Menü am oberen Rand right..Looks wie diese,

Remove Rows

+0

http://stackoverflow.com/a/1789952/5297207 –

+0

I bin nicht genau sicher, wie man das anwendet – Oneezy

+0

Ich muss nur nach Teilstrings suchen, nicht die Zeichenkette dann die Teilzeichenkette. Ich spiele damit – Oneezy

Antwort

3

Mit dem indexOf Trick, ich habe es geschafft, durch eine Änderung der gewünschten Effekt zu erzielen ...

Dies:

if (row[1] == 'old') 

zu diesem:

if (row[1].indexOf("old") > -1) 


Was hier passiert:

Die 'indexOf' geht und findet die Position des das erste Vorkommen des Wortes "alt" ist, dann kehrt zurück eine Zahl Länge Wert. Wenn es das Wort nicht findet, wird das Ergebnis -1 sein. Also, so lange wie Sie größer als "> -1" angeben, wird es wahr sein .. und Sie werden gut sein!


Hier ist der vollständige Code, ob jemand dies in Zukunft braucht,

/** 
* Deletes rows in the active spreadsheet that contain 'word' in column B 
* For more information on using the Spreadsheet API, see 
* https://developers.google.com/apps-script/service_spreadsheet 
*/ 

function readRows() { 
var sheet = SpreadsheetApp.getActiveSheet(); 
var rows = sheet.getDataRange(); 
var numRows = rows.getNumRows(); 
var values = rows.getValues(); 

var rowsDeleted = 0; 
for (var i = 0; i <= numRows - 1; i++) { 

var row = values[i]; 

if (row[1].indexOf("old") > -1) { 
sheet.deleteRow((parseInt(i)+1) - rowsDeleted); 
rowsDeleted++; 
} 

} 
}; 


/** 
* Adds a custom menu to the active spreadsheet, containing a single menu item 
* for invoking the readRows() function specified above. 
* The onOpen() function, when defined, is automatically invoked whenever the 
* spreadsheet is opened. 
* For more information on using the Spreadsheet API, see 
* https://developers.google.com/apps-script/service_spreadsheet 
*/ 
function onOpen() { 
var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
var entries = [{ 
name : "Remove rows where column B is 'old'", 
functionName : "readRows" 
}]; 
sheet.addMenu("Remove Rows", entries); 
}; 
+0

Ich habe ein einfaches Skript hinzugefügt, das die Zeilen basierend auf einem Regex entfernt –

+0

Funktioniert das noch? Ich erhalte einen Typescript-Fehler für indexOf. Ich denke es ist, dass es die Schnur im Objekt nicht finden kann, aber ich habe Zellen/Bereiche ausgewählt, dass es in der Lage sein sollte, Sachen an zu wählen. –

+0

nicht sicher ... Ich habe es nicht in einer Weile getestet – Oneezy

0
function deleteRows() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var rows = sheet.getDataRange(); 
    var numRows = rows.getNumRows(); 
    var values = rows.getValues(); 

    var toDelete = []; 

var re = new RegExp('old','gi'); 
    for (var row = 0; row < values.length; row++) { 
    for(var column = 0;column<values[row].length;column++){ 
    if (re.exec(values[row][column])){ 
    toDelete.push(row); } } } 


    for(var deleteRow = toDelete.length-1; deleteRow >= 0;deleteRow--){ 
    sheet.deleteRow(toDelete[deleteRow]+1); 
    } 

    SpreadsheetApp.flush(); 
}; 
+0

Das ist eine Aufgabe, kein Test für die Übereinstimmung, und ich bin ziemlich sicher, JS hat keine Syntax Zucker für Regex-Abgleich sowieso, also '.test()' oder ähnlich würde benötigt werden. –

+0

aktualisierte Antwort mit einem getesteten Skript - das funktioniert –