2016-09-28 3 views
0

Это мой первый раз здесь. Раньше я программировал 20 лет назад в Turbo Pascal и некоторых управления базой данных, затем я попал в Med School.Переменная не может быть установлена ​​

Я управляю таблицей пациентов, которую должны видеть определенные терапевты. Я делаю один лист еженедельно в Google Spreadsheets, сформированный как календарь. Есть 16 временных столбцов и 5 групп по 6 рядов каждый, в течение 5 дней и 6 терапевтов, соответственно. Клетки хранят имена пациентов и подтверждаются списком имен, которые заполняются ниже в первом столбце. Сама таблица подсчитывает, сколько сеансов у каждого пациента.

Вторая часть - небольшая программа, которая проходит через каждого пациента, затем каждый день, затем каждый час, а затем каждый терапевт. Если имя пациента совпадает, оно печатает день жирным шрифтом, затем время, а затем терапевт, с которым он назначается.

После каждой итерации он сравнивается с предыдущим совпадением: если день не совпадает, он будет печатать новый день полужирным шрифтом. Если он совпадает, он будет печатать только время. Он получает день (имя и номер) из последнего столбца в электронной таблице, который превращает дату для каждого дня в более разборчивый формат.

Моя проблема: всякий раз, когда пациент начинает работать в тот же день, что и пациент, до конца, переменная совпадает и день не записывается.

Я попытался изменить значение переменной (diaprevio) с помощью var diaprevio="", var diaprevio = 0, var diaprevio = diaprevio+diaprevio, var diaprevio = dia.getvalue()+1 и даже delete diaprevio, но ничего не меняется. Я подтвердил, что проблема diaprevio сохраняет свою ценность, потому что всякий раз, когда это происходит, если я добавляю бывшего пациента в другой день, проблема решена.

Код следующее:

/* 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 
    } 
} 

Я был бы признателен за любую помощь в решении этой проблемы. Я думаю, что есть что-то об управлении переменными в этом сценарии, который я до сих пор не знаю.

спасибо.

+0

Вы делаете несколько объявлений переменных одной и той же переменной. Я вижу, что 'diaprevio' объявляется несколько раз. Вы можете объявить переменную в верхней части функции и никогда не использовать ключевое слово 'var' дважды для одного и того же имени переменной. Вы можете объявить переменную без присвоения ей значения: 'var diaprevio;' В этом примере значение будет 'undefined'. Вы можете объявить несколько переменных одним ключевым словом 'var'. 'var activ, совпадение, dia, diaprevio, планирование, лист;' Вы можете объявить все эти переменные в первой строке и никогда не использовать 'var' снова для любого из них. –

ответ

0

Я отредактировал вашу функцию, чтобы извлечь все ключевые слова var из циклов for.

Попробуйте это и посмотрите, работает ли оно.

/* 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

Спасибо. Я переопределил это определение переменных из-за примеров, которые я прочитал в Интернете, чтобы изучить этот язык скриптов. Последнее, что я сделал с этим, было в Turbo C и Turbo Pascal в девяностые годы. Работает, к сожалению, ошибка продолжает происходить. Как-то _diaprevio_ не принимает новое значение. Я попытался заставить отладчик работать и следовать за переменной, но это не так. – mipial

+0

Я имею в виду, 'diaprevio' не принимает новое значение, отличное от' dia.getValue() '. Может ли это иметь дело с 'for'loop? Ошибка появляется редко, учитывая, что большинство пациентов заканчиваются в конце недели и начинаются рано: я нашел это через два месяца, используя сценарий с пациентом, который начинается в среду после того, как пациент закончил в ту же среду. – mipial

+0

Я думаю, что цикл 'for' должен что-то делать: если я устанавливаю' diaprevio = 1' чуть ниже 'diaprevio = dia.getValue()', функция разбивается и повторяет день в каждой записи времени (результат - день жирным шрифтом, раз на тот день внизу, на следующий день жирным шрифтом). НО, если я устанавливаю 'diaprevio = 1' OUTSIDE цикла' for (b = 1; b <18; b ++), ничего не происходит, даже если он находится внутри цикла for (a ... ', и в этом случае вывод должен также сломаться. – mipial

0

Большое спасибо за помощь. Я обнаружил, что переменная, которую нужно было сбросить, не была diaprevio, но dia. diaprevio постоянно обновлялся с тем же dia на каждой итерации, поэтому я указал dia на пустую ячейку в конце каждого пациента.

Вы помогли мне с руководством var. Благодарю.

+0

Я предлагаю вам опубликовать свой рабочий код и правильно пометить свой ответ. Вы можете помочь кому-то, у кого есть проблема, подобная вашей. – HardScale

Смежные вопросы