2016-09-28 2 views
0

Dies ist mein erstes Mal hier. Ich habe vor 20 Jahren in Turbo Pascal und einigen Datenbank-Management programmiert, dann bin ich in die Med School gekommen.Variable kann nicht gesetzt werden

Ich verwalte eine Tabelle von Patienten, die von bestimmten Therapeuten gesehen werden müssen. Ich mache wöchentlich ein Blatt in Google Spreadsheets in Form eines Kalenders. Es gibt 16 Zeitspalten und 5 Gruppen von jeweils 6 Reihen für 5 Tage und 6 Therapeuten. Die Zellen enthalten die Namen der Patienten und werden anhand einer Liste von Namen validiert, die in der ersten Spalte unten aufgeführt sind. Die Tabelle selbst zählt, wie viele Sitzungen jeder Patient hat.

Der zweite Teil ist ein kleines Programm, das jeden Patienten durchläuft, dann jeden Tag, dann jede Stunde und dann jeder Therapeut. Wenn der Name des Patienten übereinstimmt, druckt er den Tag fett, dann die Zeit und dann den Therapeuten, mit dem er einen Termin hat.

Nach jeder Wiederholung wird mit der vorherigen Übereinstimmung verglichen: Wenn der Tag nicht übereinstimmt, wird ein neuer Tag fett gedruckt. Wenn es übereinstimmt, wird nur die Uhrzeit gedruckt. Es erhält den Tag (Name und Nummer) aus der letzten Spalte in der Tabelle, die das Datum für jeden Tag in ein lesbareres Format umwandelt.

Mein Problem ist: Wenn ein Patient am selben Tag wie der Patient vor dem Abschluss beginnt, passt die Variable und der Tag wird nicht geschrieben.

Ich habe versucht, mithilfe von var diaprevio="", den Wert der Variablen (diaprevio) zu ändern var diaprevio = 0, var diaprevio = diaprevio+diaprevio, var diaprevio = dia.getvalue()+1 und sogar delete diaprevio, aber es ändert sich nichts. Ich habe das Problem bestätigt ist diaprevio seinen Wert behalten, denn wenn das passiert, wenn ich den ehemaligen Patienten an einem anderen Tag hinzufügen, löst das Problem.

Der Code ist der folgende:

/* Funciones para generar horarios a partir del calendario 
Esta escanea las celdas de calendario de derecha a izquierda y arriba a abajo 
Para encontrar el texto coincidente y lo entrega en un documento de texto. 
*/ 

function TerapeutaHora() { 

    var activ = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = activ.getActiveSheet(); //Selecciona la hoja activa, no una hoja fija 
    var planning = sheet.getRange("A1:S36"); // Rango del calendario + la lista de días 
    var ListaPacientes = sheet.getRange("A45:A72"); // Rango de los pacientes activos 
    var dia=planning.getCell(1,1); 
    doc = DocumentApp.create("Horario"); // Crea un nuevo documento llamado Horario 
    var docu = doc.getBody() 

    //Primero hacemos que pase por los pacientes activos 

    for (var p=1; p < 29; p++) { 
    var pacientesource=ListaPacientes.getCell(p,1) 

    var par = docu.appendParagraph(pacientesource.getValue()) 
    par.setHeading(DocumentApp.ParagraphHeading.HEADING2) //Pone el nombre del paciente en HEADING 

    //Luego que pase por las filas y las columnas 
    for (var d = 0; d < 5; d++){ //cinco días 
     for (var b = 1; b < 18; b++){ //18 columnas de horario 
     for (var a = 3; a < 9; a++){ //Los 6 nombres 
      var columna = (d*7 +a) //Los 7 espacios entre un día y otro 
      var pacienteplanning=planning.getCell(columna, b) //Lee el paciente y lo compara con el que está eligiendo en este momento 
      var coincidencia = (pacienteplanning.getValue() === pacientesource.getValue()) 
      if (coincidencia) { //Si coinciden los nombres 
      var dia=planning.getCell(columna,18); 
      var terapeuta=planning.getCell(columna,1); 
      var hora=planning.getCell(1, b); 
      if (diaprevio != dia.getValue()) {var nombredia = doc.appendParagraph("\n" + dia.getValue()); nombredia.setHeading(DocumentApp.ParagraphHeading.HEADING3); } // Si el día no es el mismo al previo, lo pone en HEADING. 
      doc.getBody().appendParagraph(hora.getValue() + " " + terapeuta.getValue()) //Escribe el resultado en el documento 
      } 
     } 
     var diaprevio = dia.getValue() 
     }    
    } 
    var diaprevio = dia.getValue()+1; //THIS IS WHERE I TRY TO CHANGE THE VALUE OF THE VARIABLE 
    doc.getBody().appendPageBreak() //Salto de Página 
    } 
} 

ich Hilfe zur Lösung dieses Problems schätzen würde. Ich denke, es gibt etwas über variable Verwaltung in dieser Art von Skript, das ich immer noch nicht kenne.

Vielen Dank.

+0

Sie machen mehrere Variablendeklarationen derselben Variablen. Ich sehe, dass "diaprevio" mehrmals erklärt wird. Sie können eine Variable am Anfang der Funktion deklarieren und niemals das Schlüsselwort 'var' für denselben Variablennamen zweimal verwenden. Sie können eine Variable deklarieren, ohne ihr einen Wert zuzuweisen: 'var diaprevio;' Der Wert ist in diesem Beispiel 'undefiniert'. Sie können mehrere Variablen mit einem Schlüsselwort "var" deklarieren. 'var activ, coincidencia, dia, diaprevio, planung, sheet;' Sie könnten alle diese Variablen in der ersten Zeile deklarieren und niemals 'var' für irgendeinen von ihnen verwenden. –

Antwort

0

Ich habe Ihre Funktion bearbeitet, um alle var Schlüsselwörter aus den for-Schleifen zu extrahieren.

Versuchen Sie dies und sehen Sie, ob es funktioniert.

/* Funciones para generar horarios a partir del calendario 
Esta escanea las celdas de calendario de derecha a izquierda y arriba a abajo 
Para encontrar el texto coincidente y lo entrega en un documento de texto. 
*/ 

function TerapeutaHora() { 

    var activ = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = activ.getActiveSheet(); //Selecciona la hoja activa, no una hoja fija 
    var planning = sheet.getRange("A1:S36"); // Rango del calendario + la lista de días 
    var ListaPacientes = sheet.getRange("A45:A72"); // Rango de los pacientes activos 
    var dia=planning.getCell(1,1); 
    var doc = DocumentApp.create("Horario"); // Crea un nuevo documento llamado Horario 
    var docu = doc.getBody() 

//Primero hacemos que pase por los pacientes activos 
    var p, pacientesource, par, d, b, a, columna, pacientaplanning, coincidencia, dia, teraputa, hora, nmbredia; 

    for (p=1; p < 29; p++) { 
    pacientesource=ListaPacientes.getCell(p,1) 

    par = docu.appendParagraph(pacientesource.getValue()) 
    par.setHeading(DocumentApp.ParagraphHeading.HEADING2) //Pone el nombre del paciente en HEADING 

//Luego que pase por las filas y las columnas 
    for (d = 0; d < 5; d++){ //cinco días 
     for (b = 1; b < 18; b++){ //18 columnas de horario 
     for (a = 3; a < 9; a++){ //Los 6 nombres 
      columna = (d*7 +a) //Los 7 espacios entre un día y otro 
      pacienteplanning=planning.getCell(columna, b) //Lee el paciente y lo compara con el que está eligiendo en este momento 
      coincidencia = (pacienteplanning.getValue() === pacientesource.getValue()) 
      if (coincidencia) { //Si coinciden los nombres 
      dia=planning.getCell(columna,18); 
      terapeuta=planning.getCell(columna,1); 
      hora=planning.getCell(1, b); 
      if (diaprevio != dia.getValue()) { 
       nombredia = doc.appendParagraph("\n" + dia.getValue()); 
       nombredia.setHeading(DocumentApp.ParagraphHeading.HEADING3); 
      } // Si el día no es el mismo al previo, lo pone en HEADING. 
      doc.getBody().appendParagraph(hora.getValue() + " " + terapeuta.getValue()) //Escribe el resultado en el documento 
      } 
     } 
     diaprevio = dia.getValue() 
     }    
    } 
    diaprevio = dia.getValue()+1; //THIS IS WHERE I TRY TO CHANGE THE VALUE OF THE VARIABLE 
    doc.getBody().appendPageBreak() //Salto de Página 
    } 
} 
+0

Danke. Ich übertreibe diese Definition von Variablen wegen der Beispiele, die ich im Internet gelesen habe, um diese Skriptsprache zu lernen. Das letzte, was ich damit gemacht habe, war Turbo C und Turbo Pascal in den neunziger Jahren. Es funktioniert, leider passiert der Fehler weiterhin. Irgendwie akzeptiert _diaprevio_ keinen neuen Wert. Ich habe versucht, den Debugger zu arbeiten und der Variable zu folgen, aber es tut nicht. – mipial

+0

Ich meine, 'diaprevio' akzeptiert keinen neuen Wert außer' dia.getValue() '. Kann es mit der 'for'loop zu tun haben? Der Fehler taucht selten auf, da die meisten Patienten spät in der Woche enden und früh beginnen: Ich habe nach zwei Monaten das Skript mit einem Patienten gefunden, der an einem Mittwoch nach einem Patienten beginnt, der am selben Mittwoch beendet wurde. – mipial

+0

Ich denke, die 'for' Schleife hat etwas zu tun: Wenn ich' diaprevio = 1' direkt unter 'diaprevio = dia.getValue()' setze, bricht die Funktion zusammen und wiederholt den Tag in jedem Zeiteintrag (das Ergebnis ist Tag fett, mal für diesen Tag unten, nächster Tag wieder fett). ABER wenn ich 'diaprevio = 1' AUSSERHALB der' for (b = 1; b <18; b ++) 'Schleife setze, passiert nichts, auch wenn es innerhalb der' for (a ... 'Schleife ist, in diesem Fall der Ausgang sollte auch zusammenbrechen. – mipial

0

Vielen Dank für Ihre Hilfe. Ich fand die Variable, die zurückgesetzt werden musste, war nicht diaprevio, aber dia. diaprevio wurde mit der gleichen dia in jeder Iteration aktualisiert, so dass ich dia auf eine leere Zelle am Ende jedes Patienten zeigte.

Sie haben mir bei der Verwaltung von var geholfen. Vielen Dank.

+0

Ich schlage vor, dass Sie Ihren Arbeitscode posten und Ihre Antwort als richtig markieren. Sie können jemandem helfen, der ein ähnliches Problem hat wie Sie. – HardScale

Verwandte Themen