2016-08-05 38 views
0

Als ich einen Roman in meine Google Docs iPad App eintippte, verwendete er gerade auf und ab Anführungszeichen, wie folgt: "Jetzt möchte ich ändere alle diese Anführungszeichen in die geschweifte, ohne sie alle von Hand ändern zu müssenGoogle Apps Script --- Ersetzen Sie gerade Anführungszeichen durch geschweifte Klammern

Ich habe eine einfache Google Apps Script-Datei geschrieben, um das Problem zu beheben, aber wenn ich es ausführe, scheint es zu sagen "Running Funktion myFunction ... "unendlich.

Hier ist mein Code. Die ersten paar Zeilen beschäftigen sich mit Zitaten in der Mitte des Satzes, mit einer einfachen replaceText-Methode. Inzwischen testet die while-Anweisung, ob es einen Zeilenumbruch gibt (\ n) vor dem Zitat, und verwendet, um zu bestimmen, when um ein Anfangs- oder Endzitat zu setzen.

function myFunction() { 
    var body = DocumentApp.getActiveDocument().getBody(); 

    //Replace quotes that are not at beginning or end of paragraph 
    body.replaceText(' "', ' “'); 
    body.replaceText('" ', '” '); 

    var bodyString = body.getText(); 
    var x = bodyString.indexOf('"'); 
    var bodyText = body.editAsText(); 

    while (x != -1) { 
    var testForLineBreaks = bodyString.slice(x-2, x); 
    if (testForLineBreaks == '\n') { //testForLineBreaks determines whether it is the beginning of the paragraph 
     //Replace quotes at beginning of paragraph 
     bodyText.deleteText(x, x); 
     bodyText.insertText(x, '“'); 
    } else { 
     //Replace quotes at end of paragraph 
     bodyText.deleteText(x, x); 
     bodyText.insertText(x, '”'); 
    } 
    x = bodyString.indexOf('"'); 
    } 
} 

Ich kann nicht scheinen, zu finden, was mit ihm falsch ist. Und um die Dinge mehr zu verwirren, wenn ich auf den Debugger klicke, heißt es:

Zu viele Änderungen vor dem Speichern des Dokuments angewendet. Speichern Sie Änderungen in kleineren Batches mit Document.saveAndClose(), und öffnen Sie das Dokument mit Document.openById() erneut.

Ich schätze alle Hilfe mit diesem. Vielen Dank im Voraus!

Antwort

0

some1 war direkt über die Fehlermeldung, aber leider, die an die Wurzel des Problems nicht bekommen:

Am Ende meiner while-Schleife, die Variable bodyString wurde verwendet, um den Standort des Angebots m zu finden Archen zu ändern. Das Problem war, dass bodyString genau das war, eine Zeichenkette, und so musste ich jedes Mal, wenn ich das Dokument änderte, aktualisieren.

Ein anderes Problem, wenn auch einfacher, war, dass Google \ n als ein Zeichen zählt, also musste ich den Parameter in var testForLineBreaks = bodyString.slice(x-2, x); zu x-1, x ändern.

Nachdem mit diesen Fragen bastelten, sah mein fertiger Code wie folgt:

function myFunction() { 
    var body = DocumentApp.getActiveDocument().getBody(); 

    //Replace quotes that are not at beginning or end of paragraph 
    body.replaceText(' "', ' “'); 
    body.replaceText('" ', '” '); 

    var bodyString = body.getText(); 
    var x = bodyString.indexOf('"'); 
    var bodyText = body.editAsText(); 

    while (x != -1) { 
    var testForLineBreaks = bodyString.slice(x-1, x); 

    if (testForLineBreaks == '\n') { //testForLineBreaks determines whether it is the beginning of the paragraph 
     //Replace quotes at beginning of paragraph 
     bodyText.deleteText(x, x); 
     bodyText.insertText(x, '“'); 
    } else { 
     //Replace quotes at end of paragraph 
     bodyText.deleteText(x, x); 
     bodyText.insertText(x, '”'); 
    } 

    body = DocumentApp.getActiveDocument().getBody(); 
    bodyString = body.getText(); 
    x = bodyString.indexOf('"'); 
    bodyText = body.editAsText(); 
    } 
} 

mit dem Code gibt ein verbleibendes Problem ist. Wenn das Anführungszeichen ganz am Anfang des Dokuments steht, wie im ersten Zeichen, fügt das Skript den falschen Anführungsstil ein. Ich habe jedoch vor, das manuell zu beheben.

1

Ich bin mir nicht sicher über die genaue Grenze, aber ich denke, Sie können einen Zähler in Ihre While-Schleife einfügen, und für jede 50 oder 100, Ausgabe über Logger.log(); wenn Sie halten, dass Grenzzählwerts erhalten, können Sie das tun, was vorgeschlagen wird

das heißt, wenn die Grenze nähert, bündig/speichern Sie die Änderungen Document.saveAndClose unter der Rufnummer(), dann wieder von vorne anfangen mit der Hauptschleife durch Wiedereröffnung das Dokument mit Document.openById()