заполнить шаблон листа при выборе имени в раскрывающемся меню - PullRequest
0 голосов
/ 15 октября 2019

Я создал таблицу оценок в Google, но сейчас я ищу способ заполнить свой шаблонный отчет с оценками от одного ученика. Как мне этого добиться?

В файле 1 у меня есть все оценки студентов. В файле 2 у меня есть шаблон отчета об оценке. Как создать раскрывающееся меню в шаблонном отчете об оценке, в котором отображаются все учащиеся, и когда я нажимаю на одного из учащихся, автоматически заполняются все поля в отчете об оценке? Теперь я использую функцию importrange, чтобы импортировать данные из столбца в шаблон, но теперь мне нужен файл отчета об оценке для каждого учащегося. Это действительно было бы намного эффективнее, чем создание одного файла отчета по успеваемости для каждого учащегося.

Надеюсь, вы мне поможете.

Файл 1: https://docs.google.com/spreadsheets/d/12M8W7fARJJZN90wM79U4x8RmcnZ08kFSDcZYnB26HB0/copy

Файл 2: https://docs.google.com/spreadsheets/d/13-0qhCudC7EYRgOs2UpbJPRSq2nKoBiG2Md3-U8_U1Q/copy

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Вы можете использовать следующий код:

var LIST_WITH_GRADES_ID = 'YOUR_ID';
var LIST_WITH_GRADES_STUDENTS_A1 = 'Rapportoverzicht!B2:Y2';

function onOpenSpreadsheet(e) {
  var students = SpreadsheetApp.openById(LIST_WITH_GRADES_ID).getRange(LIST_WITH_GRADES_STUDENTS_A1).getValues()[0];
  var rangeRule = SpreadsheetApp.newDataValidation().requireValueInList(students).setAllowInvalid(false);
  SpreadsheetApp.getActive().getRange('Rapport!E1').setDataValidation(rangeRule);
}

function onEditSpreadsheet(e) {
  var rapportSheet = SpreadsheetApp.getActive().getSheetByName('Rapport');
  if (e.range.getA1Notation() == 'E1' && e.range.getSheet().getName() == 'Rapport') {
    var studentCol = findStudentCol(e.range.getValue());
    copyStudentGrades(studentCol);
  }
}

/* Returns 1-indexed student column */
function findStudentCol(student) {
  var sheet = SpreadsheetApp.openById(LIST_WITH_GRADES_ID);
  var studentsRange = SpreadsheetApp.openById(LIST_WITH_GRADES_ID).getRange(LIST_WITH_GRADES_STUDENTS_A1);
  for (var col=1; col<=studentsRange.getWidth(); col++) {
    if (studentsRange.getCell(1, col).getValue() == student) 
      return col + studentsRange.getColumn() - 1;
  }
}

function copyStudentGrades(studentCol) {
  var gradesSheet = SpreadsheetApp.openById(LIST_WITH_GRADES_ID).getSheetByName('Rapportoverzicht');
  var templateSheet = SpreadsheetApp.getActive().getSheetByName('Rapport');

  templateSheet.getRange(4, 4, 30, 1).setValues(
    gradesSheet.getRange(4, studentCol, 30, 1).getValues());

  templateSheet.getRange(4, 10, 25, 1).setValues(
    gradesSheet.getRange(36, studentCol, 25, 1).getValues());
}

Вам нужно будет поставить идентификатор своей оценочной ведомости в первой строке и добавить этот скрипт в редактор вашего "шаблона" листа. Вам также нужно будет установить onOpenSpreadsheet и onEditSpreadsheet как устанавливаемые триггеры, чтобы заставить его работать (см. управление триггерами вручную ).

Редактировать

Длячтобы использовать два разных файла оценок и импортировать замечания, вы можете использовать следующую правку предыдущего кода:

var LIST_WITH_GRADES_ID = 'YOUR_LIST_WITH_GRADES_1_ID';
var LIST_WITH_GRADES_2_ID = 'YOUR_LIST_WITH_GRADES_2_ID';
var LIST_WITH_GRADES_STUDENTS_A1 = 'Rapportoverzicht!B2:AG2';
var NSTUDENTS = 24; // Number of students

function onOpenSpreadsheet(e) {
  var students = SpreadsheetApp.openById(LIST_WITH_GRADES_ID).getRange(LIST_WITH_GRADES_STUDENTS_A1).getValues()[0];
  var rangeRule = SpreadsheetApp.newDataValidation().requireValueInList(students).setAllowInvalid(false);
  SpreadsheetApp.getActive().getRange('Rapport!E1').setDataValidation(rangeRule);
}

function onEditSpreadsheet(e) {
  var currentStudent = e.range.getValue();
  var rapportSheet = SpreadsheetApp.getActive().getSheetByName('Rapport');
  if (e.range.getA1Notation() == 'E1' && e.range.getSheet().getName() == 'Rapport') {
    var studentCol = findStudentCol(currentStudent);
    copyStudentGrades(studentCol);
    importRemarks(currentStudent);
  }
}

/* Returns 1-indexed student column */
function findStudentCol(student) {
  var sheet = SpreadsheetApp.openById(LIST_WITH_GRADES_ID);
  var studentsRange = SpreadsheetApp.openById(LIST_WITH_GRADES_ID).getRange(LIST_WITH_GRADES_STUDENTS_A1);
  for (var col=1; col<=studentsRange.getWidth(); col++) {
    if (studentsRange.getCell(1, col).getValue() == student) 
      return col + studentsRange.getColumn() - 1;
  }
}

function copyStudentGrades(studentCol) {
  var gradesSheet = SpreadsheetApp.openById(LIST_WITH_GRADES_ID).getSheetByName('Rapportoverzicht');
  var gradesSheet2 = SpreadsheetApp.openById(LIST_WITH_GRADES_2_ID).getSheetByName('Rapportoverzicht');
  var templateSheet = SpreadsheetApp.getActive().getSheetByName('Rapport');

  templateSheet.getRange(4, 4, 30, 1).setValues(
    gradesSheet.getRange(4, studentCol, 30, 1).getValues());

  templateSheet.getRange(4, 10, 25, 1).setValues(
    gradesSheet.getRange(36, studentCol, 25, 1).getValues());

  templateSheet.getRange(4, 6, 30, 1).setValues(
    gradesSheet2.getRange(4, studentCol, 30, 1).getValues());

  templateSheet.getRange(4, 12, 25, 1).setValues(
    gradesSheet2.getRange(36, studentCol, 25, 1).getValues());
}

function importRemarks(student) {
  var remarksSheet = SpreadsheetApp.openById(LIST_WITH_GRADES_ID).getSheetByName('opmerkingen rapport');
  var remarksSheet2 = SpreadsheetApp.openById(LIST_WITH_GRADES_2_ID).getSheetByName('opmerkingen rapport');
  var templateSheet = SpreadsheetApp.getActive().getSheetByName('Opmerkingen');
  var studentRow;

  for (var i=2; i<(2+NSTUDENTS); i++) {
    if (remarksSheet.getRange(i, 1).getValue() == student) {
      studentRow = i;
      break;
    }
  }

  templateSheet.getRange('B5').setValue(remarksSheet.getRange(studentRow, 2).getValue());
  templateSheet.getRange('B11').setValue(remarksSheet2.getRange(studentRow, 2).getValue());
}
0 голосов
/ 15 октября 2019

Я думаю, что это вряд ли сработает в первый раз. Я не смог скопировать ваши листы, поэтому я не смог проверить это вообще. Я писал такие вещи раньше, но обычно для того, чтобы все работало правильно, требуется некоторая настройка. Я также не уверен, что раздел onEdit () всегда будет завершен через 30 секунд, но я хочу дать ему шанс, но вам, возможно, придется перейти к выбору семестра, а затем к студенту и затем нажать кнопку.

Прочитайте комментарии:

//add this function to an installable onOpen Trigger
function onOpenFunc() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Rapport');
  var slss=SpreadsheetApp.openById("12M8W7fARJJZN90wM79U4x8RmcnZ08kFSDcZYnB26HB0");
  var slsh=slss.getSheetByName("Rapportoversicht");
  var namerg=slsh.getRange(2,1,1,slsh.getLastColumn());
  var cell=sh.getRange(1,2);
  cell.clearDataValidations();
  var rule1=SpreadsheetApp.newDataValidation()
  .setAllowInvalid(false)
  .requireValueInRange(namerg)
  .build();//gets student list into drop down
  cell.setDataValidation(rule1);
  var rule2=SpreadsheetApp.newDataValidation()
  .setAllowInvalid(false)
  .requireValueInList([1,2])
  .build();//Semester selection 1 or 2
  cell.offset(1,0).setDataValidation(rule2);
}

//This has to be an installable trigger
function onEditFunc(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!='Rapport')return;
  if(e.range.getColumn==5 && e.range.getRow()==1 && e.value && e.value!=e.oldValue ) {
    fillInStudentInformation(e.value,e.range.offset(1,0).getValue());  
  }
}

//I am not sure that this will always complete in 30 seconds so you may have to revert to clicking a button after selecting a semester and a student.
function fillinStudentInformation(student,semester) {
  var slss=SpreadsheetApp.openById("12M8W7fARJJZN90wM79U4x8RmcnZ08kFSDcZYnB26HB0");
  var slsh=slss.getSheetByName("Rapportoversicht");
  var hrg=slsh.getRange(2,2,1,slsh.getLastColumn()-1);
  var hA=nrg.getValues()[0];
  var hObj={};
  var lObj={};
  hA.forEach(function(name,i){hObj[name]=i+1;});//column number
  var grdRg=slsh.getRange(4,hObj[student],60,1);
  var lblRg=slsh.getRange(4,1,60,1);
  var grdA=grdRg.getValues();
  var lblA=lblRg.getValues();
  lblA.forEach(function(lbl,i){
    if(lbl && grdA[i]) {
      lObj[lbl]=grdA[i];//object converts from labels to grades
    }
  });
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Rapport');
  var rg1=sh.getRange(4,2,sh.getLastRow()-3,5);
  var vA=rg1.getValues();
  var rg2=sh.getRange(4,8,sh.getLastRow()-3,5);
  var vB=rg2.getValues();
  //left half
  for(var i=0;i<vA.length;i++) {
    if(vA[i][0] && lObj.hasOwnProperty(vA[i][0])) {
      switch(semester) {
        case 1:
          sh.getRange(i+4,4).setValue(lObj[vA[i][0]]);
          break;
        case 2:
          sh.getRange(i+4,6).setValue(lObj[vA[i][0]]);
          break;
      }

    }
  }
  //right half
  for(var i=0;i<vB.length;i++) {
    if(vB[i][0] && lObj.hasOwnProperty(vB[i][0])) {
      switch(semester) {
        case 1:
          sh.getRange(i+4,10).setValue(lObj[vB[i][0]]);
          break;
        case 2:
          sh.getRange(i+4,12).setValue(lObj[vB[i][0]]);
          break;
      }

    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...