选择下拉菜单中的名称时填写模板 sheet
fill out template sheet when a name in a dropdown menu is selected
我已经创建了一个成绩报告 Google spreadsheet,但现在我正在寻找一种方法来用一个学生的成绩填写我的模板报告 sheet。我怎样才能做到这一点?
在文件 1 中,我有所有学生的成绩。在文件 2 中,我有成绩报告的模板。如何在显示所有学生的成绩报告模板中创建一个下拉菜单,当我单击其中一名学生时会自动填写成绩报告中的所有字段?
我现在使用 importrange 函数将列中的数据导入模板,但现在我需要每个学生的成绩报告文件。
这真的比为每个学生创建一个成绩报告文件更有效率。
希望你能帮帮我。
文件 1:
https://docs.google.com/spreadsheets/d/12M8W7fARJJZN90wM79U4x8RmcnZ08kFSDcZYnB26HB0/copy
文件 2:
https://docs.google.com/spreadsheets/d/13-0qhCudC7EYRgOs2UpbJPRSq2nKoBiG2Md3-U8_U1Q/copy
我认为这不太可能第一次起作用。我无法复制你的表格,所以我根本无法测试它。我以前写过这样的东西,但通常需要进行一些调整才能使其正常工作。我也不相信 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;
}
}
}
}
您可以使用以下代码:
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());
}
您必须将您的成绩 sheet 的 ID 放在第一行,并将此脚本添加到您的 "template" sheet 的编辑器中。您还需要将 onOpenSpreadsheet
和 onEditSpreadsheet
设置为可安装的触发器以使其工作(参见 managing triggers manually)。
编辑
为了使用两个不同的成绩文件并同时导入备注,您可以对之前的代码进行以下编辑:
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());
}
我已经创建了一个成绩报告 Google spreadsheet,但现在我正在寻找一种方法来用一个学生的成绩填写我的模板报告 sheet。我怎样才能做到这一点?
在文件 1 中,我有所有学生的成绩。在文件 2 中,我有成绩报告的模板。如何在显示所有学生的成绩报告模板中创建一个下拉菜单,当我单击其中一名学生时会自动填写成绩报告中的所有字段? 我现在使用 importrange 函数将列中的数据导入模板,但现在我需要每个学生的成绩报告文件。 这真的比为每个学生创建一个成绩报告文件更有效率。
希望你能帮帮我。
文件 1: https://docs.google.com/spreadsheets/d/12M8W7fARJJZN90wM79U4x8RmcnZ08kFSDcZYnB26HB0/copy
文件 2: https://docs.google.com/spreadsheets/d/13-0qhCudC7EYRgOs2UpbJPRSq2nKoBiG2Md3-U8_U1Q/copy
我认为这不太可能第一次起作用。我无法复制你的表格,所以我根本无法测试它。我以前写过这样的东西,但通常需要进行一些调整才能使其正常工作。我也不相信 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;
}
}
}
}
您可以使用以下代码:
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());
}
您必须将您的成绩 sheet 的 ID 放在第一行,并将此脚本添加到您的 "template" sheet 的编辑器中。您还需要将 onOpenSpreadsheet
和 onEditSpreadsheet
设置为可安装的触发器以使其工作(参见 managing triggers manually)。
编辑
为了使用两个不同的成绩文件并同时导入备注,您可以对之前的代码进行以下编辑:
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());
}