Går detta att göra i Google Sheets eller Excel?

Permalänk

Går detta att göra i Google Sheets eller Excel?

Jag har ett dokument på Google Sheets (kan givetvis ladda ner och öppna i Excel om nödvändigt).

Jag vill göra följande, men vet inte hur:
På vissa ställen finns ".." med bokstäver på båda sidor och på andra ställen "..." med bokstäver på båda sidor (det finns alltså inga mellanrum före eller efter punkterna). Jag vill "söka upp" alla ställen med ".." utan att "..." också hittas/markeras. Kan man skriva in något speciellt i sökfältet för att Google Sheets (eller Excel) ska förstå mina sökkriterier?

Permalänk
Medlem

Om du bara vill hitta alla celler som innehåller exakt två punkter inneslutna av bokstäver kan du använda följande reguljära uttryck i sökrutan i Google sheets:

\w(\.{2})\w

Glöm inte att bocka i Search using regular expressions

Visa signatur

Intel Core i5 8600k @ 4.7 GHz - Gigabyte Aorus GTX 1080 TI - Asus PRIME Z370-A
- Corsair Vengeance LP 16 GB - EVGA Supernova G2 850W - NZXT H500i

Permalänk

Tack! Blev väldigt många träffar ändå. Finns det något sätt att ERSÄTTA ".." omsluten av bokstäver med "..." omsluten av bokstäver? Använder jag samma sökuttryck för att ersätta så försvinner ju två bokstäver per ersättning.

Permalänk
Medlem

Så, nu har jag knåpat ihop ett litet skript som endast ersätter de två punkterna och lämnar bokstäverna runt orörda. Det är inte jättesnyggt, men det fungerar

Jag har testat det och det verkar fungera utan problem, men jag rekommenderar ändå att du tar en kopia på originaldokumentet innan du kör skriptet.

Så här gör du:

  • Öppna dokumentet du vill modifiera i Google sheets

  • Gå till Tools -> Script editor...

  • Ersätt det som står i kodfliken med följande:

function findAndReplace(){ var replaceWith = "..." var sheet = 0 var rangeToEdit = "A1:D5" var ss = SpreadsheetApp.getActiveSpreadsheet(); SpreadsheetApp.setActiveSheet(ss.getSheets()[sheet]); var range = ss.getSheets()[sheet].getRange(rangeToEdit); SpreadsheetApp.setActiveRange(range); var numRows = range.getNumRows(); var numCols = range.getNumColumns(); for (var i = 1; i <= numRows; i++) { for (var j = 1; j <= numCols; j++) { var s = range.getCell(i,j).getValue(); s = s.replace(/([a-zA-ZåÅäÄöÖ]+)(\.{2})([a-zA-ZåÅäÄöÖ]+)/, '$1'+replaceWith+'$3'); range.getCell(i,j).setValue(s); } } }

Modifiera de första tre variablerna så att de passar dig

  • replaceWith är vad du vill ersätta ".." med (i detta fall borde du lämna det orört om du vill ersätta med "...")

  • sheet är vilken flik du vill modifiera (0 betyder flik #1, 1 betyder flik #2 osv.)

  • rangeToEdit är mellan vilka celler du vill ändra

Sedan sparar du skriptet, väljer ett lämpligt namn för projektet, och trycker på kör. Du kommer förmodligen bli förfrågad om du vill tillåta skriptet att modifiera dokumentet och då godkänner du naturligtvis det. Sen är det bara att låta skriptet köra klart

Visa signatur

Intel Core i5 8600k @ 4.7 GHz - Gigabyte Aorus GTX 1080 TI - Asus PRIME Z370-A
- Corsair Vengeance LP 16 GB - EVGA Supernova G2 850W - NZXT H500i

Permalänk

Ska prova. Jättetack för att du tagit dig tid!
"var sheet = 0" är flik nr 1? Ska jag kanske ersätta 0 med namnet på fliken (har döpt alla flikar till något)?

Permalänk
Medlem
Skrivet av Rom Raptor:

Ska prova. Jättetack för att du tagit dig tid!
"var sheet = 0" är flik nr 1? Ska jag kanske ersätta 0 med namnet på fliken (har döpt alla flikar till något)?

Ja, självklart ska sheet översättas till flik. Jag har engelska som profilspråk och då blir det lite fel med översättningarna ibland

Men variabeln sheet ska alltid vara en siffra, oavsett vad du har gett dina flikar för namn. Du börjar helt enkelt räkna från 0 och från vänster till höger.

I exemplet nedan ska du alltså skriva var sheet = 0 om du vill redigera fliken foo, och var sheet = 1 om du vill redigera bar osv:

Visa signatur

Intel Core i5 8600k @ 4.7 GHz - Gigabyte Aorus GTX 1080 TI - Asus PRIME Z370-A
- Corsair Vengeance LP 16 GB - EVGA Supernova G2 850W - NZXT H500i

Permalänk
Medlem

Skrev om skriptet. Det är nu myyyyycket snabbare, och går själv igenom alla celler i alla flikar:

function findAndReplace(){ var replaceWith = "..." var ss=SpreadsheetApp.getActiveSpreadsheet(); var numberOfSheets=ss.getNumSheets(); for (var k = 0; k < numberOfSheets; k++) { var sheet=ss.getSheets()[k]; var selection=sheet.getDataRange() var columns=selection.getNumColumns(); var rows=selection.getNumRows(); var values = selection.getValues(); for (var i = 0; i < rows; i++) { for (var j = 0; j < columns; j++) { var s = values[i][j]; s = s.replace(/([a-zA-ZåÅäÄöÖ]+)(\.{2})([a-zA-ZåÅäÄöÖ]+)/, '$1'+replaceWith+'$3'); values[i][j] = s; } } selection.setValues(values); } }

EDIT:

Om du bara vill köra skriptet på ett specifikt intervall i en specifik flik (som du nu kan ange med namn istället för index):

function findAndReplace(){ var replaceWith = "..." var sheet = "foo" var rangeToEdit = "A1:D5" var ss=SpreadsheetApp.getActiveSpreadsheet(); var activeSheet=ss.getSheetByName(sheet) var selection=activeSheet.getRange(rangeToEdit); var columns=selection.getNumColumns(); var rows=selection.getNumRows(); var values = selection.getValues(); for (var i = 0; i < rows; i++) { for (var j = 0; j < columns; j++) { var s = values[i][j]; s = s.replace(/([a-zA-ZåÅäÄöÖ]+)(\.{2})([a-zA-ZåÅäÄöÖ]+)/, '$1'+replaceWith+'$3'); values[i][j] = s; } } selection.setValues(values); }

Visa signatur

Intel Core i5 8600k @ 4.7 GHz - Gigabyte Aorus GTX 1080 TI - Asus PRIME Z370-A
- Corsair Vengeance LP 16 GB - EVGA Supernova G2 850W - NZXT H500i

Permalänk

Kör det gamla skriptet nu. Det funkar men går jättelångsamt och hänger sig efter ett tag

Det nya funkar bara på ALLA celler och flikar? Vill ju bara ändra en kolumn i en flik (dock är kolumnen 12000 rader).

Permalänk

Ditt sista skript tog bara några sekunder

Permalänk

Nu måste jag vara en riktig pain in the ass. Det visade sig att det ibland är "bokstav..!" eller "bokstav..?" också. Kan jag bara klämma in de tecknen efter "a-zA-ZåÅäÄöÖ" i koden?

Permalänk
Medlem
Skrivet av Rom Raptor:

Nu måste jag vara en riktig pain in the ass. Det visade sig att det ibland är "bokstav..!" eller "bokstav..?" också. Kan jag bara klämma in de tecknen efter "a-zA-ZåÅäÄöÖ" i koden?

Yes, det ska fungera utan problem. Jag har lagt till det i den här versionen.

Här är den senaste versionen, som kör på en angiven flik (med namn foo i exemplet) och en viss kolumn (kolumn A = 1, kolumn B = 2 osv.):

function findAndReplace(){ var replaceWith = "..." var sheetName = "foo"; var column = 1; var ss=SpreadsheetApp.getActiveSpreadsheet(); var numberOfSheets=ss.getNumSheets(); var sheet=ss.getSheetByName(sheetName); var selection=sheet.getRange(1,column,sheet.getMaxRows()); var rows=selection.getNumRows(); var values = selection.getValues(); for (var i = 0; i < rows; i++) { var s = values[i][column-1]; s = s.replace(/([a-zA-ZåÅäÄöÖ]+)(\.{2})([a-zA-ZåÅäÄöÖ!?]+)/, '$1'+replaceWith+'$3'); values[i][column-1] = s; } selection.setValues(values); }

Så då borde du bara behöva ändra foo till vad din flik nu heter, och column to den kolumn du vill redigera

Visa signatur

Intel Core i5 8600k @ 4.7 GHz - Gigabyte Aorus GTX 1080 TI - Asus PRIME Z370-A
- Corsair Vengeance LP 16 GB - EVGA Supernova G2 850W - NZXT H500i

Permalänk

TypeError: Cannot call method "replace" of undefined. (line 14, file "Code")

Permalänk
Medlem
Skrivet av Rom Raptor:

TypeError: Cannot call method "replace" of undefined. (line 14, file "Code")

Du har inte råkat ändra det så att det står var s = values[i][column]; istället för var s = values[i][column-1]; på rad 13?

EDIT: Nej, det var jag som hade slarvat mig! Jag ber om ursäkt. Så här ska det se ut:

function findAndReplace(){ var replaceWith = "..." var sheetName = "foo"; var column = 1; var ss=SpreadsheetApp.getActiveSpreadsheet(); var numberOfSheets=ss.getNumSheets(); var sheet=ss.getSheetByName(sheetName); var selection=sheet.getRange(1,column,sheet.getMaxRows()); var rows=selection.getNumRows(); var values = selection.getValues(); for (var i = 0; i < rows; i++) { var s = values[i][0]; s = s.replace(/([a-zA-ZåÅäÄöÖ]+)(\.{2})([a-zA-ZåÅäÄöÖ!?]+)/, '$1'+replaceWith+'$3'); values[i][0] = s; } selection.setValues(values); }

Visa signatur

Intel Core i5 8600k @ 4.7 GHz - Gigabyte Aorus GTX 1080 TI - Asus PRIME Z370-A
- Corsair Vengeance LP 16 GB - EVGA Supernova G2 850W - NZXT H500i

Permalänk

nope det står -1

Permalänk

och det gör ingen skillnad om jag tar bort "!?"

Permalänk
Medlem
Skrivet av Rom Raptor:

och det gör ingen skillnad om jag tar bort "!?"

Se min edit, det var jag som hade slarvat och bara testat på den första kolumnen och missat att det gick sönder på alla andra

Visa signatur

Intel Core i5 8600k @ 4.7 GHz - Gigabyte Aorus GTX 1080 TI - Asus PRIME Z370-A
- Corsair Vengeance LP 16 GB - EVGA Supernova G2 850W - NZXT H500i

Permalänk

Nu ska allt vara i sin ordning. Tack återigen! Om du undrar vad du hjälpt mig att fixa så är det ett dialogskript från ett spel där vissa tecken hade lästs in fel, men jag upptäckte inte det förrän massa ändringar redan var gjorda.

Permalänk
Medlem
Skrivet av Rom Raptor:

Nu ska allt vara i sin ordning. Tack återigen! Om du undrar vad du hjälpt mig att fixa så är det ett dialogskript från ett spel där vissa tecken hade lästs in fel, men jag upptäckte inte det förrän massa ändringar redan var gjorda.

Inga problem, kul att kunna hjälpa till!

Visa signatur

Intel Core i5 8600k @ 4.7 GHz - Gigabyte Aorus GTX 1080 TI - Asus PRIME Z370-A
- Corsair Vengeance LP 16 GB - EVGA Supernova G2 850W - NZXT H500i